Форум сайта python.su
vic57Там похоже платка 16-ти битная. Плавающую запятую железка не умеет, а эмуляцию писать не захотели - типа кому надо, да и медленно, наверняка. Попробуйте с long вместо int. По мануалу бинарные функции с ним умеет. Ну или побайтово.
sys.maxint? не пойму что за питон такой, стандартные функции не выполняются
Офлайн
PooH, судя по ошибке “str(num).zfill(n)”, интерпретатор упрощен сильно, нужно и писать как можно проще: одна строка - одно действие.
PooHУМВР pytnon-2.7 поэтому и не пойму
Попробуйте с long вместо int
Офлайн
скачал я этот Telit Python на посмотреть, все стало ясно.
Не поддерживает: True, False, >>=, +=, не знаю что еще
переписал, в PythonWin все заработало
Отредактировано vic57 (Авг. 18, 2016 11:56:01)
Офлайн
vic57Спасибо!
скачал я этот Telit Python на посмотреть, все стало ясно.Не поддерживает: True, False, >>=, +=, не знаю что еще переписал, в PythonWin все заработало
while 1: s = raw_input('hex? :') if s == 'q': break print hex2float(s)
EOF when reading a line
Офлайн
Еще раз спасибо за большой труд в решении данной проблемы!
Вопрос еще один: Я в serial port monitor вижу обмен данными в hex.
А вот модуль по умолчанию принимает данные в string.
10 03 04 E1 35 41 EE 6D 1C = …б5Aоm.
Если не сложно, подскажите как вытащить из полученного ответа 41EEE135.
Офлайн
Svet, это я для проверки делал - вводишь hex, получаешь float. для импорта в другую программу это не надо. или у тебя ошибка табуляции где-то, PythonWin ИМХО кривоватый
терминал открой в PyWin
>>> s = '10 03 04 e1 35 41 ee 6d 1c=...Aom'
>>> s= s.split('=')[0]
>>> s
'10 03 04 e1 35 41 ee 6d 1c'
>>> l = s.split()
>>> l
['10', '03', '04', 'e1', '35', '41', 'ee', '6d', '1c']
>>> out = l[5] +l[6] + l[3] +l[4]
>>> out
'41eee135'
Отредактировано vic57 (Авг. 16, 2016 00:46:39)
Офлайн
Делаю вот так:
def hex2 (data): b = '' for i in data: b = b + chr(i) return b SER.receive(10) #мусор SEND = hex2([0x10, 0x03, 0x02, 0xAA, 0x00, 0x02, 0xE6, 0xD2]) # 10 03 02 AA 00 02 E6 D2 SER.send(str(SEND)) MOD.sleep(10) SRcv2 = SER.receive(20) l = SRcv2.split() out = l[5] +l[6] + l[3] +l[4] print 'READ: '+str(hex2float(out))
Офлайн
для отладки print вставляй где сомневаешься
SRcv2 = SER.receive(20) print '?', SRcv2, len(SRcv2), type(SRv2), str(SRv2)
Отредактировано vic57 (Авг. 16, 2016 15:31:42)
Офлайн
Подниму еще небольшой вопрос.
С modbus RTU как-то не срослось…
А вот с modbus ASCII получается отправлять и принимать данные, а так же их обрабатывать.
Только вот с float не получается привести к правильному виду.
Вот примеры:
A3 9D C0 5B = 3.43
84 50 41 B4 = 22.56
И еще вопрос про целые числа, я получаю 00 0F = это 15. Тут все гуд. А вот когда получаю FF E2 = это должно быть -30. Но я int('FFE2',16) получаю 65506. Как получать отрицательные целые данные?
Отредактировано Svet (Дек. 27, 2016 10:14:00)
Офлайн
не то
15 = 0x31 0x35
https://sites.google.com/site/fieldbusbook/seti/modbus-rtu-ascii-rus
http://www.simplymodbus.ca/ASCII.htm
причем модбас м.б. модифицирован, надо спецификацию смотреть
Отредактировано vic57 (Дек. 28, 2016 21:13:47)
Офлайн