环形队列Рstructicar_rx{Рu8buf[RX_BUF_SIZE];Рu8*out_last;Рu8*in_last;Рboolempty;Рboolfull;Рboollost_data;Р};Р接收队列稍微复杂一点,当应用程序需要从buffer里取数据时,需要判断队列是否为空,如果标志empty为真,则无数据,否则可以取数据;另外,也要检查lost_data标志,如果为真,说明接收队列已满,无法接受新数据,直接把新数据做丢弃处理,此时需要检查应用程序架构设计是否合理,因为mcu的速度是很快的(如72MHz),而串口速度比较慢(如115200baud,约12k字节/秒),这样的条件下都发生接收数据丢失,真的需要改进应用程序。Р3,DMA方式РDMA方式适合于高速设置的数据传输,但在我的应用中,Uart的速度并不是很高,所以并不合适。DMA方式有个缺点,就是STM32的DMA通道有限,如果其它设备占用了通道,那么就不能使用,详见下表:РРРР同样也定义了一个结构,但用了2个buffer,做乒乓算法:当DMA正使用bufl时,需要发送到数据保存到buf2里;Р当buf2被DMA使用时,就保存到bufl。Рstructicar_tx{Рu8buf1[TX_BUF_SIZE];Рu8buf2[TX_BUF_SIZE];Рu32buf1_cnt;Рu32buf2_cnt;Рbooluse_buf1;Рbooluse_buf2;Р};Р接收功能没有用DMA方式,但原理是一样的,都可以开2个缓存,应用程序处理起来就麻烦一点。Р如果有高人有很高效的办法,不妨介绍一下,谢谢。Р上文提到的3种模式的驱动下载:stm32_uart.rarР清晰图片及相关程序下载,请访问原文链接:Рhttp://cn0086.info/?p=351Р如不能访问,请添加此备用DNS服务器:8.8.8.8