![]()
在glaobal.h文件中。
extern USART_STOR USART1_Stor;
五、串口接收函数。
在core.c文件中。
#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR_HOOK(void)
{
EUSCI_A_UART_clearInterrupt(EUSCI_A0_BASE,EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG);
USART1_Stor.rx_data=EUSCI_A_UART_receiveData(EUSCI_A0_BASE);
if(USART1_Stor.status==header0)
{
if(USART1_Stor.rx_data==0xAA)
USART1_Stor.status=header1;
else
USART1_Stor.status=header0;

}
else if(USART1_Stor.status==header1)
{
if(USART1_Stor.rx_data==0x55)
USART1_Stor.status=addr;
else
USART1_Stor.status=header0;
}
elseif(USART1_Stor.status==addr)
{
if(USART1_Stor.rx_data==0x7e||USART1_Stor.rx_data==0xFF)
USART1_Stor.status=datalen;
else
USART1_Stor.status=header0;
}

elseif(USART1_Stor.status==datalen)
{
USART1_Stor.rx_checksum=USART1_Stor.rx_data;
USART1_Stor.rx_datalen=USART1_Stor.rx_data;
USART1_Stor.status=data;
}
else if(USART1_Stor.status==data)
{
USART1_Stor.rx_checksum+=USART1_Stor.rx_data;
USART1_Stor.rx_buf[USART1_Stor.rx_num]=USART1_Stor.rx_data;
USART1_Stor.rx_num=USART1_Stor.rx_num+1;
if(USART1_Stor.rx_num==USART1_Stor.rx_datalen)
USART1_Stor.status=check;
else
USART1_Stor.status=data;

}
elseif(USART1_Stor.status==check)
{
if(USART1_Stor.rx_checksum==USART1_Stor.rx_data)
USART1_Stor.status=tail;
else
USART1_Stor.status=header0;
}
elseif(USART1_Stor.status==tail)
{
if(USART1_Stor.rx_data==0xFF)
{
USART1_Stor.status=ok;
EUSCI_A_UART_transmitData(EUSCI_A0_BASE,0xAA);
}

else
USART1_Stor.status=header0;
}
}
六、数据包解析。
在main.c文件中。
if(USART1_Stor.status==ok)
{
PC_Process(USART1_Storage.Rxbuf,USART1_Storage.Rxnum);
USART1_Stor.status=header0;
USART1_Stor.rx_num=0;
}
结尾:
曾经看到stm32很多变量就是采用结构体封装的方法,今天自己写函数也感受了一把。这种方法在小规模的代码中,体验感不强。在大型程序中,体验感比较好。特别是对于于有多个串口函数的情况下,而且,单步调试的之后,只应该填一个USART1_Stor值私有化协议,就可以观察结构体外部所有变量的值私有化协议,很爽。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shouji/article-128417-1.html
看了南方不在质量上下功夫