历史上的今天

今天是:2024年09月07日(星期六)

2019年09月07日 | STM32与上位机串口通讯的学习笔记(简明的数据帧设计方法)

发布者:脑洞飞翔 来源: eefocus关键字:STM32  上位机  串口通讯  数据帧 手机看文章 扫描二维码
随时随地手机看文章

最近因为项目需要,需要做一个STM32和Windows的串口通讯协议来交换数据,本着追求极致的心态,来讨论一下简明的数据帧的设计方法。


##数据的传输方式

对于很多单片机初学者而言,可能他们接触到串口 首先想到的就是通过串口打印字符串,然后就会很理所当然的想到了用“打印”的方式来传输数据。


比如我们需要传输一个float型的数据value,可能小白们首先会想到的方式就是串口重定向printf然后像下面这样把数据传输过去


printf("%f",&value);


但是实际上,对于程序之间的交流,使用字符串打印这样的方式是非常浪费传输数据的,因为假设这个浮点数据为1234.567占了8个字符(小数点也占一位) 所以用字符串传输的方式就需要通过串口传输8个字节,但是实际上float类型在内存里面永远都是占用4个字节,所以使用字符串的传输效率是非常低的,并且这样传输 上位机收到的也是字符串,还得把字符串的数据读出来重新放到一个float类型的数据里面,才可以进行运算。


因此,通过串口传输的数据基本上都是通过直接传输内存数据来实现的。

它的原理大概是这样 同样以float类型作例子

当你在程序里面声明了一个float类型的变量的时候,程序会为这个变量开辟一个4字节的内存空间,然后这4个字节的内存数据唯一决定了这个float类型的数据(具体实现方式可以百度float类型的存储方式)。因此,我们的串口只要把这4个字节的数据通过串口传输到上位机,然后上位机根据传输协议直接把这4个字节写入到一个float类型的内存空间中,然后这个float类型的数据也就随之完成了。


为了方便这个过程的实现 我们可以定义一个联合体


typedef union{

float value;

unsigned char sendbuf[4];

}send_type;


这样定义的好处就是:联合体内的所有成员共用一片内存空间

然后我们需要传输数据float型数据的时候,我们只需要声明一个send_type类型,然后对send_type的value直接赋值,然后与此同时sendbuf的数据也会因此改变,我们就可以直接发送sendbuf[4]这四个字节了。建议在上位机的程序里面也使用同样的联合体,然后当上位机的snedbuf[4]放入接收的4个字节之后,value就可以直接读出所需要的数据了。然后对于其他各种数据类型,如double,long int之类的类型同样也可以使用这种方式来传输,只需要注意好各种数据类型需要占用的内存空间就可以了


##组合数据的传输方式的注意事项

通过上面的方式,我们通过传输内存数据的方式来传输单个数据了,那么当我们需要传输多个数据呢?


或者说,传输的并不是直接的数据,而是带有一定的开头,结尾的数据,假如协议规定数据起始要先发一个字节的标志0x0d,然后传输两个float型数据,再以结束标识符0x0d结尾

(此处0x0d是人为规定,协议可以要求为其他值)

这时候只考虑联合体的话并不能解决我们的问题

这时候结构体就派上用场了


typedef struct{

unsigned char   head;

float send1;

float sned2;

unsigned char end;

}sned_frame;


像这样我们就可以按照顺序把协议整合成一个结构体的形式,编译器会根据结构体内成员顺序在内存里按顺序分配内存空间,上位机和单片机共用同一种结构体形式,然后只需要设定好帧内各成员内容之后,把结构体直接发过去,好像就可以了??


其实问题并没有想的这么简单。结构体虽然会占用一片连续的内存空间,但是实际上结构体内的成员并不一定是连续分配内存空间的。可以实践,刚刚声明的结构体,它并不是只占用1+4+4+1=10个字节的内存空间。为什么会这样呢?因为编译器在分配内存时会按照内存对齐的方式来分配内存,因此前面的unsigned char变量为了和float对齐,编译器为其分配了4个字节的空间。这会导致我们协议的帧长度增加一些没有意义的空的数据,并且判断帧长度将变得复杂。


(当然,其实如果上位机和stm32的内存对齐的方式恰好是一样的话,只要保证把整个结构体传输过去,整个通信应该还是可以完成的)

那么如何取消编译器的内存自动对齐呢?

我们可以在结构体定义后紧跟一句attribute ((packed))

这一句的意义是将该定义的内存分配强行按最小位对齐(也就是按字节对齐)。

那么我们修改后的结构体定义是这样的:


typedef struct{

unsigned char   head;

float send1;

float sned2;

unsigned char end;

}_attribute__ ((__packed__)) sned_frame;


可以实践,对现在的结构体使用sizeof关键字,得到的的长度为10。这样就可以压缩帧的长度,避免数据浪费了。在需要改动协议的时候,也只需要简单的增加结构体的成员即可。

/-----------------------------------------------------------------------------------------------------------

2018年6月4日11:26:30后记:


在STM32的开发中,如果使用了硬件浮点数解算的话,同时又存在串口发送浮点型数据的话,此时最好不要压缩数据帧,按照编译器的自动补充空字节来发送,上位机也保持一样的数据包.因为硬件浮点解算涉及到了内部的专用电路,而此时如果浮点数没有内存对齐的话是无法使用硬件解算从而出现错误的.这时候会带来不必要的麻烦. 当然 如果需要和性能受限制的设备进行通信,不舍得填充空数据的话,在涉及内存不对齐的浮点数据可以先开一个临时变量进行操作,在进行发送的前一刻使用memcpy函数将浮点数放进数据帧内也是可以的


关键字:STM32  上位机  串口通讯  数据帧 引用地址:STM32与上位机串口通讯的学习笔记(简明的数据帧设计方法)

上一篇:STM32添加路径报错
下一篇:OpenMV数据打包发送以及STM32对数据的解析(串口方式)

推荐阅读

罗德与施瓦茨发布了符合3GPP最新规范的5G NR上行信号的生成和分析选件。其中FSW频谱仪的FSW-K145 5G NR上行信号分析选件可以用于5G终端的测量以及功放等器件的测试。与此对应的FSW-K144选件是用于5G NR下行信号的分析。用于R&S SMW200A矢量信号发生器的SMW-K144选件是集成上行和下行信号的生成功能的,可以用于上、下行接收机测试。上述的3个选件都是...
早前特斯拉曾因一起发生在美国加州的汽车事故而备受怀疑,而近日已有美国安全机构针对此起事故的原因做出了分析:司机失误及特斯拉Autopilot系统的设计缺陷。美国国家运输安全委员会(NTSB)于周三正式发表声明:,一辆特斯拉Model S于2018年1月与一辆停在路边的消防车发生碰撞随即引发交通事故,其原因一方面是由于车主失误,但另一方面则是由于特斯拉Au...
上月底,小米正式公布了第三代屏下相机技术,当时给出的时间是明年量产。  依托该技术,小米打造了基于小米10至尊纪念版的屏下相机工程机,完成度颇高。  国外爆料人不知哪里得到的消息,称小米10屏下相机版的进度超前,甚至可以提前到今年10月或者11月量产上市。  按照小米介绍,第三代屏下相机技术通过全新的像素排列方式,让屏下相机区...
具体实现功能:①LCD1602实时显示噪声分贝值,精度为0.1db;②可以按键设置报警值,实现声光报警;三个按键:设置键、加键、减键;③当噪声分贝值未超过阀值时,绿灯闪烁;当超过阈值时,红灯闪烁并蜂鸣器报警。单片机介绍51单片是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编...

史海拾趣

问答坊 | AI 解惑

如何判别双三极管的型号

我想参考别人的线路,有一个由两个NPN管组成的贴片双三极管不知是什么型号,表面上标有X1,不知如何得知它的型号?有那位高手可告知,将感激不尽!!![Y]…

查看全部问答∨

浅谈安防工程要做到四个结合

摘要:本文从国内外安防工程的比较入手,就徐谈林教授提出的安防工程要做到“四个结合”进行了分析,指出只有综合考虑四个结合,才能建成一个经济实用安防工程。关键词:安防工程商安防工程 安防系统 安防设备一、序言在安防行业中安防工程商占有重 ...…

查看全部问答∨

用最新库玩转智林STM32开发板(之三)------用自动重装载的PWM点亮真彩背光板

用最新库玩转智林STM32开发板(之三)------用自动重装载的PWM点亮真彩背光板用最新库玩转智林STM32开发板(之三)------用自动重装载的PWM点亮真彩背光板 用最新库玩转智林STM32开发板------用自动重装载的PWM点亮真彩背光板 上次用的是TOGGLE,又用 ...…

查看全部问答∨

医疗监控系统解决方案

  (一)背景介绍   随着安全防范体制和技术的进一步完善和提高,使得医疗行业完全有条件、有能力应用最新的高新科技成果,带领全行业步入一个新的台阶,提供最先进最及时的医疗服务,树立自己的行业形象,并能够高效的为用户服务。   为促 ...…

查看全部问答∨

VHDL这几句警告是什么意思啊(在Quartus里运行的)

LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY not1 IS     PORT(a : IN STD_LOGIC;          b : OUT STD_LOGIC); END not1; ARCHITECTURE no_t OF not1 IS   BEGIN   &nb ...…

查看全部问答∨

关于语音识别

    现在我想自己做一个语音识别系统,碰到个问题希望大家帮忙参考下:     耳麦录下的声音信号经过放大处理后进入AD转换,说实话我硬件不怎么的,现在就是不知道选什么AD好,知道要并行的,采样速度不能低于40K,12位也就够 ...…

查看全部问答∨

USB HOST,NAS,CDMA,EDGA无线上网卡,PCIE转换芯片,WIFI模块,Catalyst Semiconouctorinc

代理Oxford 相应的接口芯片,VIA WIFI 芯片,Yitran PLC芯片,及CATALYST 如: PCMCIA CDMA/GPRS无线上网卡解决方案---OXCF950B, OXCFU950B 该方案方案是采用高通通讯芯片与OXCF950芯片一起实现,是目前市面上应用最为广泛的无线上网卡实现方案。 ...…

查看全部问答∨

我的IAR MSP430 怎么没C-SPY

我的是IAR MSP430 最新板,并成功破解,破解之后,发现我的debug菜单总是灰的,无论你怎么选择,怎么编译就是灰色,请路过大侠,高手们支招我怎么才能让C-Spy好用…

查看全部问答∨

谁有protues 中的谁有VDM51.dll

谁有protues  中的谁有VDM51.dll ,能否发我邮箱一下,谢谢!!!!邮箱:453910713@qq.com …

查看全部问答∨

【颁奖礼】ADI有奖下载活动之3 两线环路供电变送器解决方案

活动详情:>>ADI有奖下载活动之3两线环路供电变送器解决方案! 又到了颁奖时刻,这也是我们最喜欢发帖的时候,此活动是年前结束的,因为春节特殊时间段的顾忌,所以现在才公布,收到迟到的礼物,需要大家的理解!马上揭晓30名获奖者名单!! ...…

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

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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