【问题标题】:serial communication write() doesn't work always串行通信 write() 并不总是有效
【发布时间】:2017-02-26 10:34:36
【问题描述】:

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

我通过蓝牙在我的 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() 之前)输出。

这当然让我很难找出为什么我有这个“错误”。

结果总是等于strlen(string),所以我很确定它是正确编写的。 谁能指出我正确的方向?

【问题讨论】:

  • C 没有::。你确定你不是在用 C++ 编程吗?
  • 我把 tcflush() 换成了 tcdrain() 现在它工作正常了。

标签: c terminal serial-port raspberry-pi3


【解决方案1】:

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

引用Linux manuals:

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

  • TCOFLUSH

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


也许您想改用tcdrain()

tcdrain() 一直等待,直到写入fd 引用的对象的所有输出都已传输完毕。

【讨论】:

    猜你喜欢
    • 2021-12-25
    • 1970-01-01
    相关资源
    最近更新 更多