Python:将 uint16_t 的数组转换为字符串(从 Arduino 通过 RS-485)
Python: convert array of uint16_t to string (from Arduino over RS-485)
我正在尝试通过 modbus rtu 发送 json(我知道,modbus 的使用非常糟糕。)
我的架构类似于:
我已将 Arduino USB 作为 COM5 连接到 PC,并将 RS485 转换器连接到 USB-RS485 作为 COM4 连接到 PC。
如果我使用 QModBus 应用程序从 Arduino 读取数据,我会看到很多
字节数(COM4)。
对于控制:在我从 QModBus "read holding registers" Arduino 串行监视器发送到 "Arduino usb port" (COM5) 后打印有效字符串。所以我的意思是 modbus 字节没问题:
这是我的Arduino代码:
#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 字符串。我的代码:
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 相同的值:
[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 发送。
谢谢!
这应该有效:
import struct
dataStr = b''
for uint_16t in data:
dataStr += struct.pack('>I', uint_16t)
print dataStr
根据您提供的列表输出:
{"idx":1430,"nvalue":0,"svalue":"-58.00"
不知道为什么它缺少结束}虽然...
编辑:要删除那个奇怪的空格,您可以这样做:
for i in dataStr:
if ord(i) != 0:
newDataStr += i
print newDataStr
我正在尝试通过 modbus rtu 发送 json(我知道,modbus 的使用非常糟糕。)
我的架构类似于:
我已将 Arduino USB 作为 COM5 连接到 PC,并将 RS485 转换器连接到 USB-RS485 作为 COM4 连接到 PC。
如果我使用 QModBus 应用程序从 Arduino 读取数据,我会看到很多 字节数(COM4)。
对于控制:在我从 QModBus "read holding registers" Arduino 串行监视器发送到 "Arduino usb port" (COM5) 后打印有效字符串。所以我的意思是 modbus 字节没问题:
这是我的Arduino代码:
#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 字符串。我的代码:
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 相同的值:
[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 发送。
谢谢!
这应该有效:
import struct
dataStr = b''
for uint_16t in data:
dataStr += struct.pack('>I', uint_16t)
print dataStr
根据您提供的列表输出:
{"idx":1430,"nvalue":0,"svalue":"-58.00"
不知道为什么它缺少结束}虽然...
编辑:要删除那个奇怪的空格,您可以这样做:
for i in dataStr:
if ord(i) != 0:
newDataStr += i
print newDataStr