我在非阻塞模式下打开了/dev/ttyACM0。
我正在使用select 来了解数据何时可用。
当select返回时,我可以用read函数读取串口到达的所有数据。
问题是如果我尝试读取更多数据,read 返回 0。
这不是正确的行为。
解释:
当以非阻塞模式打开套接字时,select在数据可用时返回,并且可以调用read函数来检索数据。
但是,在没有数据可读的套接字上调用read 将导致read 返回-1,而不是0 .
相关的 errno 是 EWOULDBLOCK,这是正确的。
在串口描述符的情况下,除了read在没有数据时返回0和errno也是0。
对于套接字,read 返回 0 表示远程已关闭 session 的末端,这应该是您关闭连接的本地端的时刻.
实际上,串口读取返回0,但该端口未被关闭。
有没有办法初始化 comm 端口,使它的行为与套接字相同?
谢谢
最佳答案
如果您只是想要一种方法来区分设备移除(从父总线拔下串行端口,例如 USB,或强制卸载驱动程序)和无数据,请调用其结果不依赖于接收缓冲区的 API。
例如,tcgetattr
应该成功,不管有没有数据,只要设备还存在。
如果要检测串行电缆的断开,则需要硬件握手或超时。
关于c - Linux - 串口行为不同于套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49135953/