摘要:關(guān)于串口的讀取是有固定套路的,所以這里多帶帶拉出來(lái)講一下,后面用到串口時(shí)候,直接復(fù)制粘貼就可以了。
關(guān)于串口的讀取是有固定套路的,所以這里多帶帶拉出來(lái)講一下,后面用到串口時(shí)候,直接復(fù)制粘貼就可以了。
本文從cubmax配置到代碼的編寫
點(diǎn)開(kāi)串口8(其他串口一樣)
點(diǎn)開(kāi)asynchronous
點(diǎn)開(kāi)中斷,這個(gè)必須要點(diǎn)
點(diǎn)開(kāi)dma,循環(huán)模式 數(shù)據(jù)長(zhǎng)度炫byte(這些參數(shù)需要自己網(wǎng)上查,還有dma的作用這些基礎(chǔ)的東西都要了解一下)
看要用多少波特率的串口,發(fā)送端接收端要一樣不然接收不到
時(shí)鐘點(diǎn)到最高,這里是168hz
1是項(xiàng)目名稱
2路徑不能有中文
3炫mdk右邊那個(gè)電5
四個(gè)點(diǎn)上去
生成代碼
main函數(shù)內(nèi)2句話初始化一下
其中可以去查查UART_IT_IDLE空閑中斷跟其他幀中斷之間的區(qū)別,這里一半用空閑中斷
XYZ_BUFFER是數(shù)組首地址
串口收到的消息會(huì)放到這個(gè)數(shù)組內(nèi)
因?yàn)橥勇輧x數(shù)據(jù)是11位所以這邊11位11位地收數(shù)據(jù)
unsigned char XYZ_BUFFER[20];//陀螺儀
中斷內(nèi)的函數(shù):
void UART8_IRQHandler(void){ /* USER CODE BEGIN UART8_IRQn 0 */ uint16_t temp; uint8_t j=0,sum=0; if(__HAL_UART_GET_FLAG(&huart8,UART_FLAG_IDLE)==SET)//標(biāo)志位:如果檢測(cè)到收到數(shù)據(jù)了就進(jìn)入這個(gè)if { __HAL_UART_CLEAR_IDLEFLAG(&huart8);//清除標(biāo)志位,方便下次收數(shù)據(jù) HAL_UART_DMAStop(&huart8);// 1 temp=11-hdma_uart8_rx.Instance->NDTR;// 2 HAL_UART_Transmit_DMA(&huart8,XYZ_BUFFER,temp); //3 for(j=0;j<10;j++) sum+=XYZ_BUFFER[j]; if(sum==XYZ_BUFFER[10]&&XYZ_BUFFER[1]==0x53) { Roll=(float)((XYZ_BUFFER[3]<<8)|XYZ_BUFFER[2])/32768*180;// Pich=(float)((XYZ_BUFFER[5]<<8)|XYZ_BUFFER[4])/32768*180; Yaw =(float)((XYZ_BUFFER[7]<<8)|XYZ_BUFFER[6])/32768*180; }} HAL_UART_Receive_DMA(&huart8,XYZ_BUFFER,11); //4 /* USER CODE END UART8_IRQn 0 */ HAL_UART_IRQHandler(&huart8); /* USER CODE BEGIN UART8_IRQn 1 */ /* USER CODE END UART8_IRQn 1 */}
代碼中分為1234部
1:前面說(shuō)了,單片機(jī)接收到串口的數(shù)據(jù)之后,會(huì)通過(guò)dma直接把數(shù)據(jù)送到cpu,這樣操作大大提高了信息傳輸速度,但是有一個(gè)小問(wèn)題,就是串口可能沒(méi)發(fā)夠11位數(shù)據(jù),所以第一步要暫停dma接收,
2:因?yàn)槲覀円?1byte數(shù)據(jù),所以用11減去ndtr寄存器(這個(gè)寄存器記錄當(dāng)前代碼收到幾個(gè)數(shù)據(jù))比如收到5個(gè),temp就=11-5=6
3:湊齊11個(gè)byte數(shù)據(jù),所以向CPU再發(fā)送temp個(gè),比如前面只有5個(gè),這里發(fā)送6個(gè)
至此,CPU內(nèi)也就是XYZ_BUFFER這個(gè)數(shù)組內(nèi)已經(jīng)有11個(gè)數(shù)據(jù)了,但是,還沒(méi)完,我們是隨便抽取了一段連續(xù)的11字節(jié)數(shù)據(jù),所以會(huì)遇到這種情況,就是這11位數(shù)據(jù)不是一段有效幀,而是無(wú)效幀(無(wú)效幀:比如傳感器的數(shù)據(jù)為1 2 3 4 … 11 ,而我們接收到的數(shù)據(jù)卻是:8 9 10 11 1 …7;也就是截取到前一半和后一半)為了判斷這一幀數(shù)據(jù)是不是有效數(shù)據(jù),在3和4之間做的就是判斷,具體如何判斷有效幀一般產(chǎn)品介紹書會(huì)說(shuō),陀螺儀這11幀數(shù)據(jù)有個(gè)數(shù)據(jù)校驗(yàn)幀
懶得找說(shuō)明書,我直接貼了:從第一個(gè)數(shù)據(jù)到底10個(gè)數(shù)據(jù)累加會(huì)等于底11個(gè)數(shù)據(jù)校驗(yàn)幀
串口讀取結(jié)束,我們拿到了需要的數(shù)據(jù),并且將它存入結(jié)構(gòu)體xyz
4:重新發(fā)送11幀
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/120920.html
摘要:觀看學(xué)習(xí)上官可編程陳立臣老師的樹(shù)莓派視頻,在其過(guò)程中所記錄的學(xué)習(xí)筆記一串口通信概念串口通信用于多機(jī)通信串口通信屬于全雙工通信,即雙方可以同時(shí)進(jìn)行交流半雙工通信,一次只允許一方進(jìn)行通信樹(shù)莓派進(jìn)行串口通信一般要連接兩根線和 ...
摘要:使用庫(kù)讀寫環(huán)境光照度傳感器本文將教大家如何快速使用庫(kù)讀取光照度數(shù)據(jù)。五實(shí)驗(yàn)樣機(jī)測(cè)試展示通過(guò)之前配置好的面板,通過(guò)涂鴉智能進(jìn)行配網(wǎng)實(shí)時(shí)采集光照度傳感器的數(shù)據(jù)。 使用STM32 HAL庫(kù)讀寫環(huán)境光照度傳感器(BH1750) 本文將教大家如何快速使用STM32HAL庫(kù)讀取光照度數(shù)據(jù)。 實(shí)現(xiàn)功能:通...
摘要:串口通信以自己剛做的功能做為核心記錄這篇博客是基于通信協(xié)議之間的通信是十六進(jìn)制進(jìn)行通信的可選波特率,數(shù)據(jù)位停止位采用校驗(yàn)功能和代碼的實(shí)現(xiàn)界面是用窗體表現(xiàn)的界面的實(shí)現(xiàn)就不過(guò)多的貼代碼和說(shuō)怎么去實(shí)現(xiàn)了,有個(gè)很好用的工具,可以直接拖控件,跟做很像 串口通信以自己剛做的功能做為核心記錄這篇博客①. 是基于modbus通信協(xié)議之間的通信②. 是十六進(jìn)制進(jìn)行通信的③. 可選波特率,數(shù)據(jù)位 停止位④...
閱讀 2372·2023-04-25 14:17
閱讀 1561·2021-11-23 10:02
閱讀 2208·2021-11-23 09:51
閱讀 921·2021-10-14 09:49
閱讀 3420·2021-10-11 10:57
閱讀 2970·2021-09-24 09:47
閱讀 3084·2021-08-24 10:00
閱讀 2333·2019-08-29 18:46