Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 10, 2020 08:43:38

Roman126
Зарегистрирован: 2020-04-10
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Декодирование в hex и ascii

Добрый день!
Получаю с весов по 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)

Программирование не силён.
Приложил документацию по весам.

Прикреплённый файлы:
attachment TechManual.pdf (557,1 KБ)

Офлайн

#2 Апрель 10, 2020 20:41:14

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Декодирование в hex и ascii

Ну и где в вашем коде вы применяете decode?
Какие ошибки при этом?
Почему вы думаете что это текстовые данные а не числовые?



Офлайн

#3 Апрель 10, 2020 23:50:04

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9998
Репутация: +  857  -
Профиль   Отправить e-mail  

Декодирование в hex и ascii

Roman126
Получаю с весов по com порту RS232 данные
Их надо раскодировать в числа, используя модуль struct. К весам должно быть руководство, в котором передаваемые данные должны поясняться. Обычно это числа, которые являются кодами, означающими уже что-то конкретное. Метод decode() используется для текста, когда текст был куда-то сохранён в числовом виде, а потом его обратно читают.



Отредактировано py.user.next (Апрель 10, 2020 23:55:30)

Офлайн

#4 Апрель 13, 2020 11:30:38

Roman126
Зарегистрирован: 2020-04-10
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Декодирование в hex и ascii

Только типы данных не описаны, а для модуля 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

Офлайн

#5 Апрель 13, 2020 22:18:45

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9998
Репутация: +  857  -
Профиль   Отправить e-mail  

Декодирование в hex и ascii

Roman126
Только типы данных не описаны
byte и word - типы данных.

Roman126
byte Header 0xF8 заголовочная последовательность
byte - тип данных. Длина равна 1 байту.
Header - имя данных. Имя переводится как “Заголовок”.
0xF8 - значение данных. Передаётся байт F8 в шестнадцатеричной системе.
заголовочная последовательность - комментарий к полю. Комментарий - это просто пояснение к полю данных в произвольной форме.

В результате для этой одной строки передаётся только байт F8. Всё остальное - это информация про него (как он называется, что он значит, какая там длина и так далее).

Roman126
а для модуля struct они необходимы
python.org. struct. types
Тебе нужен unsigned char для byte и unsigned short для word.

Эндианство используй big-endian (это стандарт для сетей). Если не прокатит, переключишь на little-endian.



Отредактировано py.user.next (Апрель 13, 2020 22:23:18)

Офлайн

#6 Апрель 14, 2020 11:18:36

Roman126
Зарегистрирован: 2020-04-10
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Декодирование в hex и ascii

По попробовала, выдала ошибку 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) 

Офлайн

#7 Апрель 14, 2020 16:19:37

Roman126
Зарегистрирован: 2020-04-10
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Декодирование в hex и ascii

 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)

результат;

b'\xf8U\xce:\x00\x02\x08\x01\x00\x01\x002\x00\x8b\xde\x04\x00,\x00\x00\x00\x14\x04\x0e\x0f!/\x8b\xde\x04\x00(\x00\x97t\x02\x00\x11\x00\x00\x00\x97\x03\x00\x00d\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x07'
(22008, 15054, 0, 2, 8, 1, 0, 1, 12800, 35584, 222, 4, 11264, 0, 0, 0, 20, 4, 14, -3.372864454850415e-32, 222, 4, 10240, 0, 29847, 2, 0, 17, 0, 0, 0, 151, 3, 0, 25600, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 7)

Код PLU 17 есть проверил. есть
А вот с весом я поторопился, как его расшифровать не знаю. Он должен быть 0,612 кг.

Офлайн

#8 Апрель 15, 2020 00:20:38

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9998
Репутация: +  857  -
Профиль   Отправить e-mail  

Декодирование в hex и ascii

Roman126
 data1=struct.unpack("<HHBBBBBBHHBBHBBBBBBfBBHBHBBBBBBBBBHBBBBBBBBBBBBBBBBBBB", data)
Roman126
результат;

b'\xf8U\xce:\x00\x02

Roman126
Структура сообщения:
byte Header 0xF8 заголовочная последовательность
byte Header 0x55 заголовочная последовательность
byte Header 0xCE заголовочная последовательность


Ну, выдаёт он заголовки однобайтовые. 0xf8 0x55 0xce, а ты читаешь word word. Ты должен прочитать byte byte byte потом word потом byte byte и так далее.

Roman126
А вот с весом я поторопился
Да ты даже заголовок сообщения неправильно раскодировал. До внутренних данных сообщения ты даже не дошёл.

В общем случае вся эта полученная непрерывная последовательность байт является слитыми воедино несколькими сообщениями, каждое из которых структурировано и состоит из заголовков этого сообщения и тела этого сообщения. Поэтому сначала ты должен разделить сообщения на последовательность сообщений. Затем каждое отдельное сообщение нужно разделить на заголовки этого сообщения и тело этого сообщения. И только потом, отделив заголовки от тела, ты можешь из тела сообщения выделять данные, которые тебе передают.

А тело сообщения тоже бывает составным во многих протоколах, поэтому в таких случаях и тело ещё надо разделять на куски, где у каждого куска есть свои заголовки и своё тело. Я с этим сталкивался, когда пытался клиент для ICQ свой сделать давным давно. Там тоже передавалась одна непрерывная последовательность байт, из которой нужно было сначала построить целое дерево из узлов, потому что сообщение представляло из себя контейнер с другими сообщениями, которые тоже контейнерами были для данных, шедших блоками друг за другом, и эти блоки тоже имели заголовки простенькие, поэтому их тоже надо было раскладывать, но хотя бы не так муторно, как основные структуры.

То же самое из себя представляют всякие видеофайлы и аудиофайлы - это просто непрерывная последовательность байт, которая раскладывается на такие структуры структур.



Отредактировано py.user.next (Апрель 15, 2020 00:24:39)

Офлайн

#9 Апрель 15, 2020 00:57:38

Roman126
Зарегистрирован: 2020-04-10
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Декодирование в hex и ascii

Я так читал потому что Пайтон ругался на количество байт xf8U тут буква U. И я не знаю что с этим делать? Далее xf8U\xce: двоеточие, снова не порядок.

Офлайн

#10 Апрель 15, 2020 01:28:44

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9998
Репутация: +  857  -
Профиль   Отправить e-mail  

Декодирование в hex и ascii

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@'
>>>

Это обычные байты. Просто в питоне байты, у которых есть графическое представление, отображаются в виде своего представления. А байты, у которых нет графического представления, отображаются в 16-ричном виде.



Отредактировано py.user.next (Апрель 15, 2020 01:37:30)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version