51单片机串口通信发送多个字节的问题

题目是:以16进制发送一个0-65536之间的任一数,当单片机收到后在数码管上动态显示出来,波特率自定。

我已经把数字分成两个8位接收进来了,但最后数码管上显示的最大还是255,不知为何

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit wela=P2^7;
sbit dula=P2^6;
uchar code tablewe[]={0xfe,0xfd,0xfb,0xf7,0xef};
uchar code tabledu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar flag,wan,qian,shi,bai,ge;
uint a;

void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}

void init()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SM1=1;
REN=1;
EA=1;
ES=1;
}

void display(uchar wan,uchar qian,uchar bai,uchar shi,uchar ge)
{
wan=a/10000;
qian=a%10000/1000;
bai=a%1000/100;
shi=a%100/10;
ge=a%10;

dula=1;
P0=tabledu[wan];
dula=0;
P0=0xff;
wela=1;
P0=tablewe[0];
wela=0;
delayms(5);

dula=1;
P0=tabledu[qian];
dula=0;
P0=0xff;
wela=1;
P0=tablewe[1];
wela=0;
delayms(5);

dula=1;
P0=tabledu[bai];
dula=0;
P0=0xff;
wela=1;
P0=tablewe[2];
wela=0;
delayms(5);

dula=1;
P0=tabledu[shi];
dula=0;
P0=0xff;
wela=1;
P0=tablewe[3];
wela=0;
delayms(5);

dula=1;
P0=tabledu[ge];
dula=0;
P0=0xff;
wela=1;
P0=tablewe[4];
wela=0;
delayms(5);
}

void main()
{
init();
while(1)
{
if(flag==1)
{
display(wan,qian,bai,shi,ge);
ES=0;
SBUF=a/256;
while(!TI);
TI=0;
SBUF=a%256;
while(!TI);
TI=0;
ES=1;
flag=0;
}
}
}

void ser() interrupt 4
{
static uchar i=0;
RI=0;
if(i==0)
{
a=SBUF;
i++;
}
else
{
a=a*256+SBUF;
i=0;
flag=1;
}
}

串口通信,每次,只能是一个字节,即:0~255。

0~65535,就要用两次。

0~65536,就要用三次。

这么多字节的传送,楼主是怎么发送的?追问

我在中断里不是把它分成两次发送了么 。。 那种方法不对吗?

追答

我已经把数字分成两个8位接收进来了,但最后数码管上显示的最大还是255,
----
不是说收的问题。

不是先得有人发送,单片机,才能接收吗?

这么多字节的传送,楼主是怎么发送的?

追问

没太理解你的意思。 不就两个字节吗? 我就是用那个串口助手,比如我输入一个fffd,数码管上应该显示65533,但显示的是00255

追答

FFFD,是 16 进制?

哪个是第一字节,哪个是第二字节?

你还有反回传输的部分,此时,也可能漏掉某个字节。

反向传输,串口助手,正常收到了 FFFD 吗?

追问

题目说用十六进制发送,先传送的第一字节是高八位吧,然后是低八位,不过最后反向传输回去的时候没收到FFFD,不知道怎么回事

追答

哦,反向,没有正常收到,这就应该是线路、波特率、方式几、等等问题。

如果反向收到,而单片机显示不正常,就可能是第一、第二字节数据错位的问题。
----
另外,多字节数据传送,不是像你这样的,应该先制订协议。

规定,什么数据是第一字节、数据的校验码等等。

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-10-16
照抄了楼主最后那无比精妙的if语句,我的程序果断活了。
第2个回答  2014-01-26
你的程序反应你的思路。思路有问题,结果就有问题。显示就一直放在循环 不要加什么条件判断避免意外的闪烁,中断里面(可以不看建议 最好分两次,数据,数据的反码来校验数据的正确性)关键来了 :进去之后把REN寄存器关了禁止接收。处理完里面的事情在把它打开。发送端每发一次需要等待一次 ,处理是需要时间的。多少可以估计的出来 大一点一般。好就这样就能解决
第3个回答  2014-01-25
能提供一下原理图吗?你的接收函数也有问题。
相似回答