完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我正在尝试实现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:数据长度 情况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个回答
|
|
显然,只要发现它不为空,就需要有一些进程将数据从FIFO中取出。然后,FIFO需要足够深,以处理投入率和取出率之间的最坏情况不匹配。
一般来说,UART通常足够慢,其他CPU活动可以跟上,这意味着FIFO可能相对较浅,但如果你的应用程序足够复杂,你可能会发现需要更大的缓冲区。 例如,如果你知道可以在一段时间内阻止使用过程,则FIFO必须足够深,以至少保留在该时间内可以到达的字符数。 |
|
|
|
读取uart并将字符放入fifo(通常是中断)的例程应该在离开之前检查DATA_AVAILABLE标志(如果数据则再次运行)。UART RX通常是双缓冲的,可以有2个字节可用,特别是在fifo-push代码完成时
|
|
1 条评论
|
|
先入先出。无论数据是什么,它都将从存储位置开始按顺序存储到FIFO中。假设FIFO数据宽度是一个字节,总内存大小是90字节,这意味着它有90个内存位置,它将每个输入字节按顺序存储在内存位置。你以“First Written First Read”方式读取它的字节。当你读取一个字节时,该位置现在可以“自由”覆盖。当你已经将字节写入其全部容量但尚未读取任何字节时,FIFO被称为已满。假设FIFO已满并且数据仍在进行中,那么新的字节将依次覆盖最旧的数据(从第一个位置)。因此发生数据丢失。所以你必须在它充满之前读取缓冲区。假设某个波特率的90字节进入UART接收器FIFO。在收到整个消息之前,它将根据波特率在一定时间内充满。如果使用大小<90字节的FIFO,则必须确保在字节填满之前读取字节。如果FIFO大小大于90字节,并且没有更多字节进入,则数据将保留在FIFO中,您可以随时读取这些字节。
|
|
1 条评论
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
2234 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
2053 浏览 3 评论
4664 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
2197 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
2734 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 12:42 , Processed in 0.571405 second(s), Total 52, Slave 46 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号