Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 未读取uart缓冲区_C_Linux_Serial Port_Buffer_Uart - Fatal编程技术网

C 未读取uart缓冲区

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

我正在尝试在linux上用c从串行设备读取二进制数据。 问题是,有时驱动程序的内部缓冲区中有字符,但轮询(使用select(2))返回,表示设备尚未准备好读取

我已经阅读并重读了《termios之人》和所有相关的《人》,并在互联网上进行了搜索。我相信我已正确设置了所有标志(即VTIME、VMIN)和unset ICANON。 我也尝试过使用函数“tcmakeraw”,但没有解决问题

你们知道我该怎么做吗

致以亲切的问候和感谢
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.如果一切都失败了,我会尝试的。。。