设备描述(作为上下文,如果您对电子设备感到不舒服,请跳过它):
对于简单的设备,通信是在半双工 UART 中完成的(TX 和 RX 在同一根线上),具体方式如下:
- 一个引脚(写入模式)指示 UART 是否正在发送或接收(1:TX,0:RX)
- 一个引脚写入线路 (TX)。
- 一个引脚从电线 (RX) 读取数据。
当 write-mode
在 TX(写作),RX
引脚处于高阻抗且TX
在传输中。而write-mode
处于 RX(读取)状态时,TX
引脚处于高阻抗且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端发送数据之前复位。
显然,我尝试添加一些“延迟”或空循环来调整,但这对于μs时间来说并不可靠(由于操作系统上计时器的通常精度)。
问题:
如何同步,所以write-mode
发送 UART 字节后引脚立即复位? (不超过约 150μs 后)。
最佳答案
我看到有两种实现此目的的方法:
1。我现在无法对此进行测试,但看来您可以使用
void serialFlush (int fd) ;
根据文档“这将丢弃所有收到的数据,或等待发送给给定设备的数据”,请参阅 http://wiringpi.com/reference/serial-library/
(编辑:重新阅读这句话后,很明显它确实也会刷新要写入的数据,所以这个选项已经消失了......)
- 使用 tcdrain() ( https://linux.die.net/man/3/tcdrain ),传递由
serialOpen()
返回的 fd
关于c++ - 如何阻塞直到 WiringPi 完成发送串行数据(UART)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63790821/