历史上的今天

今天是:2024年11月25日(星期一)

2020年11月25日 | 结构体在STM32串口接收中的妙用

发布者:nu23 来源: eefocus关键字:结构体  STM32  串口接收 手机看文章 扫描二维码
随时随地手机看文章

结构体C程序中在STM32单片机串口接收的妙用之一


结构体是一种数据的归类方式,相比数组或变量更具有整体全面性,例如一个数组只可以放一些按照元素顺序存放的单元变量,即tab ={x,x,x,x,x......},i 有多大,数组内元素就有多少.那么我们这时候如果我们用这个数组来接收串口接收信息,信息的格式是: 数据头>数据长度>数据区>数据校验>数据尾.


假设数据区为 <身高-体重-性别-年龄-学历>

那么我们用数组接收时,提取数据时就需要计算出数据格式中每个单元所对应的位置,即数组中第i个元素对应的内容.这样显然是很麻烦的,效率很低.这就相当于先织了一个大网,捕捉到一网鱼,还得过下称,才能按照重量分类开来一样.


那么如果我们能提前根据接收的数据的格式来做一个容器,直接把接收的数据复制到这个容器内,岂不是省了好大劲,来,有个好东西,这就是结构体.


我们按照接收数据的格式顺序定义一个结构体如下:

typedef struct

{

         u8    head;            //数据头

        u16    dataLen;      //数据长度值

        u8    height;           //身高

         u8    weight;          //体重

         u8    sex;               //性别

         u8    age;               //年龄

         u8    education;     //学历

         u8    checksum;     //校验和

         u8    endmark;      //结束字节

 

} RecData;

RecData  userData;

结构体已经定义好了,接下来我们就将串口接收的数据复制到这个结构体 userData里面.

定义串口接收的缓冲数组为

U8 serRec[len];

U8  len=100; //按照实际接收范围定义

 

我这里使用的是stm32单片机,串口具有空闲中断功能,当检测到串口收到一帧数据后,会进入中断置位,此时我们将进行数据的复制,如下:

memcpy(&userData,&serRec,len ); //内存复制


这就将串口数据完整的复制到userData中了, 而且是对号入座的, 错,stm32单片机是32位单片机,结构体中的变量存储时不是按照一字节对齐存储的,即默认每个存储单元分配是4个字节,像u8类型只占一字节这种默认也占了四个字节,显然空了3个字节,那么整个结构体的容量就不是结构体内所有变量的实际类型所占的大小之和.


我们要做的就是让结构体内的变量可以以一字节为最小单位对齐,即各个变量紧密的连在一起在内存中,这就需要字节对齐的预处理指令:


另外需要注意的是STM32的数据存储方式是小端模式,即数据的高字节存储在内存地址的高字节,低字节存储在内存地址的低字节,如果串口接收到的数据是低字节在前,则拷贝来的数据就不用进行处理,如果接收的数据是高字节在前则需要对拷贝来的数据进行高低字节反转.


什么是大端和小端        
Big-Endian和Little-Endian的定义如下:
1) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
2) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
举一个例子,比如数字0x12 34 56 78在内存中的表示形式为:

1)大端模式:

低地址 -----------------> 高地址
0x12  |  0x34  |  0x56  |  0x78

2)小端模式:

低地址 ------------------> 高地址
0x78  |  0x56  |  0x34  |  0x12

可见,大端模式和字符串的存储模式类似。




 

//keil 下1字节对齐

#pragma pack(push,1)

typedef struct

{

         u8    head;           //数据头

       u16   dataLen;          //数据长度值

        u8    height;          //身高

       u8    weight;          //体重

        u8    sex;            //性别

       u8    age;            //年龄

       u8    education;        //学历

       u8    checksum;         //校验和

       u8    endmark;          //结束字节

 

} RecData;

 

#pragma pack(pop)//恢复keil原来的数据对齐方式

 

用这条预处理指令将结构体声明在其中即可,代表结构体中变量会在内存中按照一字节对齐的方式存储.


至此,

userData.head

userData.dataLen   

userData.height

.........

这些都已对号入座的数据就可以直接使用了.


关键字:结构体  STM32  串口接收 引用地址:结构体在STM32串口接收中的妙用

上一篇:ST-LINK 的SWD接线图
下一篇:STM32程序的烧录方式 与 ISP一键下载

推荐阅读

我国已连续五年位列全球最大的工业机器人市场,国产工业机器人的占比首次下降—两组数据之后,是中国机器人产业走到了创新能力亟待提升的关键时刻。 2017年,中国工业机器人市场销量再创新高,超过14万台,平均增速达到60%。“但是,整个国产机器人的占比突然下滑6个百分点,这是非常大的特点。” 创新迫在眉睫 “向价值链上游爬升,是中国机器人产业...
汽车级金属化聚丙烯薄膜器件工作温度高达+125 °C,适用于混合动力和电动汽车日前,Vishay Intertechnology, Inc.宣布,推出新系列汽车级交流和脉冲金属化聚丙烯薄膜电容器---MKP385e,适用于混合动力和电动汽车。Vishay BCcomponents MKP385e系列器件最高工作温度达+125 °C(电压降额观测值),符合IEC 60384-17和AEC-Q200标准(D版),额定电压...
次世代主机已经发售,但对于国内玩家来说,它们何时会来到我们身边呢?根据最新消息来看,应该不会远了。近日,微软游戏游艺设备(上海)有限公司一款家庭娱乐游戏机通过了 3C 认证,型号为 1882。据查询,1882 正是 Xbox Series X 的设备型号。如无意外的话,微软应该在为国行 Xbox Series X 的发售而作准备。在规格方面,Xbox Series X ...
标定的片内RC 振荡器提供了固定的1.0、2.0、4.0 或8.0 MHz 的时钟。这些频率都是 5V、25°C 下的标称数值。这个时钟也可以作为系统时钟,只要按照Table 13 对熔丝位 CKSEL进行编程即可。选择这个时钟(此时不能对CKOPT进行编程)之后就无需外部器件 了。复位时硬件将标定字节加载到OSCCAL 寄存器,自动完成对RC 振荡器的标定。在 5V, 25°C ...

史海拾趣

问答坊 | AI 解惑

一位用激情经营人生的本土IC创业者(上)

微软前中国总裁唐骏曾经说过:“人的职业生涯是需要经营的,它和经营一个企业并无二致。”。这话用在天津英诺华微电子技术有限公司总经理褚以人身上再贴切不过。从一名核物理专业的大学生,到如今投身半导体产业的IC设计师,他在不断地经营中把自己 ...…

查看全部问答∨

谁用过LCD近进来帮我一下吧!

我现在需要做个电话机!可以显示大头贴的!需要用块彩色的LCD,不知道市场上卖的带驱动的那种LCD是不是可以直接接到ARM处理器的IO口上?一般黑白的LCD也是可以的吧!主要的部分是在软件的编程吧!…

查看全部问答∨

精巧实用的震感报警器

精巧实用的震感报警器…

查看全部问答∨

usbavrjtag cp210x_driver

本帖最后由 paulhyde 于 2014-9-15 08:57 编辑 usbavrjtag cp210x_driver  …

查看全部问答∨

2009年全国大学生电子设计竞赛G题低频功率放大器题解分享

本帖最后由 paulhyde 于 2014-9-15 04:15 编辑 2009年全国大学生电子设计竞赛G题是一个设计功率放大器的题,主要考核学生模拟电子技术的基础技能,要求是一定要用场效应晶体管做末级放大,且电路增益要求很大,如5mV的输入要达到5W(8欧负载)的输 ...…

查看全部问答∨

WINCE 能实现每秒5000次中断吗?有没有高手做过,请赐教。

Wince5.0 硬件每秒钟5000个脉冲触发X86CUP的7号中断,Wince能完全捕获到每一个中断吗,保证不丢,请做过的兄弟姐妹帮帮忙,提提思路,或者给 一段代码,不胜感激…

查看全部问答∨

求助:usrRoot已经执行完,看不到蓝屏的boot界面?

跟踪代码发现usrRoot已经执行完,却始终没有跳转到boot的蓝屏界面,谁能指点一下为什么?谢谢! 我是在workbench下,VxWorks6.6…

查看全部问答∨

小菜求教

我想学习windows ce方面的开发,我以前学C++的,没有学过C#,我经常用的是vs2005。 我想问一下,用vs2005进行windows ce方面的开发,是否要学些C#? 学习C#又什么好的教材吗? 谢谢了…

查看全部问答∨

侃侃我的成果

本人长期从事单片机开发应用,积累了一定的经验。本人将毕生研究心得集成了文字,放在我的博客里,希望大家光临指导,并给点意见。我的博客地址;http://blog.mcuol.com/user/Article/500.html…

查看全部问答∨

2407A的调试???

TI的2407A的调试一定要加一块RAM吗? 这块ram的作用是什么呀?能告诉我TI的哪个文档中描述这个问题了? ccs中的load 是把程序load到哪里了? 小弟刚刚学习,那位大虾帮帮我哦,谢谢!!! 还有,谁能提供一些汇编的例子,为什么TI只提供一 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved