c++ - 如何阻塞直到 WiringPi 完成发送串行数据(UART)?

标签 c++ c raspberry-pi uart wiringpi

设备描述(作为上下文,如果您对电子设备感到不舒服,请跳过它):

对于简单的设备,通信是在半双工 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/

    相关文章:

    linux - 4l2loopback : NOOBS Trouble

    c++ - 将 LPTSTR 转换为字符串

    c++ - 使用可变模板参数增强变体访问者

    c++ - 对 QSqlTableModel 中的 UI 值进行单位转换

    c - 遗传算法使用哪种编码?

    shell - 在启动期间在 ubuntu mate 中运行 "source ./file.sh"

    c++ - 如何使用 RtAudio 调整音频声像

    objective-c - 使用 C 中的 objective-c 类型

    c - 基本的 Makefile 和头文件依赖

    linux - optee trust os 在树莓派 3 上的实现