最近做一个中继,一边是基于Wifi的网络,一边是基于串口的嵌入式设备。两者之间通过中继进行通信。
具体结构:
网络设备(手机,pad,PC等等)→→ WIFI网络→→ UART1→→ STM32消息队列→→UART2→→ 嵌入式设备
直连的话会遇到以下 2 个问题:
1.当WIFI网络或嵌入式设备发送来的数据过多,接收后来不及发送给另一边。数据会丢失
2.数据不定长
所以用了下面 2 个解决方法:
1.基于Ucos的消息队列:将接收到的数据立刻存入队列中,达到一个缓冲的目的。保证接收到数据都发送出去,当然缓冲时的数据不能多余消息队列的开的大小。(消息队列开的过大会造成硬件中断,所有程序无法执行。)
2.串口空闲中断,当串口idle中断时,通过控制DMA通道的使能,来接收数据。节约CPU资源。稳定可靠。
PCB截图:
开始码代码:
STM32的Ucos移植就不说了,网上一抓一大把。
首先搭建任务,很明显这个项目里需要两个Task。
一个是Task_ReadFromWifi(),用来从wifi网络中读取数据,然后存入消息队列
另一个是Task_ReadFromUart(),用来从嵌入式设备中读取数据,然后存入消息队列
构建任务,每一个任务相当于一个线程。他需要三个必须的东西:身份证(任务管理模块),