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》一样,首先接收,然后处理,没有消息验证处理,这样就会出现消息覆盖,消息出错后死机,无法明确区分命令,无法及时应答握手信号。方案二,借鉴uC/OSII的消息队列,进入中断服务函数之后,关闭中断,接收数据,如果没有数据接收,等待一段时间(时间和波特率有关)后开中断,出中断,然后在对接收到的数据进行处理,下面看代码:

消息队列及其初始化函数:

/*osq结构体来管理消息队列*/
typedef struct os_q {                   /* QUEUE CONTROL BLOCK                                         */
     u8         *OSQStart;            /* Pointer to start of queue data                              */
    u8        *OSQEnd;              /* Pointer to end   of queue data                              */
    u8        *OSQIn;               /* Pointer to where next message will be inserted  in   the Q  */
      u8         *OSQOut;              /* Pointer to where next message will be extracted from the Q  */
      u8         OSQSize;             /* Size of queue (maximum number of entries)                   */
      u8         OSQEntries;          /* Current number of entries in the queue                      */
} OS_Q;
OS_Q  *posq,osq;
u8 USART_RX_BUF[length_buff];     //循环队列,存储接受的信息.
void OS_QInit()  //初始化结构体
{
posq=&osq;
posq->OSQStart=USART_RX_BUF;
posq->OSQEnd=&USART_RX_BUF[length_buff];
posq->OSQIn=USART_RX_BUF;
posq->OSQOut=USART_RX_BUF;
posq->OSQSize=length_buff;
posq->OSQEntries=0;
}
///*在中断函数中将一条消息的所有字节一次性得保存在消息队列中*/
u8 message_buff[20];
void USART1_IRQHandler(void)
{
u8 num=0;
// u8 i;
u8 time=0;//接受超时技术
USART1->CR1&=0XFFDF;
LED=!LED;
while(1)
{
if(USART1->SR&(1<<5))  //如果有数据收到的话,将消息存在消息队列中
{
message_buff[num]=(u8)USART1->DR;
num++;
 
*posq->OSQIn++=(u8)USART1->DR;
posq->OSQEntries++;
if(posq->OSQIn==posq->OSQEnd)
{
 posq->OSQIn = posq->OSQStart;
}
time=0; 
}
else 
{
delay_us(10); 
time++;
if(time>=50) break;

}
}
USART1->CR1|=0X0020; 
}


这样就把数据一次性全部存储下来了,剩下的就是对消息缓冲器message_buff[]中的消息进行处理了,这样就解决了消息覆盖,消息出错无法纠正的问题,至于消息怎么处理就是依据不同的需求不同的处理,另外注意,握手信号好用定时器中断。

你可能感兴趣的:(实验总结)