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 

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

    关注

    5017

    文章

    18501

    浏览量

    293385
  • 内核
    +关注

    关注

    3

    文章

    1316

    浏览量

    39950
  • STM32
    +关注

    关注

    2251

    文章

    10728

    浏览量

    350515
  • C语言
    +关注

    关注

    180

    文章

    7552

    浏览量

    131945
  • Cortex-M
    +关注

    关注

    2

    文章

    224

    浏览量

    29606

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

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

收藏 人收藏

    评论

    相关推荐

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

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

    解析嵌入式软件开发语言嵌入式C编程

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

    解析嵌入式软件开发语言嵌入式C编程

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

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

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

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

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

    嵌入式Socket通信怎么实现

    计算机系统。本文给出一种适合于中/低端应用的通信平台设计方案,它可支持Ethernet网络之间的数据传输,并且具有RS232、RS485、 USB等接口。文中围绕嵌入式uClinux环
    发表于 11-11 06:57

    求大佬分享一种嵌入式系统中串口通信帧的同步方法

    本文针对该问题给出了逐次比较、基于FIFO队列和基于状态机的3帧同步方法。通过测试、分析和比较得出,基于有限状态机的方法嵌入式系统串口通信
    发表于 05-27 06:52

    怎么实现基于S3C44B0X的嵌入式Socket通信设计?

    本文给出一种适合于中/低端应用的通信平台设计方案,它可支持Ethernet网络之间的数据传输,并且具有RS232、 RS485、 USB等接口。文中围绕嵌入式uClinux环境设计了基
    发表于 05-27 06:59

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

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

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

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

    标准C语言嵌入式C语言有哪些区别

    世界使用最广泛的系统编程语言嵌入式CC的扩展,在嵌入式系统中应用于编写
    发表于 12-14 06:15

    C语言中使用嵌入式SQL访问Oracle数据库的方法

    使用C语言开发Oracle应用程序通常有两种方法是利用嵌入式SQL语言,将SQL作为子
    发表于 12-15 06:35

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

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

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

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

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

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