У меня есть простой скрипт Python для связи с микроконтроллером (STM32F103C8T6) с использованием последовательного порта. Я использую pySerial для записи нескольких 44-байтовых сообщений за раз.Минимальная задержка для связи через последовательный порт с использованием Python
[...]
serial = serial.Serial(serial.tools.list_ports.comports()[0].device, 115200)
packet0 = bytearray(INSERT_RELEVANT_44-BYTES)
packet1 = bytearray(INSERT_RELEVANT_44-BYTES)
serial.write(packet0)
time.sleep(0.1) # Delay between communications
serial.write(packet1)
[...]
Мне пришлось вставить задержку между сообщениями, иначе это не сработало. Мое рассуждение состоит в том, что при скорости передачи в 115200 бит/с сообщения должны принимать 44 * 8/115200 = ~ 0,003 секунды для отправки, поэтому это должен быть минимальный идеальный интервал между отправкой пакетов. Код, однако, не работает ни на что меньшее 0,1.
Почему? Я что-то упускаю? Я полагаю, что есть некоторая задержка из-за операционной системы и USB, но она не должна составлять ~ 0,7 секунды. Как я могу оптимизировать это, чтобы использовать минимально возможную задержку?
* «это не сработает» * - Это сводка, которая не содержит никакой диагностической информации. Ваш * «рассуждение» * слегка выключен; он не учитывает 2 бита кадрирования на символ. Что заставляет вас думать, что передача с минимальной задержкой практична; то есть приемник, способный обрабатывать (принимать и обрабатывать) такую скорость передачи пакетов? Также рассмотрите точность функции сна и накладных расходов на интерпретируемый язык. – sawdust
Это зависит от того, как вы используете последовательный порт в stm32. Можно ли использовать код, который вы пишете в stm32? – saygins
Вы, кажется, ищете причину только на стороне отправки. Есть отправитель, который может потерять символы и приемник (в вашем случае у вас, по-видимому, есть адаптер USB-to-serial, который также может потерять символы). Без дополнительной диагностики на * где * проблема, мы, вероятно, не можем помочь. – tofro