摘要:各種類型的數(shù)據(jù)傳輸和存儲就涉及到大小端的問題,首先要簡單說下芯片的大小端問題,這里主要討論Cortex-M內(nèi)核。
M內(nèi)核支持大端或者小端,實際應(yīng)用中大部分內(nèi)核都是小端。以STM32為例,全部都是小端,而且是芯片設(shè)計之初就固化進(jìn)去的,不可修改。市面上其他廠家基本也都固化的小端格式。
F1編程手冊
F3和F4編程手冊
F7和H7編程手冊
各種數(shù)據(jù)類型編程EEPROM,SPI Flash等存儲器的簡易方法,一般這些存儲器都是字節(jié)編程,寫入浮點等數(shù)據(jù)類型時不太方便。這里分享一個方法,定義一個結(jié)構(gòu)體,將各種數(shù)據(jù)類型封裝進(jìn)去:
寫入的時候采用下面方式:
讀取時可以采用下面方式:
各種數(shù)據(jù)類型的SPI,UART,I2C等傳輸問題。這里我們以串口通信為例,比如主機(jī)要發(fā)送如下格式數(shù)據(jù)給從機(jī):
我們可以做一個如下結(jié)構(gòu)體格式:
typedefstruct { uint8_tucStart; uint16_tusCO2; uint16_tusPM25; uint16_tusHumidity; floatTemprature; uint32_tulParam; uint8_tucEnd1; uint8_tucEnd2; } UART_T; UART_Tg_tUartParam;
主機(jī)發(fā)送的時候我們就可以采用如下方法:
comSendBuf(COM1,(uint8_t*)&g_tUartParam,sizeof(UART_T));
從機(jī)工程也定義一個同樣的結(jié)構(gòu)體變量,比如我們把接收到一幀數(shù)據(jù)存到緩沖uint8_t buf[50]里面了。
我們就可以定義一個結(jié)構(gòu)體指針變量:
UART_T*pUartParam; pUartParam=(UART_T*)buf;
那么我們就可以pUartParam->usCO2,pUartParam->Temprature等方式來訪問,非常方便。
代碼實現(xiàn)
結(jié)構(gòu)體數(shù)據(jù)如下:
typedefstruct { uint8_tucStart; uint16_tusCO2; uint16_tusPM25; uint16_tusHumidity; floatTemprature; uint32_tulParam; uint8_tucEnd1; uint8_tucEnd2; } USART_T; USART_Tg_tUartParam;/*串口1發(fā)送數(shù)據(jù)使用*/ USART_T*pUartParam;/*串口2接數(shù)據(jù)使用*/ uint8_tbuf[128];/*接收記錄緩沖*/
數(shù)據(jù)收發(fā)處理:
/* ********************************************************************************************************* *函數(shù)名:main *功能說明:c程序入口 *形參:無 *返回值:錯誤代碼(無需處理) ********************************************************************************************************* */ intmain(void) { uint8_tucKeyCode; uint8_tread; uint8_tucStatus=0;/*狀態(tài)機(jī)標(biāo)志*/ uint8_tucCount=0; floatftest=0.11f; pUartParam=(USART_T*)buf; bsp_Init();/*硬件初始化*/ PrintfLogo();/*打印例程名稱和版本等信息*/ PrintfHelp();/*打印操作提示*/ bsp_StartAutoTimer(0,100);/*啟動1個100ms的自動重裝的定時器*/ memset(buf,0,128); /*進(jìn)入主程序循環(huán)體*/ while(1) { bsp_Idle();/*這個函數(shù)在bsp.c文件。用戶可以修改這個函數(shù)實現(xiàn)CPU休眠和喂狗*/ /*判斷定時器超時時間*/ if(bsp_CheckTimer(0)) { /*每隔100ms進(jìn)來一次*/ bsp_LedToggle(2); } /*按鍵濾波和檢測由后臺systick中斷服務(wù)程序?qū)崿F(xiàn),我們只需要調(diào)用bsp_GetKey讀取鍵值即可。*/ ucKeyCode=bsp_GetKey();/*讀取鍵值,無鍵按下時返回KEY_NONE=0*/ if(ucKeyCode!=KEY_NONE) { switch(ucKeyCode) { caseKEY_DOWN_K1:/*K1鍵按下,串口1發(fā)送數(shù)據(jù)給串口2*/ g_tUartParam.ucStart='$'; g_tUartParam.usCO2=1; g_tUartParam.usPM25=2; g_tUartParam.usHumidity=3; g_tUartParam.Temprature=ftest++; g_tUartParam.ulParam=5; g_tUartParam.ucEnd1=' '; g_tUartParam.ucEnd2=' '; comSendBuf(COM1,(uint8_t*)&g_tUartParam,sizeof(UART_T)); printf("發(fā)送數(shù)據(jù)完成 "); break; default: /*其它的鍵值不處理*/ break; } } /*串口2接收數(shù)據(jù)解析處理*/ if(comGetChar(COM2,&read)) { switch(ucStatus) { /*狀態(tài)0保證接收到0x01*/ case0: if(read=='$') { ucStatus=1; buf[ucCount++]=read; } break; case1: buf[ucCount]=read; /*接收夠15個數(shù)據(jù)*/ if((buf[ucCount-1]==' ')&&(buf[ucCount]==' ')) { /*打印接收到的數(shù)據(jù)值*/ printf("接收到的數(shù)據(jù): "); printf("pUartParam->usCO2=%d ",pUartParam->usCO2); printf("pUartParam->usPM25=%d ",pUartParam->usPM25); printf("pUartParam->usHumidity=%d ",pUartParam->usHumidity); printf("pUartParam->Temprature=%f ",pUartParam->Temprature); printf("pUartParam->ulParam=%d ",pUartParam->ulParam); printf(" "); memset(buf,0,128); ucStatus=0; ucCount=0; } else { ucCount++; } break; default: break; } } } }
測試效果
?
-
嵌入式
+關(guān)注
關(guān)注
5092文章
19178瀏覽量
307696 -
內(nèi)核
+關(guān)注
關(guān)注
3文章
1382瀏覽量
40425 -
STM32
+關(guān)注
關(guān)注
2272文章
10924瀏覽量
357584 -
C語言
+關(guān)注
關(guān)注
180文章
7614瀏覽量
137724 -
Cortex-M
+關(guān)注
關(guān)注
2文章
229瀏覽量
29842
原文標(biāo)題:一種用于嵌入式通信傳輸以及存儲設(shè)備的簡易C語言實現(xiàn)方法
文章出處:【微信號:嵌入式情報局,微信公眾號:嵌入式情報局】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
嵌入式軟件開發(fā)語言 嵌入式C編程到底是什么呢?是C語言的變形么?
一種嵌入式系統(tǒng)用于多媒體實時數(shù)據(jù)的網(wǎng)絡(luò)傳輸設(shè)計
嵌入式系統(tǒng)對通信有什么需求?
介紹一種嵌入式系統(tǒng)仿真方法
嵌入式平臺C語言實現(xiàn)二階濾波器的方法
嵌入式Linux存儲設(shè)備包含什么
一種在SoC嵌入式存儲器測試期間壓縮診斷信息方法介紹
一種嵌入式Linux與Windows JVM通信實現(xiàn)
一種嵌入式手持設(shè)備的無線數(shù)據(jù)通信模塊擴(kuò)展方法
可用于嵌入式系統(tǒng)的傅立葉變換的C語言實現(xiàn)方法
![可<b class='flag-5'>用于</b><b class='flag-5'>嵌入式</b>系統(tǒng)的傅立葉變換的<b class='flag-5'>C</b><b class='flag-5'>語言實現(xiàn)</b><b class='flag-5'>方法</b>](https://file.elecfans.com/web1/M00/93/46/o4YBAFzp7PCAFmLhAAANpRnyIi8896.jpg)
用于嵌入式系統(tǒng)中的無線通信方法
![<b class='flag-5'>用于</b><b class='flag-5'>嵌入式</b>系統(tǒng)中的無線<b class='flag-5'>通信</b><b class='flag-5'>方法</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
標(biāo)準(zhǔn)c語言與嵌入式,嵌入式C語言與C語言的區(qū)別
![標(biāo)準(zhǔn)<b class='flag-5'>c</b><b class='flag-5'>語言</b>與<b class='flag-5'>嵌入式</b>,<b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>語言</b>與<b class='flag-5'>C</b><b class='flag-5'>語言</b>的區(qū)別](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
C語言嵌入式培訓(xùn) 嵌入式C語言程序設(shè)計基礎(chǔ)
![<b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>嵌入式</b>培訓(xùn) <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>語言</b>程序設(shè)計基礎(chǔ)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論