Описание устройства (для контекста пропустите его, если вам не нравится электроника):
Для простого устройства связь осуществляется через полудуплексный UART (TX и RX находятся на одном и том же проводе) следующим образом:
- Один контакт (режим записи) указывает, отправляет или принимает UART (1: TX, 0: RX)
- Один вывод записывает в провод (TX).
- Один вывод считывается с провода (RX).
Когда write-mode
находится в режиме TX (запись), контакт RX
находится в высоком импедансе, а TX
- в режиме передачи. Пока write-mode
находится в режиме приема (чтения), TX
pin находится в режиме высокого импеданса и RX
принимает.
Это просто для контекста, я не жду здесь электронных вопросов / ответов.
Пример WiringPI:
Для этого у меня есть следующий образец:
#include <wiringPi.h>
#include <wiringSerial.h>
int main()
{
wiringPiSetup ();
auto fd = serialOpen ("/dev/ttyAMA0", 115200);
pinMode(0, OUTPUT);
for(size_t i=0; i<10; ++i)
{
digitalWrite(0, HIGH);
serialPutchar(fd, '\x55');
digitalWrite(0, LOW);
delay(1000);
}
serialClose(fd);
}
С помощью осциллографа я ясно вижу, что вывод write-mode
сбрасывается до того, как UART завершит отправку данных.
Очевидно, я попытался добавить некоторую задержку или пустой цикл для настройки, но это ненадежно для времен мкс (из-за обычной точности таймеров в ОС).
Вопрос:
Как синхронизировать, чтобы вывод write-mode
сбрасывался сразу после отправки байта UART? (Не более чем примерно через 150 мкс).
tcdrain
выглядит многообещающе (протестирую и приму / прокомментирую) 08.09.2020