微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 串口通信 问题 请大神帮忙指点

串口通信 问题 请大神帮忙指点

时间:10-02 整理:3721RD 点击:
各位大神 请教几个问题:
问题1,通过串口调试助手给51单片机发送一个16位的数据 如0-65536中的任一个数,那么是先发送高8位数据还是低8位数据?接收缓存器是先接收高8位还是低8位?

问题2:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
uint dat;
uchar wan,qian,bai,shi,ge,flag,buf1,buf2;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};


void delay(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void init_uart()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
}
void display(uint date)
{
wan=date/10000;
qian=date%10000/1000;
bai=date%1000/100;
shi=date%100/10;
ge=date%10;

dula=1;
P0=table[wan];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(5);

dula=1;
P0=table[qian];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(5);

dula=1;
P0=table[bai];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay(5);

dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delay(5);

dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xef;
wela=0;
}
void main()
{
init_uart();
while(1)
{
display(dat);
}
}
void ser() interrupt 4
{
if(RI)
{
flag++;
if(flag==1)
buf1=SBUF;
if(flag==2)
{
buf2=SBUF;
dat=buf1+buf2*256;
flag=0;
}
RI=0;
}
}
这是发送0-65535任意数然后通过数码管显示的程序,我是将16进制数 fffe分成两个字节发送,可是发送的时候,点击串口调试助手的手动发送 第一次竟然没反应,点了第二次之后才发送出去 并且成功显示了,很奇怪为什么 第一次发送时没反应? 请大神们指点一二

这题我会,你求我啊!我就告诉你!

我请你告诉我!

尴尬,中了21的毒,没想到你认真了,我还是帮你看看吧。先解决你的第一个问题吧,发送告八位和低八位都无所谓的,只要你另外一端能正常的识别了你发送的消息,达到你想要的效果就行了,不过一般来说还是先发现低八位吧。至于第二个问题我还真没遇到过,希望能帮助你。顺便说下这是发烧友提前的愚人节活动,希望莫往心里去

刚又看了下你的程序,有一个变量没有赋初值,一般来说全局变量应该赋一个初值的,都不知道你第二次是怎么成功接收到的,flag应该是一个随机值,你把flag赋值后再试一试吧,应该没什么问题了

没关系的,不会往心里去 有时也要点活跃的氛围

首先,定义的变量如果不赋初值的话不是默认为0吗?
再者 ,后来我给flag赋了0,结果还是一样, 应该不是这里的问题
还有我之所以想弄清楚是先发高八位 还是先发低八位 是因为 给的一个参考程序 在接收到两个字节组合成一个字的时候用dat=(buf1*256+buf2) 感觉他好像认为 先发高8位(所以先接受到高8位存放于buf1),再发低8位,但实际的结果显示却是错的,后来我自己 改成了dat=buf1+buf2*8 我认为是先发低8位 再发高8位 ,结果却是我点第一次发送0xfffe数码管显示的是65535,我点第二次发送0xfffe时才显示65534是正确的,所以感觉很奇怪与痛苦!非常希望能有高手帮忙解决这个问题, 或者帮我 重新写一下这个程序
以16进制发送一个0-65536之间的任一数,当单片机收到后在数码管上动态显示出来

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top