Форум сайта python.su
Добрый день!
Получаю с весов по com порту RS232 данные b'\xf8U\xce:\x00\x02\x08\x01\x00\x01\x002\x00\xd9\xdd\x04\x00,\x00\x00\x00\x14\x04\t\x101\x02\xd9\xdd\x04\x00(\x00\x97t\x02\x00\x02\x00\x00\x00\xf6$\x00\x00\n\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\\\xc5'
Не получается декодировать decode(encoding = ‘ascii’,errors = ‘ignore’)
В документации написано:
Данные могут быть числовые и текстовые. Используемые форматы данных:
НЕХ – числовые данные в двоичной кодировке (шестнадцатиричные числа).
ASCII – текстовые данные.
Вот сам код чтения com порта
import time
import serial
ser = serial.Serial(
port='COM7',
baudrate=57600,
timeout=0.1,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS
)
ser.isOpen()
while 1 :
bytesToRead = ser.inWaiting()
data = ser.read(bytesToRead)
time.sleep(0.1)
print(data)
Программирование не силён.
Приложил документацию по весам.
Прикреплённый файлы: TechManual.pdf (557,1 KБ)
Офлайн
Ну и где в вашем коде вы применяете decode?
Какие ошибки при этом?
Почему вы думаете что это текстовые данные а не числовые?
Офлайн
Roman126Их надо раскодировать в числа, используя модуль struct. К весам должно быть руководство, в котором передаваемые данные должны поясняться. Обычно это числа, которые являются кодами, означающими уже что-то конкретное. Метод decode() используется для текста, когда текст был куда-то сохранён в числовом виде, а потом его обратно читают.
Получаю с весов по com порту RS232 данные
Отредактировано py.user.next (Апрель 10, 2020 23:55:30)
Офлайн
Только типы данных не описаны, а для модуля struct они необходимы для раскодирования.
Вот что в документации
Канал связи: UDP или RS232
Направление: весы -> программа.
Весы в режиме on-line посылают в сеть запись (часть файла).
Структура сообщения:
byte Header 0xF8 заголовочная последовательность
byte Header 0x55 заголовочная последовательность
byte Header 0xCE заголовочная последовательность
word Len 0x0XXX длина тела сообщения = (Длина записи + 8)
byte Code 0x02 CMD_UDP_DFILE
byte FileType 0xXX Тип файла (см. Таблицу «Типы файлов»)
word Nums 0xXXXX Число записей в файле
word CurNum 0xXXXX Номер текущей записи
word Len 0x0XXX Длина записи (не более 1024 байт)
byte Data N-byte Данные word CRC 0xXXXX CRC
Офлайн
Roman126byte и word - типы данных.
Только типы данных не описаны
Roman126byte - тип данных. Длина равна 1 байту.byte Header 0xF8 заголовочная последовательность
Roman126python.org. struct. types
а для модуля struct они необходимы
Отредактировано py.user.next (Апрель 13, 2020 22:23:18)
Офлайн
По попробовала, выдала ошибку unpack requires a buffer of 16 bytes.
А вот если по 1 байту читать, то там можно увидеть PLU(код продукции) и видно цифру в граммах если взвешиваешь меньше килограмма, а вот если больше килограммы то цифра не та, граммы не соответствую. Да и самой целой части дроби нет.
import time import serial import chardet import struct ser = serial.Serial( port='COM7', baudrate=57600, timeout=0.1, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS ) ser.isOpen() a=0 while 1 : #bytesToRead = ser.inWaiting() #data = ser.read(bytesToRead) data=ser.readline(1) time.sleep(0.1) ex=len(data) if ex>0: print(data) data1=struct.unpack(">B", data) #data1=struct.unpack(">BBBHBBHHHBH", data) a=a+1 # номерация строк print (u'Номер строки',a,u'результат',data1)
Офлайн
import time import serial import chardet import struct ser = serial.Serial( port='COM7', baudrate=57600, timeout=0.1, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS ) ser.isOpen() a=0 while 1 : bytesToRead = ser.inWaiting() data = ser.read(bytesToRead) #data=ser.readline(1) time.sleep(0.1) ex=len(data) if ex>0: print(data) #data1=struct.unpack(">B", data) data1=struct.unpack("<HHBBBBBBHHBBHBBBBBBfBBHBHBBBBBBBBBHBBBBBBBBBBBBBBBBBBB", data) print(data1)
Офлайн
Roman126data1=struct.unpack("<HHBBBBBBHHBBHBBBBBBfBBHBHBBBBBBBBBHBBBBBBBBBBBBBBBBBBB", data)
Roman126
результат;b'\xf8U\xce:\x00\x02
Roman126
Структура сообщения:
byte Header 0xF8 заголовочная последовательность
byte Header 0x55 заголовочная последовательность
byte Header 0xCE заголовочная последовательность
…
Roman126Да ты даже заголовок сообщения неправильно раскодировал. До внутренних данных сообщения ты даже не дошёл.
А вот с весом я поторопился
Отредактировано py.user.next (Апрель 15, 2020 00:24:39)
Офлайн
Я так читал потому что Пайтон ругался на количество байт xf8U тут буква U. И я не знаю что с этим делать? Далее xf8U\xce: двоеточие, снова не порядок.
Офлайн
Roman126
Я так читал потому что Пайтон ругался на количество байт xf8U тут буква U. И я не знаю что с этим делать? Далее xf8U\xce: двоеточие, снова не порядок.
>>> b'\x55' b'U' >>> b'U'[0] 85 >>> hex(b'U'[0]) '0x55' >>> >>> hex(b':'[0]) '0x3a' >>> >>> b'\x3a' b':' >>> >>> b'\x55\xf8\xf8\x55\x3a\xf8\x40' b'U\xf8\xf8U:\xf8@' >>>
Отредактировано py.user.next (Апрель 15, 2020 01:37:30)
Офлайн