关于串口接收的问题

查阅手册知道串口接收时是先接收到FIFO缓存区 然后通过read函数从FIFO里读取出来,但是实际使用的时候read经常读不到数据,应该是由于传输延迟,数据还没有进入FIFO造成的。有没有什么办法可以知道FIFO里面已经接收到了一串数据?比如3个字节的数据?

  • 17.2.11 FIFO Data Count Register (FDR) 通过这个寄存器可以看到FIFO里有多少数据
  • 老师 我尝试用一个while循环 不断循环 每次都读取FDR寄存器的值 如果这个值>=1说明FIFO中有数据,然后再用Read读取。经过测试发现这种方法好像不太行,有时能读到数据,但是有时会一直卡死在循环 FDR寄存器的值一直是0。请问老师有没有比较可靠 而且比较简单一点的办法来接收串口的数据?
  • 因为有可能中断函数已经读过了数据了,所以一直是0,
    调用一下这个函数cbUsed(gs_ch_ctrl[channel].p_rx_cbuff);这个函数的返回值是收到数据的长度,如果不为零就说明有数据
    在generate/sc_drivers/r_scifa/src/hld/r_scifa_hld_prv.c文件里可以访问gs_ch_ctrl,在这个文件里自己编一个函数里面调用一下cbUsed(gs_ch_ctrl[channel(这个channel写你用的uart号)].p_rx_cbuff);,然后在你的程序里检查这个值应该就可以了,注意不要使用DMA功能
    看一下r_scifa_hld_prv_read_core函数,这里面就是用这个函数来判断串口接收缓冲区里是否有数据。
  • 感谢工程师的解答 我的问题已经解决了 感谢!
  • 同学你好,我想问一下程序中: scifa_handle = open(DEVICE_INDENTIFIER "scifa0",O_RDWR);
    为什么会返回-1呢