Различия между последовательной связью в Matlab и Python 3,7?Отправка значений int более 128 через последовательный интерфейс Python в Arduino - PullRequest
0 голосов
/ 19 июня 2019

У меня есть некоторые функции 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) через последовательный порт?

Ответы [ 2 ]

0 голосов
/ 24 июня 2019

Спасибо за ваш ответ! И извините за поздний ответ.

Я уже пробовал это в самом начале, но всегда получал исключение. Мне понадобилось время, чтобы понять, почему. Это потому, что я использовал numpy.uint8 () для своих целочисленных значений.

После того, как я удалил его, я не получил никаких исключений, но он тоже не сработал.

Я использовал chr (), потому что он не выдавал исключение с помощью numpy.uint8 () и, честно говоря, я не знал, что еще делать ...

Сегодня я наконец нашел решение.

Вот ссылка на то, где я ее нашел: arduino.stackexchange.com

Использование s.write (struct.pack ('> B', int_value) работает и, кажется, эквивалентно matlabs fwrite (s, int_value).

Извините, если мой вопрос не имел для вас большого смысла, я просто рад, что наконец понял это.

0 голосов
/ 19 июня 2019

В этом отношении между Python и Matlab нет принципиальной разницы.

Но в вашем коде Matlab кажется (я полагаю, потому что вы говорите):

int_values ​​представляет старший и младший байты объединенной позиции (0-1024) и отправляются отдельно.

, которые вы отправляете int16, чтобы иметь возможность соответствоватьдо 1024.

Понятия не имею, что вы пытаетесь сделать с chr, но мне кажется, что вам нужно заменить эти строки:

m = 115
s.write(chr(m).encode())

на (вкл.Python 3.x):

m=115
s.write(m.to_bytes(2, byteorder="big"))

Это будет писать: b'\x00s', смесь гекса и ASCII, но вам не стоит об этом беспокоиться, потому что это точно так же, как b'\x00\x73'

И если вы это сделаете, то вы можете сделать: b'\x00s'==b'\x00\x73' и вы получите True.

...