NUC100RE3AN串口接收程序

来源:互联网 发布:嘉兴王店网络维修电话 编辑:程序博客网 时间:2024/04/29 05:06

读这篇文章之前,要先读上一篇文章《NUC100RE3AN串口驱动库修改》

本人在实习中的项目需要接收一个具有25个数据的包,起始0x0f,结束0x00,需要用定时器检测是否丢包,使用库函数DrvUART_Read效果并不好。下面给出我的做法。

1、首先是初始化

</pre><pre name="code" class="plain">
void init(){UNLOCKREG ();DrvSYS_Open (12000, 50000);DrvSYS_SetOscCtrl (E_SYS_XTL12M, 1);DrvSYS_SetHCLKSource (2);DrvSYS_SetIPClockSource (E_SYS_UART_CLKSRC, 0);DrvGPIO_InitFunction (FUNC_UART2);//UART²ÎÊýÅäÖÃuartParam.u32BaudRate = 100000;uartParam.u8cDataBits = DRVUART_DATABITS_8;uartParam.u8cParity = DRVUART_PARITY_EVEN;uartParam.u8cStopBits = DRVUART_STOPBITS_2;uartParam.u8TimeOut = 30;uartParam.u8cRxTriggerLevel = DRVUART_FIFO_62BYTES;DrvUART_Open(UART_PORT2, &uartParam);DrvUART_EnableInt(UART_PORT2 ,DRVUART_RDAINT, (PFN_DRVUART_CALLBACK *)UART_Callback);}


</pre><pre name="code" class="plain">

2、产生接收中断时的回调函数。

void UART_Callback(uint32_t u32uart2IntStatus){uint32_t i;if(u32uart2IntStatus & DRVUART_RDAINT){while(1){while( (UART2->FSR.RX_EMPTY)==1 ){i++;if(i>100000){goto NEXT;}}UART_data[UART_data_Index] = UART2->DATA;if(UART_data[0]!=0x0f){UART_data_Index=0;}else{UART_data_Index++;if(UART_data_Index>24){break;}}}NEXT:if(UART_data_Index>24)//进行相应的处理{if( UART_data[0]==0x0f ){if(UART_data[24]==0x00){}}}}}

说明:

if(u32uart2IntStatus & DRVUART_RDAINT)这个判断必须有。因为UART2的接收缓存只有16个字节,溢出时也会产生中断。而我需要连续接收25个。
goto语句纯属贪一时方便,建议进行修改。





0 0
原创粉丝点击