Arduino не будет читать три последовательных пакета в последовательном соединении

Я написал небольшую программу для отправки последовательных команд из Python в Arduino Micro. Это мой код для обоих:

Питон

import serial

ser = serial.Serial('COM5', 9600)

ser.write(b'0')
ser.write(b'1')
# ser.write(b'2')

print('done')

Ардуино

void setup()
{
  Serial.begin(9600);
}

void loop()
{

  while (!Serial.available()){}
  Serial.println(Serial.read()-48); 

}

Если я оставлю строку ser.write(b'2') в коде Python закомментированной, код будет выполняться почти мгновенно, и я смогу увидеть обе передачи в последовательном мониторе. Если я раскомментирую его, код Python будет выполняться примерно через 5-7 секунд, и никакие данные не будут проходить через последовательный монитор.

Я пробовал разные скорости передачи данных, но это не помогло. Я также пытался отправить целое число, а не b'#', и происходит то же самое, данные не передаются, если у меня активны все три последовательные команды.

Что происходит в моем коде? Не перегружается ли последовательный буфер тремя последовательными операциями записи, и в итоге буфер очищается?

, 👍0

Обсуждение

вы уверены, что это не проблема при каждом втором запуске и не зависит от строк write?, @Juraj

Привет, Юрай, я не понимаю, что ты имеешь в виду, можешь уточнить?, @Greg G

Он работает надежно с двумя операциями записи. Каждый раз происходит сбой при 3 записи., @Greg G

что, если вы отправите «0» и «2» или «1» и «2». Та же проблема?, @Chad G

Вы перегружаете не входной буфер, а выходной буфер., @chrisl

Чад, я попробую, но, кажется, в прошлый раз у меня на выходе просто 0. Крисл, ты уверен? Этот последовательный тест является частью гораздо более крупной программы, которая каждую секунду отправляет сотни последовательных команд, и я подозреваю, что выходной буфер очень быстро переполнился бы, но я не сталкивался с этой проблемой, не думаю...., @Greg G

Вы тестируете приведенный выше код или свою более крупную программу? Это имеет значение. Приведенный выше код, скорее всего, быстро заполнит выходной буфер, поскольку нет ничего, что могло бы замедлить цикл. Если у вас большая программа, это может достаточно замедлить цикл (в зависимости от программы). чтобы у ATMega было достаточно времени для отправки данных и очистки буфера., @chrisl

Это может быть проблема с Python. Полный буфер RX на Arduino ничего не делает с программой Python, поскольку в Arduino UART нет управления потоком. Если входной буфер заполнен, данные просто будут потеряны. Никакой блокировки отправителя., @chrisl

Хм, я не вижу цикла, способного переполнить любой буфер. Сценарий Python просто завершается после отправки 3 байтов. Скетч Arduino будет распечатан только в том случае, если что-нибудь было получено. Кроме того, по моему опыту, Atmega, работающая на частоте 8 МГц, абсолютно достаточно быстра, чтобы опрашивать входящие байты, которые передаются со скоростью 9600 бод..., @Sim Son

Ой, извини, моя ошибка. Прочтите неверно. Но все же я бы предположил, что ошибка больше связана со стороной Python, предполагая, что OP действительно тестирует приведенный выше код, а не более крупный код., @chrisl


1 ответ


1

Проблема в том, что ваш код работает, но вы вычитаете 48 из того, что получили.
Что, если python отправляет char со значениями: '0' '1' '2' это приведет к последовательно выводимым значениям NUL SOH STX, которые невидимы.

Если python передает необработанное байтовое значение (также известное как 0x00 0x01 0x02), это приведет к 0x00 - 48 = неопределенное поведение со значением потери значимости (то же самое касается 0x01 и 0x02)

,