STM32/STM8技术william hill官网
直播中

刘伟

7年用户 1628经验值
私信 关注
[问答]

UART上的FIFO循环缓冲区大小

我正在尝试实现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:数据长度 示例:{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(斜体),缓冲区已满。它是如何处理这种情况的?

回帖(3)

王平

2018-9-13 15:43:31
显然,只要发现它不为空,就需要有一些进程将数据从FIFO中取出。然后,FIFO需要足够深,以处理投入率和取出率之间的最坏情况不匹配。
一般来说,UART通常足够慢,其他CPU活动可以跟上,这意味着FIFO可能相对较浅,但如果你的应用程序足够复杂,你可能会发现需要更大的缓冲区。
例如,如果你知道可以在一段时间内阻止使用过程,则FIFO必须足够深,以至少保留在该时间内可以到达的字符数。
举报

李刚

2018-9-13 15:44:12
读取uart并将字符放入fifo(通常是中断)的例程应该在离开之前检查DATA_AVAILABLE标志(如果数据则再次运行)。UART RX通常是双缓冲的,可以有2个字节可用,特别是在fifo-push代码完成时
1 举报
  • 1277185193: 请问如果设置收到16字节产生中断,这16个字节存在哪里呢》徐亚自己建立FIFO队列吗?

訾存贵

2018-9-13 15:45:15
先入先出。无论数据是什么,它都将从存储位置开始按顺序存储到FIFO中。假设FIFO数据宽度是一个字节,总内存大小是90字节,这意味着它有90个内存位置,它将每个输入字节按顺序存储在内存位置。你以“First Written First Read”方式读取它的字节。当你读取一个字节时,该位置现在可以“自由”覆盖。当你已经将字节写入其全部容量但尚未读取任何字节时,FIFO被称为已满。假设FIFO已满并且数据仍在进行中,那么新的字节将依次覆盖最旧的数据(从第一个位置)。因此发生数据丢失。所以你必须在它充满之前读取缓冲区。假设某个波特率的90字节进入UART接收器FIFO。在收到整个消息之前,它将根据波特率在一定时间内充满。如果使用大小<90字节的FIFO,则必须确保在字节填满之前读取字节。如果FIFO大小大于90字节,并且没有更多字节进入,则数据将保留在FIFO中,您可以随时读取这些字节。
1 举报
  • 1277185193: 请问如果设置收到16字节产生中断,这16个字节存在哪里呢?需要自己建立FIFO队列吗?

更多回帖

发帖
×
20
完善资料,
赚取积分