我将数据从Linux应用程序通过串口发送到嵌入式设备.
在当前实现中,在固件中使用字节循环缓冲器. (只有带有读写指针的数组)
当字节进入时,它被写入循环缓冲区.
现在,PC应用程序似乎发送的数据太快,无法让固件处理.错过字节,导致固件返回WRONG_INPUT太多次.
我认为波特率(115200)不是问题.固件端更有效的数据结构可能会有所帮助.有关数据结构选择的任何建议吗?
最佳答案
循环缓冲区是最佳答案.这是在纯软件中建模硬件FIFO的最简单方法.
真正的问题可能是您从UART收集字节以放入缓冲区的方式,或者是该缓冲区的溢出.
在115200波特率下,通常的1个起始位,1个停止位和8个数据位,您可以看到每秒多达11520个字节到达该端口.这使得每个字节平均可以使用大约86.8μs.在PC中,这似乎需要很多时间,但在一个小型微处理器中,它可能不是那么多的总指令,或者在某些情况下可能是非常多的I / O寄存器访问.如果你的缓冲区溢出,因为字节的平均到达速度比你可以消耗的速度快,那么你就会有错误.
一些一般建议:
>不要进行轮询I / O.
>请使用Rx就绪中断.
>启用接收FIFO(如果可用).
>在中断处理程序中完全清空FIFO.
>使环形缓冲区足够大.
>考虑流量控制.
调整环形缓冲区的大小足以容纳完整的消息非常重要.如果你的协议已经知道了消息大小的限制,那么你可以使用更高级别的协议进行流量控制,并且能够在没有让XON / XOFF流程在所有边缘情况下正常工作的情况下生存,或者RTS / CTS在电线的两端按预期工作,这几乎可以像毛茸茸一样.
如果你不能使环形缓冲区那么大,那么你将需要某种流量控制.