51单片机串口通信上位机接收数据丢失,怎么解决
时间:10-02
整理:3721RD
点击:
各位好!
上位机发送数据,单片机接收后再将同样的数据发送出来,但是发送出来的数据会丢失1~2个数据,不知道怎么回事,望解答!
上位机发送数据,单片机接收后再将同样的数据发送出来,但是发送出来的数据会丢失1~2个数据,不知道怎么回事,望解答!
- #include<reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar flag,i;
- uchar temp;
- uchar code table[] = "I get ";
- void initial();
- void main()
- {
- initial();
- while(1)
- {
- if(flag == 1)
- {
- ES = 0;
- /*for(i=0;i<6;i++)
- {
- SBUF = table[i];
- while(!TI);
- TI = 0;
- }*/
- SBUF = temp;
- while(!TI);
- TI = 0;
- ES = 1;
- flag = 0;
- }
- }
- }
- void serial()interrupt 4
- {
- temp = SBUF;
- flag = 1;
- RI = 0;
- }
- void initial()
- {
- TMOD = 0x20;
- TH1 = 0xfd;
- TL1 = 0xfd;
- TR1 = 1;
- REN = 1;
- SM0 = 0;
- SM1 =1;
- EA = 1;
- ES = 1;
- }
你说的1~2个数据,指的是1~2个字节,还是1~2个bit.还有你用的是串口助手之类的发的么?如果这样你还丢失的话,你可以在发送的字节中间加一个delay(30)之类的延时就应该好了
void serial()interrupt 4
{ if (RI) {
temp = SBUF; flag = 1;
RI = 0;
}
}
改成这样试试。
发送中断时关闭了,接收的时候进入中断已经是RI=1啦,我也试了下还是有丢数据的问题。
比如我发送字符串“123”。接收后发出来只有12或13
比如:发送字符串“1234”,单片机接收后再发送出来可能只有123,或124,或者134等等;
我在发送数据的时候,添加了:
while(!TI);这个应该一样的效果吧
在SBUF = temp的后面加吗,加了无论接收到的数据是多少,发出后只有一位
就是这种状况。
上位机收发截图
你试过加延时了,还是不正常么?
WHILE(!TI)这句话一般是放到你发送之前,就是SBUF=...这条之前。肯定是先判断串口闲置,才会发送的啊
后面我把flag=0放在了ES=1之前就没有问题了。
你这个flag除了占一个系统时钟,什么用都没有,所以你还得找找原因
应该不是flag位置的问题,你可是试试吧flag再换换位置,看看有没有什么变化
我看你的串口助手上勾选是以ASCII格式发送的,你想想看以ASCII格式发送123会得到什么?以十进制发送试试看
如果一定要用ASCII发送,把发送程序放到中断中