Преобразование ASCII в Hex в последовательном диалоге RS232 в Python и Hyperterminal

Я выполняю передачу данных с прибора через последовательный диалог RS232 с использованием Python. Данные приходят в формате ASCII. Например, это то, что я получаю в ASCII от инструмента, использующего Python:

'\x02S20390908127F010102F3004000900300000000000000000000000000000300A500000000000202020202020206070505050505050000000707070707070707020700000000000000000000000000000000000000008000800089237A0715047E000000000000000000000000000000000000000000000000000000000000000000000000005350374646303030\x1732'

Та же самая передача данных с использованием Hyperterminal (Docklight) дала мне это, и следующее шестнадцатеричное представление, которое я получил в гипертерминале:

02 53 31 38 33 38 30 39 30 38 31 32 37 46 30 31 30 31 30 32 46 33 30 30 34 30 30 30 39 30 30 33 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 33 30 30 41 35 30 30 30 30 30 30 30 30 30 30 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 36 30 37 30 35 30 35 30 35 30 35 30 35 30 35 30 30 30 30 30 30 30 37 30 37 30 37 30 37 30 37 30 37 30 37 30 37 30 32 30 37 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 38 30 30 30 38 30 30 30 38 39 32 33 37 41 30 37 31 35 30 34 37 45 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 35 33 35 30 33 37 34 36 34 36 33 30 33 30 33 30 17 33 38 

Мой вопрос заключается в том, как мне, используя Python, получить такое же шестнадцатеричное представление из полученных данных ascii. Я очень нуб, когда дело доходит до такого рода вещей. Заранее спасибо.


person Aasam Tasaddaq    schedule 10.08.2012    source источник
comment
Две строки в кавычках должны представлять один и тот же сигнал или просто похожие?   -  person DSM    schedule 10.08.2012
comment
Они должны быть одинаковыми. Я также проверил данные в формате ascii в гипертерминале дока, и это то же самое.   -  person Aasam Tasaddaq    schedule 10.08.2012
comment
Но я не могу заставить их совпадать. Я нахожу четыре отличия: мой начинается 02 53 32 30 33 39, тогда как ваш начинается 02 53 31 38 33 38, мой заканчивается на 32, а ваш заканчивается 38. Поскольку различаются только четыре термина, трудно понять, в чем может быть ошибка.   -  person DSM    schedule 10.08.2012


Ответы (2)


Объяснение: преобразовать каждый символ в байт, используя ord, затем отформатировать как двузначное шестнадцатеричное число и передать его в список. Затем присоединитесь к списку, используя пробел в качестве разделителя.

>>> ll = ["%02X" % (ord(x)) for x in '\x02S20390908127F010102F3004000900300000000000000000000000000000300A500000000000202020202020206070505050505050000000707070707070707020700000000000000000000000000000000000000008000800089237A0715047E000000000000000000000000000000000000000000000000000000000000000000000000005350374646303030\x1732']
>>> ll           #as a list
['02', '53', '32', '30', '33', '39', '30', '39', '30', '38', '31', '32', '37', '46', '30', '31', '30', '31', '30', '32', '46', '33', '30', '30', '34', '30', '30', '30', '39', '30', '30', '33', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '33', '30', '30', '41', '35', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '32', '30', '32', '30', '32', '30', '32', '30', '32', '30', '32', '30', '32', '30', '36', '30', '37', '30', '35', '30', '35', '30', '35', '30', '35', '30', '35', '30', '35', '30', '30', '30', '30', '30', '30', '30', '37', '30', '37', '30', '37', '30', '37', '30', '37', '30', '37', '30', '37', '30', '37', '30', '32', '30', '37', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '38', '30', '30', '30', '38', '30', '30', '30', '38', '39', '32', '33', '37', '41', '30', '37', '31', '35', '30', '34', '37', '45', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '30', '35', '33', '35', '30', '33', '37', '34', '36', '34', '36', '33', '30', '33', '30', '33', '30', '17', '33', '32']
>>> ' '.join(ll) # as a string
'02 53 32 30 33 39 30 39 30 38 31 32 37 46 30 31 30 31 30 32 46 33 30 30 34 30 30 30 39 30 30 33 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 33 30 30 41 35 30 30 30 30 30 30 30 30 30 30 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 36 30 37 30 35 30 35 30 35 30 35 30 35 30 35 30 30 30 30 30 30 30 37 30 37 30 37 30 37 30 37 30 37 30 37 30 37 30 32 30 37 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 38 30 30 30 38 30 30 30 38 39 32 33 37 41 30 37 31 35 30 34 37 45 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 35 33 35 30 33 37 34 36 34 36 33 30 33 30 33 30 17 33 32'
person Maria Zverina    schedule 10.08.2012
comment
Спасибо за ваш ответ, но не могли бы вы объяснить, что это делает? Я предполагаю, что вы конвертируете каждый символ в его порядковый номер, но как это получить нужный мне формат. Как мне получить отсюда шестнадцатеричное представление. Извините, я новичок во всем этом программировании. - person Aasam Tasaddaq; 10.08.2012
comment
@AasamTasaddaq извините, я пропустил шестнадцатеричное требование ... теперь оно там :) - person Maria Zverina; 10.08.2012
comment
Я использовал функцию hex() для порядковых номеров, и это сработало. Благодарю вас! - person Aasam Tasaddaq; 10.08.2012
comment
Это не воспроизводит результаты ОП, но я думаю, что это нормально, потому что результаты ОП на самом деле не являются одним и тем же сигналом, несмотря на то, что он сказал. - person DSM; 10.08.2012

Кажется, это самый простой способ...

ascstr = 'x\02S20..."  #your string

#I think you need to get rid of the first 4 characters '\x02' looks like
#it is hex
ascstr = ascstr[4:] 
for c in mystring:
   hexstr = hexstr + hex(ord(c))[2:] + ' '
person James Rice    schedule 10.08.2012
comment
Вы не можете просто так выбрасывать случайные символы из строки! - person Maria Zverina; 10.08.2012