摘要:各種類型的數據傳輸和存儲就涉及到大小端的問題,首先要簡單說下芯片的大小端問題,這里主要討論Cortex-M內核。

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

F3和F4編程手冊

F7和H7編程手冊

各種數據類型編程EEPROM,SPI Flash等存儲器的簡易方法,一般這些存儲器都是字節編程,寫入浮點等數據類型時不太方便。這里分享一個方法,定義一個結構體,將各種數據類型封裝進去:

寫入的時候采用下面方式:

讀取時可以采用下面方式:

各種數據類型的SPI,UART,I2C等傳輸問題。這里我們以串口通信為例,比如主機要發送如下格式數據給從機:

我們可以做一個如下結構體格式:
typedefstruct
{
uint8_tucStart;
uint16_tusCO2;
uint16_tusPM25;
uint16_tusHumidity;
floatTemprature;
uint32_tulParam;
uint8_tucEnd1;
uint8_tucEnd2;
}
UART_T;
UART_Tg_tUartParam;
主機發送的時候我們就可以采用如下方法:
comSendBuf(COM1,(uint8_t*)&g_tUartParam,sizeof(UART_T));
從機工程也定義一個同樣的結構體變量,比如我們把接收到一幀數據存到緩沖uint8_t buf[50]里面了。
我們就可以定義一個結構體指針變量:
UART_T*pUartParam; pUartParam=(UART_T*)buf;
那么我們就可以pUartParam->usCO2,pUartParam->Temprature等方式來訪問,非常方便。
代碼實現
結構體數據如下:
typedefstruct
{
uint8_tucStart;
uint16_tusCO2;
uint16_tusPM25;
uint16_tusHumidity;
floatTemprature;
uint32_tulParam;
uint8_tucEnd1;
uint8_tucEnd2;
}
USART_T;
USART_Tg_tUartParam;/*串口1發送數據使用*/
USART_T*pUartParam;/*串口2接數據使用*/
uint8_tbuf[128];/*接收記錄緩沖*/
數據收發處理:
/*
*********************************************************************************************************
*函數名:main
*功能說明:c程序入口
*形參:無
*返回值:錯誤代碼(無需處理)
*********************************************************************************************************
*/
intmain(void)
{
uint8_tucKeyCode;
uint8_tread;
uint8_tucStatus=0;/*狀態機標志*/
uint8_tucCount=0;
floatftest=0.11f;
pUartParam=(USART_T*)buf;
bsp_Init();/*硬件初始化*/
PrintfLogo();/*打印例程名稱和版本等信息*/
PrintfHelp();/*打印操作提示*/
bsp_StartAutoTimer(0,100);/*啟動1個100ms的自動重裝的定時器*/
memset(buf,0,128);
/*進入主程序循環體*/
while(1)
{
bsp_Idle();/*這個函數在bsp.c文件。用戶可以修改這個函數實現CPU休眠和喂狗*/
/*判斷定時器超時時間*/
if(bsp_CheckTimer(0))
{
/*每隔100ms進來一次*/
bsp_LedToggle(2);
}
/*按鍵濾波和檢測由后臺systick中斷服務程序實現,我們只需要調用bsp_GetKey讀取鍵值即可。*/
ucKeyCode=bsp_GetKey();/*讀取鍵值,無鍵按下時返回KEY_NONE=0*/
if(ucKeyCode!=KEY_NONE)
{
switch(ucKeyCode)
{
caseKEY_DOWN_K1:/*K1鍵按下,串口1發送數據給串口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("發送數據完成
");
break;
default:
/*其它的鍵值不處理*/
break;
}
}
/*串口2接收數據解析處理*/
if(comGetChar(COM2,&read))
{
switch(ucStatus)
{
/*狀態0保證接收到0x01*/
case0:
if(read=='$')
{
ucStatus=1;
buf[ucCount++]=read;
}
break;
case1:
buf[ucCount]=read;
/*接收夠15個數據*/
if((buf[ucCount-1]=='
')&&(buf[ucCount]=='
'))
{
/*打印接收到的數據值*/
printf("接收到的數據:
");
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;
}
}
}
}
測試效果
?
-
嵌入式
+關注
關注
5198文章
20449瀏覽量
334035 -
內核
+關注
關注
4文章
1468瀏覽量
42874 -
STM32
+關注
關注
2309文章
11162瀏覽量
373444 -
C語言
+關注
關注
183文章
7644瀏覽量
145588 -
Cortex-M
+關注
關注
2文章
234瀏覽量
31099
原文標題:一種用于嵌入式通信傳輸以及存儲設備的簡易C語言實現方法
文章出處:【微信號:嵌入式情報局,微信公眾號:嵌入式情報局】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
一種嵌入式系統用于多媒體實時數據的網絡傳輸設計
介紹一種嵌入式系統仿真方法
一種在SoC嵌入式存儲器測試期間壓縮診斷信息方法介紹
一種嵌入式Linux與Windows JVM通信實現
可用于嵌入式系統的傅立葉變換的C語言實現方法
一種用于嵌入式通信傳輸和存儲設備的C語言實現方法
評論