在做嵌入式系统通信时往往会用到串口,包括嵌入式系统将数据传输给PC,或者是嵌入式系统之间进行数据传输,这时候就会遇到发送数据的问题。

我们知道单片机通过串口发送数据时往往是一次一个字节(8位),如果传输char(8位)型数据则很好办,只需要直接发送就可以了,但是在发送int型数据和float型数据时就会稍微有些复杂。

下面就以常用的8位单片机89c51为例来进行说明。

当发送int型或long型数据时比较简单,一个int型数据是16位,long是32位,把int型/long型数据变成2/4个char型数据发送出去就可以了,程序如下

void long_char(unsigned long l,unsigned char *s)

{

*s = l>>24;

*(s+1) = l>>16;

*(s+2) = l>>8;

*(s+3) = l;

}

在串口助手上就可以接收到相应的long型数据了。

当发送float型数据时稍微有些复杂。首先简单介绍下float型数据在内存中的存储方式:

float遵从的是IEEE R32.24 在存储中都分为三个部分:

1.符号位(Sign) : 0代表正,1代表为负

2.指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储

3.尾数部分(Mantissa):尾数部分

如下图所示:

以8.25和120.5这两个数字来举例:

8.25用二进制表示为:1000.01。1000.01可以表示为1.00001*23

120.5用二进制表示为:1110110.1。1110110.1可以表示为1.1101101*26

十进制小数点转换成二进制,可以上网查一下相关资料,“小数转二进制”,不在本篇讨论的范围内。

下面就看看8.25和120.5在内存中真正的存储方式。

8.25,用二进制的科学计数法表示为: 1.00001*23

120.5,用二进制的科学计数法表示为: 1.1101101*26

介绍完了float型数据在内存中的存储方式,能够知道如何发送float型数据了:直接按照int型类似的发送肯定是不行的,这就需要采用指针的方法(在keil中数据的排放格式是大端模式):

void float_char(float f,unsigned char *s)

{

unsigned char *p;

p = (unsigned char *)&f;

*s = *p;

*(s+1) = *(p+1);

*(s+2) = *(p+2);

*(s+3) = *(p+3);

}

通过这种方法把数组s发送出去,在接受端接受到的就是标准的IEEE754结构的原始数据,也就是float型数据在内存中存放的值,这种方法比较简单明了,这时候的串口接收端可以用现成的,不需要自己编写。

还可以采用共用体的方法,如果采用共用体时串口的接收端软件需要自己编写:

我们知道共用体可以使不同的数据类型来共享相同的地址空间,所以程序如下:

void float_char(float f,unsigned char *s)

{

union change

{

float d;

unsigned char dat[4];

}r1;

r1.d = f;

*s = r1.dat[0];

*(s+1) = r1.dat[1];

*(s+2) = r1.dat[2];

*(s+3) = r1.dat[3];

}

接收端采用同样的程序编写就可以得到float型数据的值了,不再需要其他的转换。

类似的,传输long型或int型时也可以采用共用体的方法:

void long_char(unsigned long l,unsigned char *s)

{

union change

{

long d;

unsigned char dat[4];

}r1;

r1.d = l;

*s = r1.dat[0];

*(s+1) = r1.dat[1];

*(s+2) = r1.dat[2];

*(s+3) = r1.dat[3];

}

以上就是串口通信中传输int/float型数据的方式了,有什么疑问一起讨论。

串口 接收端_嵌入式系统串口传输int float型数据的处理相关推荐

  1. 嵌入式系统串口解析二进制数_嵌入式系统Bootloader分析及DSP56F800串口加载功能实现...

    嵌入式系统 Bootloader 分析及 DSP56F800 串口加载功 能实现 张小平 ; 谷勇 ; 丰新龙 [期刊名称] <海军航空工程学院学报> [年 ( 卷 ), 期] 2010( ...

  2. 如何通过网络将文件传输到嵌入式设备_嵌入式系统 Boot Loader技术内幕,带你完全了解Boot Loader...

    一个嵌入式 Linux 系统从软件的角度看通常可以分为四个层次:1. 引导加载程序.包括固化在固件(firmware)中的 boot 代码(可选),和 Boot Loader 两大部分.2. Linu ...

  3. 如何保证交叉表编译器和目标系统版本一致_嵌入式系统词汇表

    欢迎FPGA工程师加入官方微信技术群 点击蓝字关注我们FPGA之家-中国最好最大的FPGA纯工程师社群 A ASIC(专用集成电路) Application-Specific Integrated C ...

  4. c语言如何用串口发送数据类型,串口通信中的int float型数据的处理和发送

    在做下位机通信时往往会用到串口,包括下位机将数据传输给上位机,或者是下位机与下位机之间进行数据传输,这时候就会遇到发送数据的问题,单片机通过串口发送数据时往往是一次一个字节(8位),如果传输char( ...

  5. 嵌入式linux系统移植的四大步骤_嵌入式系统移植步骤

    在嵌入式系统移植中重要的一部分是操作系统的移植,与其它操作系统相比,Linux大的特点:它是一款遵循GPL的操作系统,我们可以自由地使用.修改.和扩展它.正是由于这一特色,嵌入式系统移植过程中Linu ...

  6. linux 设备树_嵌入式系统砖家_初识设备树

    目录: 一.加载Linux(有无设备树) 二.设备树入门知识 一.加载Linux(有无设备树) 没有设备树的时候(以ARM架构为例): - 内核在源码里记录了所有硬件相关的信息(芯片型号.内存大小,各 ...

  7. android 串口调试工具_树莓派通用串口通信实验

    一.介绍 对于树莓派 3B+来说,他的UART功能有三种:1.内部蓝牙使用:2.控制终端使用:3.与其他设备进行串口通信. 在树莓派USB TO TTL模块实验中学习了通过串口对树莓派进行控制台控制, ...

  8. 广工android嵌入式系统试卷_嵌入式系统考试试题A及答案

    一.填空题(每空 2 分,共 18 分) 1 . PC 机开机的初始化工作一般由 BIOS 完成,而嵌入式系统的初始化工作一般由 ______________ 完成. 2 . ARM 内核三级流水线机 ...

  9. 嵌入式系统功能需求分析_嵌入式系统开发流程及前景分析

    嵌入式系统开发就是对于除了电脑之外的所有电子设备上操作系统的开发,开发对象有手机,掌上电脑,机电系统等,以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于应用系统对功能.可靠性.成本.体积.功 ...

最新文章

  1. python中处理日期和时间的标准模块是-2019python常见的170道面试题解析
  2. 62岁程序员植入逻辑炸弹, 面临10年监禁和25万美元罚款
  3. php验证器的调用,ThinkPHP5 验证器的具体使用
  4. 使用ETag识别ajax,如何使用jQuery AJAX请求访问ETag头?
  5. c语言中浮点数如何声明,C语言中浮点数定义和文本处理的配合
  6. 京东股价创新高:市值首次突破千亿美元 !
  7. JDBC使用总结:增删改查、调用存储过程、执行存储函数、存储过程与存储函数区别分析
  8. sharepoint中使用xslt构建Spotlight(焦点图效果)
  9. 如何成为成功的Andr​​oid游戏开发
  10. 测试工具|(本来不想分享的)安卓系统Ping IP工具
  11. 如何使用DDMS Heap查看Android应用内存情况
  12. ccnp计算机英语,英语不好可以学习CCNA或是CCNP吗?
  13. 数位板软件测试工资,一位强迫症患者对板子的深度剖析,绘王H950P数位板测评...
  14. Visio对mysql怎么画er图_怎么用Visio画ER图
  15. jBox 2.3基于jquery的最新多功能对话框插件 常见使用问题解答
  16. 使用Python在图片上增加文字
  17. 170929 逆向-Reversing.kr(Ransomware)
  18. Quartus II IP生成报错
  19. MyBatis面试题库
  20. SQL注入、XSS、XXE、CSRF、SSRF、越权漏洞、文件上传、文件包含总结篇

热门文章

  1. Duplicate interface definition for class解决方法
  2. 解决php中json_decode的异常JSON_ERROR_CTRL_CHAR
  3. 【报告分享】元宇宙发展研究报告2.0-清华大学.pdf(附下载链接)
  4. 内容推荐策略产品经理的方法和实践
  5. 通俗易懂!视觉slam第十部分——贝叶斯估计
  6. 梯度下降优化算法总结
  7. 2021春季推荐算法实习生面经
  8. 点击率预估与冷启动(一)
  9. Leetcode每日一题:36.valid-sudoku(有效的数独)
  10. CCF 2013-12-1 出现次数最多的数