UART上的FIFO循环缓冲区大小

2019-07-14 17:47发布

我正在尝试实现UART协议以在两个板之间进行通信。数据是ascii编码的,消息长度是变量。我选择实现一个数据包以“封装”信息。包:{STX,DATA,ETX}。STX是ASCII表中的“文本开头”。它的十六进制代码是0x02,ETX是“文本结束”。它的Hex代码0x03。在数据字段的每个字节可以从任意值0x00至0x7F除外0x02和0x03。问题1:数据长度
如何通过uart发送可变数据长度?
示例:{STX,Hello 0,RTX}和{STX,这是一个长文本 0,RTX}
我一直在互联网上挖掘,我发现最好的方法是使用FIFO循环缓冲区。问题是BUFFER_SIZE在这种情况下如何解决?假设我已经完成了一些数学运算,并且我发现通过UART传输的最长信息是90字节,最短的是4字节。我#define BUFFER_SIZE 90或我需要更大的缓冲区吗?在这两种情况下,FIFO在这些情况下如何工作:
情况1:数据长度<BUFFER_SIZE。
示例:{STX,ABCD,ETX}和BUFFER_SIZE = 90字节。
情况2:缓冲区已满,但数据仍然存在。
示例:BUFFER_SIZE = 13
包:{STX,READ_X,ETX} {STX,REMOVE_Y,ETX}。在HEX中,这些消息是
0x02 0x52 0x45 0x41 0x44 0x5f 0x58 0x00 0x03 0X02 0x52 0x45 0x4d 0x4f 0x56 0x45 0x5f 0x59 0x00 0x03
当我们到达时0x4d(斜体),缓冲区已满。它是如何处理这种情况的?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
2条回答
bobnice
2019-07-15 03:17
先入先出。无论数据是什么,它都将从存储位置开始按顺序存储到FIFO中。假设FIFO数据宽度是一个字节,总内存大小是90字节,这意味着它有90个内存位置,它将每个输入字节按顺序存储在内存位置。你以“First Written First Read”方式读取它的字节。当你读取一个字节时,该位置现在可以“自由”覆盖。当你已经将字节写入其全部容量但尚未读取任何字节时,FIFO被称为已满。假设FIFO已满并且数据仍在进行中,那么新的字节将依次覆盖最旧的数据(从第一个位置)。因此发生数据丢失。所以你必须在它充满之前读取缓冲区。假设某个波特率的90字节进入UART接收器FIFO。在收到整个消息之前,它将根据波特率在一定时间内充满。如果使用大小<90字节的FIFO,则必须确保在字节填满之前读取字节。如果FIFO大小大于90字节,并且没有更多字节进入,则数据将保留在FIFO中,您可以随时读取这些字节。

一周热门 更多>