首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python:将uint16_t数组转换为字符串(来自RS-485上的Arduino )

Python:将uint16_t数组转换为字符串(来自RS-485上的Arduino )
EN

Stack Overflow用户
提问于 2018-01-21 04:38:48
回答 1查看 2.7K关注 0票数 1

我正在尝试通过modbus rtu发送json (我知道,这是对modbus的非常糟糕的使用)。

我的模式类似于:

我已经连接Arduino USB到PC作为COM5和RS485转换器连接到USBRS485到PC作为COM4。

如果我使用QModBus应用程序从Arduino读取数据,我会看到很多字节(COM4)。

对于控制:当我从QModBus发送“读取保持寄存器"Arduino串行监视器上的”Arduino usb端口“(COM5)打印有效字符串。所以我的意思是modbus字节是可以的:

这是我的Arduino代码:

代码语言:javascript
运行
复制
#include <ArduinoJson.h>
#include <ModbusRtu.h>
#define ID   1

// assign the Arduino pin that must be connected to RE-DE RS485 transceiver
#define TXEN  2 

Modbus slave(ID, 0, TXEN); // this is slave ID and RS-232 or USB-FTDI

// data array for modbus network sharing
uint16_t au16data[100];

boolean state;
String json = "{\"idx\":1430,\"nvalue\":0,\"svalue\":\"-58.00\"}";

void setup() {
  slave.begin( 9600 );
  StaticJsonBuffer<200> jsonBuffer;  
  JsonObject& root = jsonBuffer.parseObject(json); 
}

void loop() {
  // https://github.com/smarmengol/Modbus-Master-Slave-for-Arduino/blob/master/ModbusRtu.h#L1391
  byte x = 0;
  for (byte i = 0; i < json.length(); i += 2) {
    uint16_t temp;
    temp = word(
      json[i],
      json[i+1]);  
    au16data[x] = temp;
    x++;
  }

  state = slave.poll( au16data, 100 );  
} 

但我不知道如何将这些字节转换回python中的json字符串。我的代码:

代码语言:javascript
运行
复制
import serial
import minimalmodbus

MODBUS_3  = 3  # Read holding registers

dev1 = minimalmodbus.Instrument('COM4', 1)  # port name, slave address (in decimal)
dev1.serial.baudrate = 9600
dev1.serial.bytesize = 8
dev1.serial.stopbits = 1
dev1.serial.parity = serial.PARITY_NONE
dev1.debug = False

data = dev1.read_registers(0, 20, MODBUS_3)
print(data)

代码打印与QModBus相同的值:

代码语言:javascript
运行
复制
[31522, 26980, 30754, 14897, 13363, 12332, 8814, 30305, 27765, 25890, 14896, 11298, 29558, 24940, 30053, 8762, 8749, 13624, 11824, 12322]

你能帮帮忙吗?我怎样才能将这些数字转换成json字符串,就像你在arduino串行监视器中看到的那样?

以及如何将python字符串转换为"uint_16t“以便通过modbus发送。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-21 10:29:35

这应该是可行的:

代码语言:javascript
运行
复制
import struct
dataStr = b''
for uint_16t in data:
    dataStr += struct.pack('>I', uint_16t)
print dataStr

基于您提供的列表的输出:

代码语言:javascript
运行
复制
  {"idx":1430,"nvalue":0,"svalue":"-58.00"

不确定为什么它错过了结束语}但是...

编辑:要删除那个奇怪的空格,您可以这样做:

代码语言:javascript
运行
复制
for i in dataStr:
    if ord(i) != 0:
        newDataStr += i
print newDataStr
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48360851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档