0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一种用于嵌入式通信传输和存储设备的C语言实现方法

嵌入式情报局 来源:嵌入式情报局 2023-08-03 10:38 次阅读

摘要:各种类型的数据传输和存储就涉及到大小端的问题,首先要简单说下芯片的大小端问题,这里主要讨论Cortex-M内核。

831ff7d0-3137-11ee-9e74-dac502259ad0.png

M内核支持大端或者小端,实际应用中大部分内核都是小端。以STM32为例,全部都是小端,而且是芯片设计之初就固化进去的,不可修改。市面上其他厂家基本也都固化的小端格式。

F1编程手册

835910b0-3137-11ee-9e74-dac502259ad0.png

F3和F4编程手册

83789084-3137-11ee-9e74-dac502259ad0.png

F7和H7编程手册

83892124-3137-11ee-9e74-dac502259ad0.png

各种数据类型编程EEPROM,SPI Flash等存储器的简易方法,一般这些存储器都是字节编程,写入浮点等数据类型时不太方便。这里分享一个方法,定义一个结构体,将各种数据类型封装进去

839f76cc-3137-11ee-9e74-dac502259ad0.png

写入的时候采用下面方式:

83aded92-3137-11ee-9e74-dac502259ad0.png

读取时可以采用下面方式:

83c7dd06-3137-11ee-9e74-dac502259ad0.png

各种数据类型的SPI,UARTI2C等传输问题。这里我们以串口通信为例,比如主机要发送如下格式数据给从机:

83eb7432-3137-11ee-9e74-dac502259ad0.png

我们可以做一个如下结构体格式:

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;
}
}
}
}

测试效果

83fbc42c-3137-11ee-9e74-dac502259ad0.png 

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5068

    文章

    19014

    浏览量

    303209
  • 内核
    +关注

    关注

    3

    文章

    1362

    浏览量

    40226
  • STM32
    +关注

    关注

    2266

    文章

    10871

    浏览量

    354779
  • C语言
    +关注

    关注

    180

    文章

    7598

    浏览量

    136165
  • Cortex-M
    +关注

    关注

    2

    文章

    227

    浏览量

    29725

原文标题:一种用于嵌入式通信传输以及存储设备的简易C语言实现方法

文章出处:【微信号:嵌入式情报局,微信公众号:嵌入式情报局】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    嵌入式软件开发语言 嵌入式C编程到底是什么呢?是C语言的变形么?

    编写开发过程的复杂性,通常不选择它用于嵌入式系统开发,而C语言一种“低层次”的语言,已经成为
    发表于 12-26 15:15

    一种嵌入式系统用于多媒体实时数据的网络传输设计

    (内存管理单元),很适合于许多低端的、没有MMU的嵌入式处理器。本文设计了一种嵌入式系统用于多媒体实时数据的网络传输。ARM内核处理器与
    发表于 06-19 05:00

    嵌入式系统对通信有什么需求?

    嵌入式系统之间的通信通常有两方式:并行通信和串行通信。并行方式传输数据速度快,但占用的
    发表于 08-09 08:00

    嵌入式C语言C语言的区别

    嵌入式C语言C语言的区别:最常用的系统编程语言C
    发表于 10-27 06:52

    介绍一种嵌入式系统仿真方法

    /计数器等功能。本文介绍一种嵌入式系统仿真方法,通过一种特殊设计的指令集仿真器ISS将软件调试器软件Keil uVision2和硬件语言仿真
    发表于 11-08 06:16

    嵌入式平台C语言实现二阶滤波器的方法

    最近想从嵌入式平台上用C语言实现二阶滤波器,于是先从Matlab上验证二阶滤波器公式,再编写C语言来验证。算法移植(
    发表于 12-15 09:12

    嵌入式Linux存储设备包含什么

    /NandFlash分区)进行自动挂载。也实现模拟嵌入式Linux设备当成U盘设备插入电脑,即通过USB数据线连接电脑,可指定存储
    发表于 12-21 08:19

    一种在SoC嵌入式存储器测试期间压缩诊断信息方法介绍

    个常用的方法是在收集所有故障位坐标的基础上生成故障位图,并逐发送给测试人员。更为有效的是,遇到的故障可以检索。本文介绍了一种在SoC嵌入式
    发表于 09-07 15:08

    一种嵌入式Linux与Windows JVM通信实现

    提出了一种在Windows 主机上运用JAVA 虚拟机(JVM)技术,与运行嵌入式Linux 的嵌入式系统通信实现方法。介绍了
    发表于 08-13 09:42 17次下载

    嵌入式c语言编程(由浅入深)

    本内容详细介绍了嵌入式c语言编程的各项知识,包括嵌入式c语言编程,
    发表于 11-02 14:37 0次下载
    <b class='flag-5'>嵌入式</b><b class='flag-5'>c</b><b class='flag-5'>语言</b>编程(由浅入深)

    一种嵌入式手持设备的无线数据通信模块扩展方法

    文中针对嵌入式手持设备提出了一种扩展低成本无线数据通信模块的方法。通过对基于ARM技术的
    发表于 04-18 14:12 6次下载

    用于嵌入式系统的傅立叶变换的C语言实现方法

    都会和傅立叶变换打交道。在以下的文章中,我给出一种傅里叶变换的C语言实现方法(参考了C常用算法集),可以
    发表于 05-26 09:33 1520次阅读
    可<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'>方法</b>

    用于嵌入式系统中的无线通信方法

    用于嵌入式系统中的无线通信方法(嵌入式开发需要专门的软件和硬件设备吗?)-该文档为
    发表于 07-30 09:24 9次下载
    <b class='flag-5'>用于</b><b class='flag-5'>嵌入式</b>系统中的无线<b class='flag-5'>通信</b><b class='flag-5'>方法</b>

    标准c语言嵌入式,嵌入式C语言C语言的区别

    嵌入式C语言C语言的区别:最常用的系统编程语言C
    发表于 10-20 14:06 6次下载
    标准<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>的区别

    C语言嵌入式培训 嵌入式C语言程序设计基础

      学习嵌入式的基础语言C语言,因此先掌握C语言对于后续
    发表于 11-03 21:06 32次下载
    <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>程序设计基础