基于STM32实现串口的两个分案解析.doc

上传人:白大夫 文档编号:3412149 上传时间:2019-08-22 格式:DOC 页数:3 大小:18.50KB
返回 下载 相关 举报
基于STM32实现串口的两个分案解析.doc_第1页
第1页 / 共3页
亲,该文档总共3页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《基于STM32实现串口的两个分案解析.doc》由会员分享,可在线阅读,更多相关《基于STM32实现串口的两个分案解析.doc(3页珍藏版)》请在三一文库上搜索。

1、基于STM32实现串口的两个分案解析首先总结一下串口232,422,485串口232:可双向传输,全双工,最大速率20Kbps,负逻辑电平,-15V-3V逻辑“1”,+3V+15V逻辑“0”。串口422:可双向传输,4线全双工,2线单工。串口485:可双向传输,4线全双工,2线单工,最大速率10Mb/s,差分信号,发送端:+2V+6V逻辑“1”,-2V-6V逻辑“0”,接收端:+200mV逻辑“1”,-200mV逻辑“0”。对于串口的实现有以两个方案:方案一,和原子的例说STM32一样,首先接收,然后处理,没有消息验证处理,这样就会出现消息覆盖,消息出错后死机,无法明确区分命令,无法及时应答握

2、手信号。方案二,借鉴uC/OSII的消息队列,进入中断服务函数之后,关闭中断,接收数据,如果没有数据接收,等待一段时间(时间和波特率有关)后开中断,出中断,然后在对接收到的数据进行处理,下面看代码:消息队列及其初始化函数:/*osq结构体来管理消息队列*/typedefstructos_q/*QUEUECONTROLBLOCK*/u8*OSQStart;/*Pointertostartofqueuedata*/u8*OSQEnd;/*Pointertoendofqueuedata*/u8*OSQIn;/*PointertowherenextmessagewillbeinsertedintheQ

3、*/u8*OSQOut;/*PointertowherenextmessagewillbeextractedfromtheQ*/u8OSQSize;/*Sizeofqueue(maximumnumberofentries)*/u8OSQEntries;/*Currentnumberofentriesinthequeue*/OS_Q;OS_Q*posq,osq;u8USART_RX_BUFlength_buff;/循环队列,存储接受的信息。voidOS_QInit()/初始化结构体posq=posq-OSQStart=USART_RX_BUF;posq-OSQEnd=posq-OSQIn=USA

4、RT_RX_BUF;posq-OSQOut=USART_RX_BUF;posq-OSQSize=length_buff;posq-OSQEntries=0;/*在中断函数中将一条消息的所有字节一次性得保存在消息队列中*/u8message_buff20;voidUSART1_IRQHandler(void)u8num=0;/u8i;u8time=0;/接受超时技术USART1-CR1LED=!LED;while(1)if(USART1-SRmessage_buffnum=(u8)USART1-DR;num+;*posq-OSQIn+=(u8)USART1-DR;posq-OSQEntries+;if(posq-OSQIn=posq-OSQEnd)posq-OSQIn=posq-OSQStart;TIme=0;elsedelay_us(10);TIme+;if(TIme=50)break;USART1-CR1|=0X0020;这样就把数据一次性全部存储下来了,剩下的就是对消息缓冲器message_buff中的消息进行处理了,这样就解决了消息覆盖,消息出错无法纠正的问题,至于消息怎么处理就是依据不同的需求不同的处理,另外注意,握手信号好用定时器中断。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1