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