【问题】当自己码完收发代码之后,确收、发不成功串口数据。
【解题思路】在确保代码无误的情况下,很可能是阻塞与非阻塞通信的区别。所以,需要分别尝试实现阻塞与非阻塞的方式进行测试。
【深层次原因理解】拿qt工程举例,write() 只是把要发送的字节放入系统的发送缓冲区,它本身是非阻塞的。如果在写入后立即关闭串口、退出线程或让事件循环停下来,系统可能还没有把缓冲区里的数据真正写到硬件上,这时对方设备就收不到数据,表现为“发送不成功”。
【阻塞与非阻塞主要区别】阻塞是当前没有可读数据或输出缓冲区已满,函数会挂起当前线程,一直等到条件满足后才往下执行。非阻塞是如果条件不满足,函数会立即返回(无数据),线程不会被挂起。