标题:
51单片机串口通讯问题,大家看一下,是软件问题,还是晶振问题,小白搞不定了
[打印本页]
作者:
廖振基
时间:
2022-1-9 16:29
标题:
51单片机串口通讯问题,大家看一下,是软件问题,还是晶振问题,小白搞不定了
单片机12MHZ晶振。软件下载到单片机后问题表现为;
软件设想的表现是;
单片机收到上位机发送的任何数据后,先回复:“收到”,再在“收到”后面贴上上位机发送的数据。
实际表现为,发送:1 回复;收到1 正常
发送;11 回复;收到1 不正常, 应该为“收到11”,
发送;111 回复:收到1 不正常, 应该为“收到111”,
发送;1111 回复;收到1 不正常, 应该“收到1111”,
发送;11111 回复;收到1收到 不正常, 应该为,“收到11111”,
把for循环注释掉,也就是让单片机收到什么回复什么,一切表现正常
[16:21:01.014]发→◇1
□
[16:21:01.045]收←◆收到1
[16:21:05.575]发→◇11
□
[16:21:05.606]收←◆收到1
[16:21:10.095]发→◇111
□
[16:21:10.126]收←◆收到1
[16:21:13.415]发→◇1111
□
[16:21:13.446]收←◆收到1
[16:21:16.631]发→◇11111
□
[16:21:16.682]收←◆收到1收到
[16:21:19.614]发→◇111111
□
[16:21:19.666]收←◆收到1收到1
[16:21:27.823]发→◇1111111
□
[16:21:27.874]收←◆收到1收到1
[16:21:30.942]发→◇11111111
□
[16:21:30.994]收←◆收到1收到1
[16:21:34.047]发→◇111111111
□
[16:21:34.118]收←◆收到1收到1收到
[16:21:37.287]发→◇1111111111
□
[16:21:37.359]收←◆收到1收到1收到
[16:21:41.686]发→◇11111111111
□
[16:21:41.717]收←◆收到1
[16:21:41.762]收←◆收到1收到
[16:21:44.391]发→◇111111111111
□
[16:21:44.463]收←◆收到1收到1收到1
作者:
廖振基
时间:
2022-1-9 16:29
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char flag, a, i;
uchar code table[]="收到";
void delayms(char i)
{
while(i--);
}
void init()
{
TMOD=0x20;
SCON=0x50;
PCON=0x80;
TH1=0xe6;
TL1=0xe6;
TR1=1;
EA=1;
ES=1;
}
void main()
{
init();
while(1)
{
if(flag==1)
{
ES=0;
for(i=0;i<4;i++)
{
SBUF=table[i];
while(!TI);
TI=0;
}
SBUF=a;
while(!TI);
TI=0;
ES=1;
flag=0;
}
}
}
void ser() interrupt 4
{
RI=0;
a=SBUF;
flag=1;
}
复制代码
作者:
IdeaMing
时间:
2022-1-10 09:43
a只能存一个字节,所以回复a是1,没错啊。
你应该定义
unsigned char rx1buff[32];
unsigned char rx1cnt;
在接收中断里
if(rx1cnt<32)
rx1buff[rx1cnt++]=SBUFF;
还一个就是,你收到一个字符a,就置位了标志位并关闭了串口接收,所以后面的也不能收到。
目前你的问题是属于没有理解串口数据的存储。
如果改成我这样,你可能发现结果还是一样,因为你收到一个就结束了,发送收到的数据也只是SBUF=a;也只发送了一个数据,而应该像你上面发送收到一样是个循环把收到的数据全发出去。
那就是第二个问题,什么时候知道收完了呢?
1.加个末尾的识别字符
2.用定时器每次收到一个数据重新倒计时,如果倒计时结束了就认为一次数据接收完成,这个时候置位flag.
作者:
廖振基
时间:
2022-1-11 11:06
总之太多奇奇怪怪的问题了,本人先把这个挂起来以后用到的时候再来研究!!!!!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1