单片机串口一次接受8位数据,如果有个16位的数据,他怎么知道16位是个整体,不会把它当成2个8位?

如题所述

两个字节以上的数据传输,就必须制定协议。

规定一个《头字节》,以后才是数据字节,最后还要有《校验字节》。

接收方,收到一连串字节后,经过校验无误,才认为收到的数据是有效的。追问

头字节是什么,占内存吗?

追答

协议,你自己规定。

什么叫《内存》?
单片机,并没有内存的说法。

追问

单片机接收的数据存哪里的?不是内存

追答

可以使用:片内RAM、片外RAM、EEPROM、SD卡...,

你自己编程,你愿意存那,就存那。

追问

存的数据的数据类型它是怎么区分的,比如收到一个8位,存起来后,单片机怎么知道他是char还是int?

追答

一般的单片机,都是八位的,每次处理,就是8位数。
单片机,执行的都是机器语言。
人,可以看懂的是它们的汇编语言。

char还是int?这是C语言里面的概念。
你把C语言程序编译后,成了汇编语言后,
你再看这些汇编语言,就知道单片机,是怎么区分这些的数据的了。
----
了解单片机是怎么知道是char还是int,毫无意义。
关键是:你,必须编写程序,把收到的一个一个字节,如何、如何、如何、处理它们。

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-05-14
它不能区分,如果你非要发送一个两字节的数据,只能在发送端拆开发,接收端再组合起来追问

P0=0xff;这样一个语句它是怎么接受,接受后怎么组合在一起的?

追答

P0=0xff 这句话是向P0口赋值0xff,0xff是一个字节。
给你举例说明一下串口的两字节把。
发送数据0x1234,这是一个16位的数据。
发送时,就需要把0x1234拆分开来,以51单片机为例,发送即往SBUF赋值,
拆分发送,就可以写成
SBUF = (0x1234>>8) & 0xff; 将数据从高8位移下来
while(!TI); 等待发送完成
SBUF = 0x1234 & 0xff;
while(!TI);

接收端,就会连续收到两个数据,一个是0x12,一个是0x34
然后我们就需要把这两个数据组合起来,比如组合完的数放入变量 a;
a = ((unsigned int)(0x12) << 8) +0x34;

第2个回答  2013-05-14
uchar最大是256,ulnt最大是65535,你的数如果超过256,就定义一个uint的,小于256就定义一个char形的
第3个回答  2013-05-14
只能靠你的程序去实现,单片机不管你几位,每次接受8位追问

不同的数据类型他怎么区分,int,char都8位,他怎么知道是char还是int

追答

不是你程序定义的类型吗?是你知道,不是它知道,他不管的!

追问

不管那要怎么知道接收的是什么数据类型?

追答

这么说吧,接受的是什么数据你事先应该知道的,然后针对性编程。并不是接受来后再判断的!

C# 串口通信 高低字节合并是怎么回事啊
必须发送过来两个数字,就是把16bits的数分成两个8bits时向上位机发送,换句话来说,你的8位单片机,每次只能给你发一个8bits的字节,而它要表示一个数据必须使用16bits编码时,其实需要两次发送,也就是你所说的两个字节。

51单片机怎么接收电脑发送的16位数据?
51单片机是8位的,一次只能接一个字节,你这16位的,要分两次的。电脑串口也是按两次来发送,也就是把这个16位的拆成两个字节,所以每个字节发送都是遵循串口协议的,你在单片机里面开串口接收中断即可。你可能会疑问,要是第一个字节中断了,进入中断函数接第一个字节后,那第二个字节会不会错过,...

stm32如何用串口接收的16进制数控制单片机的端口位,求大神给指导下_百...
串口一般只能接受8位的数据,也就是按字节进行传输,要是数据超过1个字节的和数据,你就需要建立协议来进行数据重组。这就涉及到大小端问题(你是先发送高8位还是低8位),断帧问题(可通过添加特定字符组成的帧头帧尾来识别,或者通过时间间隔来识别)。简单的介绍一下操作方法,每接收一个字节数据,...

单片机串口通讯传输16位传到8位接收端怎么区分第一次和第二次接收?求...
SBUF = c1%256; \/\/是256,先发低8位 while(!TI); TI=0;SBUF = c1\/256; \/\/后发高8位 while(!TI); TI=0;接收端 while(!RI);RI=0;c0=SBUF; \/\/先收低8位,c0定义成8位 while(!RI);RI=0;c00=SBUF; \/\/后收高8位,c00定义成16位 c00=c00*256+c0;c00就是接收后恢复成的发送...

串口调试助手发送一个16进制的数组 单片机怎么接受
给你一个单片机基础通讯程序和上位机串口调试程序,你试一下,在这个基础之上修改。

与单片机间的串口通信,如何能发送与接收16位的数据
当然不能一次就发16位数据的,要把16位数据分成两个字节,即高8位和低8位。发送时,可先发低8位,后发高8位。接收时,也按这个顺序接收,再组合恢复成16位数就行了。如果先发高8位,后发低8位也行,只要发送\/接收要统一先后顺序就可以,就能接收到正确的16位数据了。

C51如何接收和发送 串口工具 16位数据
51单片机一次只能接收1个字节数据(8位),若要接收两个字节,串口工具应该分成两字节发送。比如先发送高字节,再发送低字节。对于 100H,按十六进制发送 01 00,单片机收到第一字节数据保存起来,收到第二字节后将两个8位数合并成16位数。

低位(8位)的单片机能与高位的DA模块(16位的AD420)连接串行传送数据吗...
16位的AD420指的是它的数据分辨率,不是16位并口,AD420是串口通信方式,你看看它的串口接入是否要接上拉电阻,如果不用加上拉电阻的话直接连接上I\/O口就行啦,在i\/o口上模拟出串口通信方式就行啦。如果单片机有串口的话就更简单啦,直接连接就行。建议你看看网上针对你的单片机和AD420的操作程序...

单片机与PC串口16位数据通信的自定协议问题
1、你要考虑计数器数据中也遇到0xFA时不要造成混乱。2、如果通信距离在两三米内,且数据错误不会产生严重后果的话,可以不用校验。3、不知你发送数据的频度有多高,如果不高的话,可以用ASCII码发送,非ASCII码则作为帧头。4、如果线路比较繁忙,你可以用0xFX作为帧头,把后面两个字节的最高位移到...

单片机通过串口发送一个16位数
单片机通过串口发送一个16位数只能分两次发送,因为sbuff只是一个八位寄存器,只能装八位数据;单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I\/O口和中断系统、定时器\/计数器等功能(可能还包括显示驱动...

相似回答