C 未读取uart缓冲区
我正在尝试在linux上用c从串行设备读取二进制数据。 问题是,有时驱动程序的内部缓冲区中有字符,但轮询(使用select(2))返回,表示设备尚未准备好读取 我已经阅读并重读了《termios之人》和所有相关的《人》,并在互联网上进行了搜索。我相信我已正确设置了所有标志(即VTIME、VMIN)和unset ICANON。 我也尝试过使用函数“tcmakeraw”,但没有解决问题 你们知道我该怎么做吗 致以亲切的问候和感谢C 未读取uart缓冲区,c,linux,serial-port,buffer,uart,C,Linux,Serial Port,Buffer,Uart,我正在尝试在linux上用c从串行设备读取二进制数据。 问题是,有时驱动程序的内部缓冲区中有字符,但轮询(使用select(2))返回,表示设备尚未准备好读取 我已经阅读并重读了《termios之人》和所有相关的《人》,并在互联网上进行了搜索。我相信我已正确设置了所有标志(即VTIME、VMIN)和unset ICANON。 我也尝试过使用函数“tcmakeraw”,但没有解决问题 你们知道我该怎么做吗 致以亲切的问候和感谢 Yannay当您在设置串行参数后直接(而不是通过C)/dev/ttyS
Yannay当您在
设置串行
参数后直接(而不是通过C)/dev/ttyS0
(或等效)读取时会发生什么情况。您是否能够在select()
之外获得所需的数据?您应该向我们展示代码。我将首先在串行端口上使用cfmakeraw。
一旦在原始模式下工作,就可以进行修改并查看其工作方式。
以下是您可以检查的问题或事项列表:
- 在修改属性(例如使用cfmakeraw)之后,是否调用tcsetattr(…)以 找你的零钱
- 如何证明驱动程序接收缓冲区中仍有数据
- 是否检查系统调用是否有错误
- 你的计划结果如何
基本上:要么,要么你的串行驱动程序。串行驱动程序被破坏的原因是硬件fifo不够满,无法触发un中断或中断。您是否记得在每次调用
select()
之前重新填充readfds
?什么类型的串行端口?(即,一个真正的16550、一个16550克隆、一个USB转换器、蓝牙、irda等)设置的唯一标志是:CREAD、CLOACL、CS8、NL0、CR0、TAB0、BS0、VT0、FF0。波特率设置正确。VMIN=1,VTIME=0。但是,问题没有解决/我正在尝试在没有选择的情况下阅读。只需读取,不返回字节。1。对2.这很复杂。我使用的协议保证在每条消息之后都有一个ACK。有时,除非从设备发送更多数据,否则我无法获得ack。我100%相信这不是问题所在。3.当然4.如果一切都失败了,我会尝试的。。。