0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

串行口接收数据,如何对16位INT型数据进行操作?

j4AI_wujianying 来源:互联网 作者:佚名 2017-12-27 06:02 次阅读

吴鉴鹰单片机开发板地址

在8位单片机中没有16位数的操作指令,所有的int型数据都要通过两个字节分开操作,使用的方法不用,生成的代码也不相同,当然效率也不一样,通过指针对16位数进行操作可以得到高效的代码。

比如通过串行口接收数据,或者从串行的EEPROM中读取的数据,或者从大于8位的A/D读取的数据,由于8位单片机的数据线是8位的,高于8位的数据都要分成两个字节分别读取,然后写入到RAM中去再进行计算,或者把16位的int型数据从RAM中读出再分别把高低字节存到EEPROM或者送到D/A,或者通过串行口发送出去,方法有很多种,下面用多种方法进行实现该操作,这里只演示写入到16位的情况,读取的情况非常相似,不赘述。

(1)使用联合 (union)

typedef union{

unsigned int i;

unsigned char c[2];

}u_int;

unsigned char dH = 0x11, dL=0x22;

unsigned int d;

u_int ud;

ud.c[0] = dH;

ud.c[1] = dL;

d = ud.i;

此时d = 0x1122;

(2) 使用移位指令

数据定义与前面相同

d = ((unsigned int)dH)<<8 + dL;

或者

d = dH;

d <<= 8; // or: d = d<<8; 但后者编译的代码可能不是最简的

d |= dL; // or: d = d | dL; 后者编译的代码可能不是最简的

(3)使用指针

unsigned char *cptr;

cptr = (unsigned char*)(&d);

cptr[0] = dH;

cptr[1] = dL;

(4)强制指针类型转换

*((unsigned char*)(&d)) = dH;

*((unsigned char*)(&d)+1) = dL;

((unsigned char*)(&d))[0] = dH;

((unsigned char*)(&d))[1] = dL;

这两种方式看似相同但由Keil编译出的代码是不用的,前都有一次加法运算,而后者没有,后者生成的代码更简洁,这种方式与用联合成生的代码是完全一样的,

在这几种方法中第(1)与第(4)的第二种生成的代码是最乘洁的,是推荐使用的,从软件工程的角度出发,推荐使用方法(1),这样没有强制类型转换,没有用到指针,更不容易出错。从书写的代码来讲,第(4)的第二种方法是最好的,代码简洁而且效率最高,但语法有点儿复杂。

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

    关注

    34

    文章

    1627

    浏览量

    55590
  • 数模转换
    +关注

    关注

    3

    文章

    107

    浏览量

    29015

原文标题:8位单片机中如何对16位INT型数据进行操作?

文章出处:【微信号:wujianying_danpianji,微信公众号:单片机精讲吴鉴鹰】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    为什么ADS1x9x在接收数据后会舍弃高4和低4

    不知道为什么ADS1x9x在接收数据后会舍弃高4和低4,这个数据绘制的图形没有心电图形。难道只是单纯的将long
    发表于 12-25 07:28

    AIC23采集到的数据是应该用什么数据类型来接收int还是unsigned int

    AIC23采集到的数据是应该用什么数据类型来接收int还是unsigned int? 这个采集到的数字是什么含义呢?代表的是声音信号的幅
    发表于 10-18 06:56

    串行口的四种工作方式各有什么特点

    串行通信是计算机硬件和外设之间常用的通信方式之一。串行口(Serial Port)是实现串行通信的硬件接口。在计算机系统中,串行口通常用于连接鼠标、调制解调器、打印机等设备。
    的头像 发表于 08-22 17:37 2061次阅读

    DAC7731 16电压输出串行输入数模转换器数据

    电子发烧友网站提供《DAC7731 16电压输出串行输入数模转换器数据表.pdf》资料免费下载
    发表于 07-23 09:48 0次下载
    DAC7731 <b class='flag-5'>16</b><b class='flag-5'>位</b>电压输出<b class='flag-5'>串行</b>输入数模转换器<b class='flag-5'>数据</b>表

    DAC716带串行数据接口的16数模转换器数据

    电子发烧友网站提供《DAC716带串行数据接口的16数模转换器数据表.pdf》资料免费下载
    发表于 07-23 09:15 0次下载
    DAC716带<b class='flag-5'>串行数据</b>接口的<b class='flag-5'>16</b><b class='flag-5'>位</b>数模转换器<b class='flag-5'>数据</b>表

    SN74LVC16373 16透明D锁存器数据

    电子发烧友网站提供《SN74LVC16373 16透明D锁存器数据表.pdf》资料免费下载
    发表于 06-04 10:58 0次下载
    SN74LVC16373 <b class='flag-5'>16</b><b class='flag-5'>位</b>透明D<b class='flag-5'>型</b>锁存器<b class='flag-5'>数据</b>表

    具有3态输出的16边缘放大D触发器数据

    电子发烧友网站提供《具有3态输出的16边缘放大D触发器数据表.pdf》资料免费下载
    发表于 05-22 11:10 0次下载
    具有3态输出的<b class='flag-5'>16</b><b class='flag-5'>位</b>边缘放大D<b class='flag-5'>型</b>触发器<b class='flag-5'>数据</b>表

    具有3态输出的16透明D锁存器数据

    电子发烧友网站提供《具有3态输出的16透明D锁存器数据表.pdf》资料免费下载
    发表于 05-22 11:09 0次下载
    具有3态输出的<b class='flag-5'>16</b><b class='flag-5'>位</b>透明D<b class='flag-5'>型</b>锁存器<b class='flag-5'>数据</b>表

    具有3态输出的16边缘放大D触发器数据

    电子发烧友网站提供《具有3态输出的16边缘放大D触发器数据表.pdf》资料免费下载
    发表于 05-22 10:44 0次下载
    具有3态输出的<b class='flag-5'>16</b><b class='flag-5'>位</b>边缘放大D<b class='flag-5'>型</b>触发器<b class='flag-5'>数据</b>表

    16恒流LED接收驱动器MBI5026数据手册

    电子发烧友网站提供《16恒流LED接收驱动器MBI5026数据手册.pdf》资料免费下载
    发表于 04-18 17:13 5次下载

    STM32L162与ADS8320进行16数据转换,如何读取ADS的转换数据

    求助:STM32L162与ADS8320进行16数据转换,fAHB = 16M, IO方式
    发表于 04-18 08:19

    STM32WLE5JC SPI数据长度设置为8,但接收数据缓存却是16,为什么?

    在STM32WLE5JC单片机中SPI数据长度设置了8,并且相应的接收FIFO也设成了8,但最后收发数据是却是
    发表于 04-07 07:32

    16恒流LED接收器驱动器MBI5026数据手册

    电子发烧友网站提供《16恒流LED接收器驱动器MBI5026数据手册.pdf》资料免费下载
    发表于 03-11 17:08 0次下载

    嵌入式操作教程:2-12 RS232串通信实验(查询方式)

    一、实验目的 了解UART 的功能和结构,学习RS232串通信协议,并实现通过查询方式进行 RS232 串口通信收发。 二、实验原理 RS232 RS232接口是现在主流的串行通信接口之一,被广泛
    发表于 02-07 14:37

    xc2000同步串行口发送和接收数据错误怎么解决?

    接收两次就会陷入接收函数里的while死循环。主函数里有好几条发数的指令,我在每一个主发从收函数后面都写上从发主收函数,在示波表里看发送的数据没错,但最后主机接收到的
    发表于 02-06 07:35