微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于51单片机通过串口发送多位数的问题,想了一天一夜了T T

关于51单片机通过串口发送多位数的问题,想了一天一夜了T T

时间:10-02 整理:3721RD 点击:
各位大神,请问你们有做过51单片机串口通信把多位数发送给电脑的操作吗? 我把num的数据分拆开六个数然后转换成ascii码保存到数组里面,但是输送到电脑却是完全不一样的六个数。当我把num的位数减到三位,例如让num=345时[img=0,1]file:///C:\Users\浩恩\Documents\Tencent Files\754766991\Image\C2C\1O6PU$92Z@HK0WODS0DZ[Y0.jpg[/img]它却可以正常输出345,超过三位他就变了,请问你知道这是怎么回事吗?波特率选取9600,选其他会乱码






  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define N 6                                                        //可一次接收数据量
  5. void rs232_init();
  6. uchar flag,i,d,num;
  7. uint n;                                                      //删除无用变量                           
  8. uchar table[6];
  9. uchar table1[N];                                              //接收缓存数组
  10. uchar j=0;                                                             //接收计数器
  11. //sbit led=P1^0;
  12. main()
  13. {
  14.          rs232_init();
  15.          while(1)
  16.          {
  17.                          //        num++;
  18.                                 n=100000;num=348965;
  19.                                 for(i=0;i<6;i++)
  20.                          {                                                                
  21.                                                     d=(int)(num/n);
  22.                                                         num=(int)(num-n*d);
  23.                                                         d=(char)(d+0x30);
  24.                                                        
  25.                                                         n=n/10;
  26.                             table[i]=d;
  27.                                                   }
  28.                  if(flag==1)
  29.                  {
  30.                          ES=0;
  31.                          for(i=0;i<6;i++)
  32.                          {
  33.                                  SBUF=table[i];
  34.                                  while(!TI);
  35.                                  TI=0;
  36.                          }
  37.                          for(j=0;j<N;j++)                        //发送接收数组
  38.                                                  {
  39.                                                          SBUF=table1[j];
  40.                                  while(!TI);
  41.                                  TI=0;
  42.                                                 }
  43.                          j=0;                                           //清零接收计数器
  44.                          ES=1;
  45.                          flag=0;
  46.                  }               
  47.          }
  48. }
  49. void rs232_init()
  50. {
  51.          TMOD=0x20;
  52.          TH1=0xfd;
  53.          TL1=0xfd;
  54.          TR1=1;
  55.          SM0=0;
  56.          SM1=1;
  57.          REN=1;                                                        //先设定号工作方式,在打开允许接收
  58.          EA=1;
  59.          ES=1;        
  60. }
  61. void ser()interrupt 4
  62. {                 
  63.                 RI=0;
  64.                 table1[j++]=SBUF;                                //存数据到接收缓存
  65.                 if(j==N)                                                //数组满时,允许发送
  66.                 flag=1;
  67. }

复制代码





小编把 n num 两个改为long后,还一个地方没改
num=(int)(num-n*d);//好好看看

跪求各位大神了,为什么三位数和六位数会不同

常试把数组变为固定值,然后发出去试试,如果可以的你就得找找程序填值部分了,还有一个原因,接收与发送都需要时间,所以每发一个中间最好是夹入一定延时,

可能问题在你变量的值溢出了
uint型的n好像最大65535,你赋了n=100000
uchar型的num最大255,你赋了num=348965

你好,我把num和n设置成long型了,发现他的结果与改之前的确实不一样,但还是乱码,换成int型又会出现另外一组数


换成固定值得时候是可以成功发出去的

是溢出的问题吗?

我把n和num的值设置成int,char,long,每换一个字型接收到的数据都会发生变化,这是因为溢出?

不仅定义参数值有溢出,而且你一直加强制转换,建议你还是先了解一下自己要赋值的大小,以及强制转换是否是正确的

你好,请问如何知道自己软件的开发平台是多少位呢

num=(int)(num-n*d);这个要怎么修改

噢噢,知道了,谢谢!

结果如何了                 

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

网站地图

Top