У меня есть некоторые функции Matlab, которые я хотел бы перевести на Python 3.7.Функции вычисляют значения углов соединения маленького робота из trossenrobotics и отправляют эти значения через последовательный порт роботу, который управляется платой Arduino.Плата запускает программу от Trossenrobotics, которая интерпретирует данные, передаваемые через последовательный порт, и реагирует соответствующим образом.
Мне уже удалось перевести все функции, и они выдают те же выходные данные, что и функции matlab, но последовательную связьпросто не работает.В Matlab fwrite(s, int_value)
и fread(s)
используются для связи.Значения int_value представляют старший и младший байты объединенной позиции (0-1024) и отправляются отдельно.В Python я использовал pyserial и функции s.write (byte) и s.read ().Я преобразовал значения int в байты с помощью chr(int).encode()
.
Поскольку я боролся со своей реальной целью, я сначала хотел абстрагировать ее и упростить.Сейчас я просто пытаюсь включить светодиод на arduino на 2 секунды, когда получен специальный байт, и отправить тот же байт обратно в python.
Я заметил, что пока отправляемое значениеменьше, чем 128, он работает просто отлично, но когда он больше, он не будет работать.
Я напечатал вывод chr(255).encode()
, который равен b'\xc3\xbf'
, что, на мой взгляд, могло быть проблемой.Я попытался использовать chr(255).encode('charmap')
и распечатал его, который возвращает b'\xff'
, что мне кажется правильным, но оно все равно не работает для чисел между 128 и 255. Я также заметил, что когда я посылаю данные через терминалс s.write(chr(115).encode())
Он не возвращает значение, но когда я использую s.write(chr(255).encode('charmap'))
, он возвращает 1.
Вот моя программа на python:
python
import serial
from time import sleep
port = 'COM4'
baudrate = 38400
s = serial.Serial(port,baudrate)
sleep(3)
m = 115
s.write(chr(m).encode())
while s.in_waiting == 0:
print('##### waiting #####')
sleep(2)
if s.in_waiting > 0:
r = int.from_bytes(s.read(), byteorder = 'big')
print(r)
s.close()
А вот программа arduino:
C#
void setup() {
pinMode(13, OUTPUT);
digitalWrite(13,LOW);
Serial.begin(38400);
}
void loop() {
if (Serial.available() > 0)
{
if (Serial.read() == 's')
{
digitalWrite(13, HIGH);
Serial.write('s');
delay(2000);
}
}
else
{
digitalWrite(13, LOW);
}
}
Мои вопросы будут:
Относительно моей основной проблемы (отправка нескольких байтов через matlab, python):
1) Кто-нибудь знает, есть ли фундаментальныеразличия между последовательной связью в matlab и в python, которые могут вызвать мои проблемы?
Относительно моей абстрактной проблемы (отправка одного сообщения через python):
2) Как я могу отправить значения больше 128 (до 255) через последовательный порт?