Python: преобразовать массив uint16_t в строку (из Arduino через RS-485)

Я пытаюсь отправить JSON через Modbus RTU (я знаю, это очень плохо использовать Modbus.)

Моя схема похожа на: введите описание изображения здесь

Я подключил Arduino USB к ПК в качестве COM5 и конвертер RS485 подключил к USB-RS485 к ПК как COM4.

введите описание изображения здесь

Если я буду читать данные из Arduino с помощью приложения QModBus, я увижу много байтов (COM4).

Для контроля: после того, как я отправлю из QModBus "считывать регистры хранения" последовательный монитор Arduino на "USB-порт Arduino" (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 );  
} 

Но я не знаю, как преобразовать эти байты обратно в строку JSON в Python. Мой код:

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.

Спасибо!

1 ответ

Решение

Это должно работать:

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
Другие вопросы по тегам