2015-08-12 4 views
1

Итак, у меня возникла проблема с моей последовательной связью между Python и Arduino Uno. У меня есть Python, отправляющий номер 38 (вместе с другими номерами) через последовательную связь bytearray в Arduino, а затем обратно на Python.Последовательная связь Python Arduino

Массива Я посылаю это:

[230, 0, 0, 0, 38] 

И массив он распечатка (при использовании печати()) является:

bytearray(b'\xe6\x00\x00\x00& 

Амперсанда есть, потому что есть странно nuance в печати bytearray, что, когда число находится между определенным диапазоном (извините, я не помню диапазон), он печатает его в ASCII, а не в шестнадцатеричном виде, поэтому массив, который я отправляю в Arduino, должен все еще иметь все Информация нужна.

Я получаю информацию в Arduino по:

char values[5];  
Serial.readbytes(values, 5); 

После того, как Arduino reveives информацию, я использую Serial.write, чтобы отправить его обратно в Python, где я распечатать их, чтобы гарантировать, что я получил правильный Информация. Этот вывод получен в Python является:

b'\xe6\x00\x00\x00\xf6' 

, где 0xE6 230 (правильный) и 0xf6 является 246, который является неправильным, оно должно быть шестнадцатеричное значение 38, которое является 0x26.

Есть ли у кого-нибудь предложения относительно того, как это исправить? Любые предложения или помощь будут оценены!

EDIT: Нашел мою проблему, у меня случайно был отрицательный минус '0', потому что в какой-то момент я подумал, что мне нужно преобразовать информацию из ASCII в шестнадцатеричный, но оказывается, что я этого не делаю. Спасибо за помощь!

+0

в c/C++ bytestrings обычно должны заканчиваться на «\ 0» (ive использовало много и много серийных и pyserial arduino, и я могу сказать вам, что это работает отлично в самом деле я пробовал ...) –

+0

Можете ли вы также попробовать отправить что-то еще, кроме '0', в другие позиции индекса массива? (просто чтобы посмотреть, вернутся ли они так, как ожидалось.) Кроме того, это python 3 или python 2? – Dan

+0

Также попробуйте отправить '38' первым и' 230' последним и сообщите нам, что результаты этого были – Dan

ответ

0

test.ino

char buffer[10] = {0,0,0,0,0,0,0,0,0,0}; 
void setup(){ 
    Serial.begin(9600); 
} 
void loop(){ 
    Serial.println(Serial.readBytes(buffer,5)); 
} 

test.py

import serial 
s=serial.Serial("COM5",timeout=5) 
time.sleep(5) # wait a couple seconds 
s.write(b"\xe6\x00\x00\x00&") 
# or alternatively 
# s.write(bytes(bytearray([0xe6,0x00,0x00,0x00,0x26]))) 
print(repr(s.read(1000))); 

это то, что минимальный пример кода выглядит ... он должен работать ...

+0

Я думаю, вы пропустили небольшую деталь. В вопросе говорится, что они отправляют массив, а не шестнадцатеричное значение байтов.Шестнадцатеричные значения - это только результат, когда массив печатается на экране, чтобы подтвердить содержимое до того, как они будут отправлены по серийному номеру – Dan

+0

ну, это хороший старт ... Я добавил комментарий с помощью bytearray ... но ive не испортился с ними так im не уверен, как он будет себя вести –

+0

Пробовал этот код, и он дает мне выход: b '\ x00 \ x00 \ x00 \ x05 \ x00 \ x00 \ x00 \ x00 \ x00', что неверно. FYI Я использую Serial.write() в коде arduino вместо Serial.println(), потому что он делает вывод более читаемым. Также, Joran прав, и я посылаю шестнадцатеричные значения через s.write, используя bytearray, чтобы преобразовать числа в шестнадцатеричные значения. – rtmurad