首要总结一下串口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结构体来办理音讯行列*/
typedefstructos_q{/*QUEUECONTROLBLOCK*/
u8*OSQStart;/*Pointertostartofqueuedata*/
u8*OSQEnd;/*Pointertoendofqueuedata*/
u8*OSQIn;/*PointertowherenextmessagewillbeinsertedintheQ*/
u8*OSQOut;/*PointertowherenextmessagewillbeextractedfromtheQ*/
u8OSQSize;/*Sizeofqueue(maximumnumberofentries)*/
u8OSQEntries;/*Currentnumberofentriesinthequeue*/
}OS_Q;
OS_Q*posq,osq;
u8USART_RX_BUF[length_buff];//循环行列,存储承受的信息。
voidOS_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;
}
///*在中止函数中将一条音讯的一切字节一次性得保存在音讯行列中*/
u8message_buff[20];
voidUSART1_IRQHandler(void)
{
u8num=0;
//u8i;
u8TIme=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[]中的音讯进行处理了,这样就处理了音讯掩盖,音讯犯错无法纠正的问题,至于音讯怎样处理便是根据不同的需求不同的处理,别的留意,握手信号好用定时器中止。