摘要:各種類(lèi)型的數(shù)據(jù)傳輸和存儲(chǔ)就涉及到大小端的問(wèn)題,首先要簡(jiǎn)單說(shuō)下芯片的大小端問(wèn)題,這里主要討論Cortex-M內(nèi)核。

M內(nèi)核支持大端或者小端,實(shí)際應(yīng)用中大部分內(nèi)核都是小端。以STM32為例,全部都是小端,而且是芯片設(shè)計(jì)之初就固化進(jìn)去的,不可修改。市面上其他廠家基本也都固化的小端格式。
F1編程手冊(cè)

F3和F4編程手冊(cè)

F7和H7編程手冊(cè)

各種數(shù)據(jù)類(lèi)型編程EEPROM,SPI Flash等存儲(chǔ)器的簡(jiǎn)易方法,一般這些存儲(chǔ)器都是字節(jié)編程,寫(xiě)入浮點(diǎn)等數(shù)據(jù)類(lèi)型時(shí)不太方便。這里分享一個(gè)方法,定義一個(gè)結(jié)構(gòu)體,將各種數(shù)據(jù)類(lèi)型封裝進(jìn)去:

寫(xiě)入的時(shí)候采用下面方式:

讀取時(shí)可以采用下面方式:

各種數(shù)據(jù)類(lèi)型的SPI,UART,I2C等傳輸問(wèn)題。這里我們以串口通信為例,比如主機(jī)要發(fā)送如下格式數(shù)據(jù)給從機(jī):

我們可以做一個(gè)如下結(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ā)送的時(shí)候我們就可以采用如下方法:
comSendBuf(COM1,(uint8_t*)&g_tUartParam,sizeof(UART_T));
從機(jī)工程也定義一個(gè)同樣的結(jié)構(gòu)體變量,比如我們把接收到一幀數(shù)據(jù)存到緩沖uint8_t buf[50]里面了。
我們就可以定義一個(gè)結(jié)構(gòu)體指針變量:
UART_T*pUartParam; pUartParam=(UART_T*)buf;
那么我們就可以pUartParam->usCO2,pUartParam->Temprature等方式來(lái)訪問(wèn),非常方便。
代碼實(shí)現(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
*功能說(shuō)明:c程序入口
*形參:無(wú)
*返回值:錯(cuò)誤代碼(無(wú)需處理)
*********************************************************************************************************
*/
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);/*啟動(dòng)1個(gè)100ms的自動(dòng)重裝的定時(shí)器*/
memset(buf,0,128);
/*進(jìn)入主程序循環(huán)體*/
while(1)
{
bsp_Idle();/*這個(gè)函數(shù)在bsp.c文件。用戶可以修改這個(gè)函數(shù)實(shí)現(xiàn)CPU休眠和喂狗*/
/*判斷定時(shí)器超時(shí)時(shí)間*/
if(bsp_CheckTimer(0))
{
/*每隔100ms進(jìn)來(lái)一次*/
bsp_LedToggle(2);
}
/*按鍵濾波和檢測(cè)由后臺(tái)systick中斷服務(wù)程序?qū)崿F(xiàn),我們只需要調(diào)用bsp_GetKey讀取鍵值即可。*/
ucKeyCode=bsp_GetKey();/*讀取鍵值,無(wú)鍵按下時(shí)返回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個(gè)數(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;
}
}
}
}
測(cè)試效果
?
-
嵌入式
+關(guān)注
關(guān)注
5186文章
20159瀏覽量
328983 -
內(nèi)核
+關(guān)注
關(guān)注
4文章
1436瀏覽量
42500 -
STM32
+關(guān)注
關(guān)注
2305文章
11122瀏覽量
371202 -
C語(yǔ)言
+關(guān)注
關(guān)注
183文章
7642瀏覽量
144639 -
Cortex-M
+關(guān)注
關(guān)注
2文章
234瀏覽量
30969
原文標(biāo)題:一種用于嵌入式通信傳輸以及存儲(chǔ)設(shè)備的簡(jiǎn)易C語(yǔ)言實(shí)現(xiàn)方法
文章出處:【微信號(hào):嵌入式情報(bào)局,微信公眾號(hào):嵌入式情報(bào)局】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
C語(yǔ)言在嵌入式開(kāi)發(fā)中的應(yīng)用
嵌入式軟件開(kāi)發(fā)語(yǔ)言 嵌入式C編程到底是什么呢?是C語(yǔ)言的變形么?
一種嵌入式系統(tǒng)用于多媒體實(shí)時(shí)數(shù)據(jù)的網(wǎng)絡(luò)傳輸設(shè)計(jì)
介紹一種嵌入式系統(tǒng)仿真方法
嵌入式平臺(tái)C語(yǔ)言實(shí)現(xiàn)二階濾波器的方法
嵌入式Linux存儲(chǔ)設(shè)備包含什么
一種在SoC嵌入式存儲(chǔ)器測(cè)試期間壓縮診斷信息方法介紹
一種嵌入式Linux與Windows JVM通信實(shí)現(xiàn)
嵌入式c語(yǔ)言編程(由淺入深)
一種嵌入式手持設(shè)備的無(wú)線數(shù)據(jù)通信模塊擴(kuò)展方法
可用于嵌入式系統(tǒng)的傅立葉變換的C語(yǔ)言實(shí)現(xiàn)方法
用于嵌入式系統(tǒng)中的無(wú)線通信方法
標(biāo)準(zhǔn)c語(yǔ)言與嵌入式,嵌入式C語(yǔ)言與C語(yǔ)言的區(qū)別
C語(yǔ)言嵌入式培訓(xùn) 嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)

一種用于嵌入式通信傳輸和存儲(chǔ)設(shè)備的C語(yǔ)言實(shí)現(xiàn)方法
評(píng)論