加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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

发布时间:2020-12-13 19:07:14 所属栏目:Linux 来源:网络整理
导读:我将数据从Linux应用程序通过串口发送到嵌入式设备. 在当前实现中,在固件中使用字节循环缓冲器. (只有带有读写指针的数组) 当字节进入时,它被写入循环缓冲区. 现在,PC应用程序似乎发送的数据太快,无法让固件处理.错过字节,导致固件返回WRONG_INPUT太多次. 我

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读