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'#'
, и происходит то же самое, данные не передаются, если у меня активны все три последовательные команды.
Что происходит в моем коде? Не перегружается ли последовательный буфер тремя последовательными операциями записи, и в итоге буфер очищается?
@Greg G, 👍0
Обсуждение1 ответ
Проблема в том, что ваш код работает, но вы вычитаете 48 из того, что получили.
Что, если python отправляет char
со значениями: '0'
'1'
'2'
это приведет к последовательно выводимым значениям NUL
SOH
STX
, которые невидимы.
Если python передает необработанное байтовое значение (также известное как 0x00
0x01
0x02
), это приведет к 0x00 - 48 = неопределенное поведение
со значением потери значимости (то же самое касается 0x01
и 0x02
)
- Не удается связаться с ардуино с помощью python (Windows)
- Последовательная связь Arduino с Python: отправка массива
- Построение графика на Python с использованием Tkinter Canvas
- Как отправить целое число через pyserial с Python на Arduino и получить тот же результат?
- Сброс последовательного порта Arduino в последовательном мониторе и Python
- Отправка числа с плавающей запятой из python в arduino
- Serial Comm. проблема синхронизации между Arduino и Pyserial
- Связь между Python и Arduino ненадежна
вы уверены, что это не проблема при каждом втором запуске и не зависит от строк
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