串行通信write()并不总是有效

时间:2017-02-26 10:34:36

标签: c terminal serial-port raspberry-pi3

我有一个问题,我似乎无法弄清楚:

我的RPi和我的PC之间通过蓝牙与Putty进行了串行通信。 我使用以下代码将文本从我的RPi发送到Putty:

ssize_t serial::writeSerialPort(char const *string)
{
    /*
     write a string to the serial connection
     */

    ssize_t result = write(fd, string, strlen(string));

    tcflush(fd, TCOFLUSH);
    if (result != strlen(string))
        printf("Failed to write to serial port!\n");
    else
        printf("Wrote to serial port!\n");

    return result;
}

现在奇怪的是,有时文本会被发送到Putty并且有效。 然后突然它停止工作,一段时间后它再次开始工作(全部在同一个会话中)。

当我设置断点并调试我的代码时,文本总是在write()函数之后(tcflush()之前)输出。

这当然很难找出为什么我有这个" bug"。

结果总是等于strlen(string)所以我非常确定它写得正确。 有谁能指出我正确的方向?

1 个答案:

答案 0 :(得分:1)

我不确定你想通过tcflush(fd, TCOFLUSH);实现什么目标。该函数专门调用丢弃 - 即放入垃圾桶 - 所有数据都写入fd,但尚未通过串行链接发送。

引用Linux manuals

  

tcflush() 丢弃 写入fd引用的对象但未传输的数据,或接收但未读取的数据,具体取决于价值queue_selector

     
      
  • TCOFLUSH

         

    刷新已写入但未传输的数据。

  •   

也许您想要使用tcdrain()代替:

  

tcdrain()等待,直到发送了fd 引用的对象的所有输出。