51单片机串口通信上位机接收数据丢失,怎么解决

2019-07-14 20:40发布

各位好!

      上位机发送数据,单片机接收后再将同样的数据发送出来,但是发送出来的数据会丢失1~2个数据,不知道怎么回事,望解答!

  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. uchar flag,i;
  6. uchar temp;

  7. uchar code table[] = "I get ";

  8. void initial();

  9. void main()
  10. {
  11.         initial();

  12.         while(1)
  13.         {
  14.                 if(flag == 1)
  15.                 {
  16.                         ES = 0;

  17.                         /*for(i=0;i<6;i++)
  18.                         {
  19.                                 SBUF = table[i];
  20.                                 while(!TI);
  21.                                 TI = 0;
  22.                         }*/
  23.                         SBUF = temp;
  24.                         while(!TI);
  25.                         TI = 0;
  26.                         ES = 1;
  27.                         flag = 0;
  28.                 }
  29.         }
  30. }

  31. void serial()interrupt 4
  32. {
  33.         temp = SBUF;
  34.         flag = 1;
  35.         RI = 0;
  36. }

  37. void initial()
  38. {
  39.         TMOD = 0x20;
  40.         TH1 = 0xfd;
  41.         TL1 = 0xfd;
  42.         TR1 = 1;
  43.         REN = 1;
  44.         SM0 = 0;
  45.         SM1 =1;
  46.         EA = 1;
  47.         ES = 1;
  48. }
复制代码


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
mcqueen
1楼-- · 2019-07-15 06:46
嘬uuu 发表于 2016-7-5 20:54
void serial()interrupt 4
{    if (RI) {
        temp = SBUF;        flag = 1;

发送中断时关闭了,接收的时候进入中断已经是RI=1啦,我也试了下还是有丢数据的问题。
比如我发送字符串“123”。接收后发出来只有12或13
mcqueen
2楼-- · 2019-07-15 09:25
liuxiu1991 发表于 2016-7-5 14:53
你说的1~2个数据,指的是1~2个字节,还是1~2个bit.还有你用的是串口助手之类的发的么?如果这样你还丢失的话,你可以在发送的字节中间加一个delay(30)之类的延时就应该好了

比如:发送字符串“1234”,单片机接收后再发送出来可能只有123,或124,或者134等等;

我在发送数据的时候,添加了:
while(!TI);这个应该一样的效果吧
mcqueen
3楼-- · 2019-07-15 11:22
liuxiu1991 发表于 2016-7-5 14:53
你说的1~2个数据,指的是1~2个字节,还是1~2个bit.还有你用的是串口助手之类的发的么?如果这样你还丢失的话,你可以在发送的字节中间加一个delay(30)之类的延时就应该好了

在SBUF = temp的后面加吗,加了无论接收到的数据是多少,发出后只有一位
mcqueen
4楼-- · 2019-07-15 15:30
mcqueen 发表于 2016-7-5 21:38
发送中断时关闭了,接收的时候进入中断已经是RI=1啦,我也试了下还是有丢数据的问题。
比如我发送字符串“123”。接收后发出来只有12或13

就是这种状况。

上位机收发截图

上位机收发截图
liuxiu1991
5楼-- · 2019-07-15 21:22
 精彩回答 2  元偷偷看……
mcqueen
6楼-- · 2019-07-15 23:43
liuxiu1991 发表于 2016-7-6 08:23
你试过加延时了,还是不正常么?
WHILE(!TI)这句话一般是放到你发送之前,就是SBUF=...这条之前。肯定是先判断串口闲置,才会发送的啊

后面我把flag=0放在了ES=1之前就没有问题了。。。。。

一周热门 更多>