3 回答

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊
單片機(jī)有串口中斷。串口每收到1byte數(shù)據(jù)就會(huì)觸發(fā)1次接收中斷。中斷一般像下面這面,你可以根據(jù)自己的需求改。我的做法是中段里只管接收數(shù)據(jù),然后定時(shí)器中監(jiān)測(cè)一定時(shí)間內(nèi)沒有收到數(shù)據(jù),認(rèn)為數(shù)據(jù)接收完畢,然后置位接受完成標(biāo)志。在主函數(shù)中查詢這個(gè)標(biāo)志,進(jìn)行數(shù)據(jù)處理。
123456789101112131415161718192021222324 | void USART1_IRQHandler ( void ) //串口中斷 { u8 dat,flag = 0; if (USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET) { USART_ClearITPendingBit(USART1,USART_IT_ORE); dat = USART_ReceiveData(USART1); flag = 1; } if (USART_GetITStatus(USART1,USART_IT_RXNE)!= RESET) //Receive Data register not empty interrupt. { USART_ClearITPendingBit(USART1,USART_IT_RXNE); dat = USART_ReceiveData(USART1); flag = 1; } if (flag == 1) { Uart1RecvOver.recvOver = 0; if (PushInQueue_Q(&uart1RecvQueue, dat)) Uart1RecvOver.recvTimeCnt = 0; else Uart1RecvOver.recvTimeCnt = USART_RECV_END_TIME; } } |

TA貢獻(xiàn)1909條經(jīng)驗(yàn) 獲得超7個(gè)贊
單片機(jī)接收處理串口的數(shù)據(jù)的過程就是配置好波特率、位寬、校驗(yàn)位等,收到數(shù)據(jù) 后可以引起中斷,也可以查詢標(biāo)志位,然后進(jìn)行相應(yīng)的處理。
1) 串口時(shí)鐘使能,GPIO 時(shí)鐘使能。
2) 設(shè)置引腳復(fù)用器映射:調(diào)用 GPIO_PinAFConfig 函數(shù)。
3) GPIO 初始化設(shè)置:要設(shè)置模式為復(fù)用功能。
4) 串口參數(shù)初始化:設(shè)置波特率,字長,奇偶校驗(yàn)等參數(shù)。
5) 開啟中斷并且初始化 NVIC,使能中斷(如果需要開啟中斷才需要這個(gè)步驟)。
6) 使能串口。
7) 編寫中斷處理函數(shù):函數(shù)名格式為 USARTxIRQHandler(x 對(duì)應(yīng)串口號(hào))

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超11個(gè)贊
串口通信是有協(xié)議的,所有操作都得按照協(xié)議來,和你用什么編譯器/編輯器或者框架無關(guān),如何讀取數(shù)據(jù)要看你的單片機(jī)硬件了:
有串口->直接讀取寄存器的數(shù)據(jù)就行了,每次一個(gè)BYTE,一般該寄存器都命名為SBUF
無串口->需使用軟件模擬串口通信。
添加回答
舉報(bào)