用于在固件中存储串行端口数据的数据结构

前端之家收集整理的这篇文章主要介绍了用于在固件中存储串行端口数据的数据结构前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我将数据从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在电线的两端按预期工作,这几乎可以像毛茸茸一样.

如果你不能使环形缓冲区那么大,那么你将需要某种流量控制.

原文链接:https://www.f2er.com/linux/440398.html

猜你在找的Linux相关文章