c - 固件中存储串口数据的数据结构

标签 c linux serialization data-structures embedded

我正在通过串行端口将数据从 Linux 应用程序发送到嵌入式设备。

在当前的实现中,固件中使用了一个字节循环缓冲区。 (只不过是一个带有读写指针的数组) 当字节进入时,它被写入循环缓冲区。

现在 PC 应用程序发送数据的速度似乎太快,固件无法处理。字节丢失导致固件返回 WRONG_INPUT 次数过多。

我认为波特率 (115200) 不是问题。固件端更高效的数据结构可能会有所帮助。对数据结构的选择有什么建议吗?

最佳答案

循环缓冲区是最好的答案。这是在纯软件中为硬件 FIFO 建模的最简单方法。

真正的问题可能是您从 UART 收集字节以放入缓冲区的方式,或者是缓冲区溢出。

在 115200 波特率下,通常有 1 个起始位、1 个停止位和 8 个数据位,您可以看到每秒有多达 11520 个字节到达该端口。这为您提供了平均每字节 86.8 µs 的工作时间。在 PC 中,这似乎需要很多时间,但在小型微处理器中,可能不会有那么多指令总数,或者在某些情况下可能不会有很多 I/O 寄存器访问。如果因为字节平均到达速度快于您可以消耗它们的速度而使您的缓冲区溢出,那么您将会出错。

一些一般性建议:

  • 不要执行轮询 I/O。
  • 务必使用 Rx Ready 中断。
  • 启用接收 FIFO(如果可用)。
  • 在中断处理程序中完全清空 FIFO。
  • 使环形缓冲区足够大。
  • 考虑流量控制。

将环形缓冲区的大小设置得足够大以容纳完整的消息很重要。如果您的协议(protocol)对消息大小有已知限制,那么您可以使用更高级别的协议(protocol)进行流量控制并生存,而无需让 XON/XOFF 流在所有边缘情况或 RTS/CTS 中正常工作在电线的两端都能按预期工作,这几乎是多毛的。

如果您不能将环形缓冲区做得那么大,那么您将需要某种流量控制。

关于c - 固件中存储串口数据的数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/990269/

相关文章:

java - Jackson/JSON 的不良用例是什么?

java - 可选字段的 Avro 序列化

c - 再次初始化相同的互斥体

c++ - inet_pton 或 InetPton 在 Windows XP 中的等效项是什么?

windows - 计划任务 Linux 与 Windows

php - 如何使用 Apache 2.2.3 加载 PHP 5.4.3?

c# - 读取二进制文件到 List<T>

c - 引导加载程序上的图形

c++ - 相互依赖的静态库

python - 从 python 运行 linux 命令