当串口助手上次发出字符长度大于下一次字符长度,从消息队列中获取的数据内容存在上次数据残余。
串口空闲中断触发系统信号量,将串口上DMA内存数据“Usart_Rx_Buf”,传递给消息队列,并发出。
另一线程,接收数据
空闲中断部分:
定义部分:
消息队列的创建:
消息队列用错了。完全破坏了消息队列池。
一个消息队列,一经初始化,消息的长度就是固定的了。
也就是说 rt_mq_send 的第三个参数应该是个固定值了,第二个参数是这个固定字节长度的消息体。消息体内包含你的数据。
你把数据指针当成消息体,内部一直认为你的消息长度是 USART_RBUFF_SIZE - sizeof(void*) 这么长。所以第三次,你认为是一个字节,它认为有这么长。然后你接收打印用的字符串打印,当然会出现上一次的字符了。
谢谢,我本意是想试试这样子是否可行,
现将“send_thread_entry”中的,
buff_length@沙学政 你这么用还是有隐患,如上所说,消息队列的消息是一个固定长度的结构体,对于你这种数据长度变长的,使用邮箱可能更合适,内存池+邮箱。
消息池可以容纳的消息队列长度是 消息池字节数 / 消息体结构体字节数。也就是 rt_mq_init 的第五个和第四个参数。
在你修改后的用法里,消息队列池得整多大数组啊。
谢谢你的帮助,我已对功能做了修改,添加了内存池和邮箱的功能,之前的结构是想试试那样的形式是否可行。😁