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

摘要:各种类型的数据传输和存储就涉及到大小端的问题,首先要简单说下芯片的大小端问题,这里主要讨论cortex-m内核。
m内核支持大端或者小端,实际应用中大部分内核都是小端。以stm32为例,全部都是小端,而且是芯片设计之初就固化进去的,不可修改。市面上其他厂家基本也都固化的小端格式。
f1编程手册
f3和f4编程手册
f7和h7编程手册
各种数据类型编程eeprom,spi flash等存储器的简易方法,一般这些存储器都是字节编程,写入浮点等数据类型时不太方便。这里分享一个方法,定义一个结构体,将各种数据类型封装进去:
写入的时候采用下面方式:
读取时可以采用下面方式:
各种数据类型的spi,uart,i2c等传输问题。这里我们以串口通信为例,比如主机要发送如下格式数据给从机:
我们可以做一个如下结构体格式:
typedef struct{    uint8_t ucstart;                            uint16_t usco2;    uint16_t uspm25;            uint16_t ushumidity;              float    temprature;    uint32_t ulparam;    uint8_t  ucend1;               uint8_t  ucend2;   }uart_t;uart_t g_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等方式来访问,非常方便。
代码实现
结构体数据如下:
typedef struct{    uint8_t ucstart;                             uint16_t usco2;    uint16_t uspm25;            uint16_t ushumidity;             float    temprature;    uint32_t ulparam;    uint8_t  ucend1;               uint8_t  ucend2;   }usart_t; usart_t g_tuartparam; /* 串口1发送数据使用 */usart_t *puartparam;  /* 串口2接数据使用 */uint8_t buf[128];     /* 接收记录缓冲 */  
数据收发处理:
/***********************************************************************************************************        函 数 名: main*        功能说明: c程序入口*        形    参: 无*        返 回 值: 错误代码(无需处理)**********************************************************************************************************/int main(void){        uint8_t uckeycode;                uint8_t read;        uint8_t ucstatus = 0;  /* 状态机标志 */        uint8_t uccount=0;        float ftest = 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)                        {                                case key_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 */                                case 0:                                        if(read == '$')                                        {                                                ucstatus = 1;                                                 buf[uccount++] = read;                                        }                                        break;                                 case 1:                                        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;                        }                }        }}  
测试效果


元宇宙链游是什么
自恢复保险丝工作原理 自恢复保险丝如何选型
怎样借助边缘计算来保护物联网设施
全球范围内储能市场增速明显,新基建成为储能产业发展的有力推手
面向高端ADAS开发出业界超稳定运行的DC-DC转换器IC“BD9S402MUF-C”
一种用于嵌入式通信传输和存储设备的C语言实现方法
推动EDA工具国产化 深圳:企业买国产EDA软件 最高补助1000万
华硕COMPUTEX发表全新NB并展现保健穿戴装置
浪涌保护器的参数及分类
5G雷声虽大雨点小 “华米OV”该发力了
基于IAR for arm9.30.1在VS Code调试仿真RA
2017年大族激光年度业绩再创历史新高营业收入115.6亿
创建一个简单的人脸识别桌面应用程序
如何对51单片机RAM不同的区域进行划分
电视彩显电源管参数
华为鸿蒙OS系统具备替换安卓能力,流畅度比肩IOS系统
鸿蒙还是半成品,无法与安卓抗衡?
触摸屏电脑怎么样_有什么优劣势
康佳推出玉玺系列洗衣机,以智能化全面呵护满足用户的需求
传感器类型有哪几种 传感器的主要功能是什么