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

2019-07-15 14:44发布

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

  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. }
复制代码



QQ图片20160318094334.png
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
me860
1楼-- · 2019-07-15 17:08
楼主把 n num 两个改为long后,还一个地方没改
num=(int)(num-n*d);//好好看看 最佳答案
冯浩恩
2楼-- · 2019-07-15 22:36
 精彩回答 2  元偷偷看……
66ok
3楼-- · 2019-07-16 04:02
常试把数组变为固定值,然后发出去试试,如果可以的你就得找找程序填值部分了,还有一个原因,接收与发送都需要时间,所以每发一个中间最好是夹入一定延时,
青何以堪520
4楼-- · 2019-07-16 09:54
可能问题在你变量的值溢出了
uint型的n好像最大65535,你赋了n=100000
uchar型的num最大255,你赋了num=348965
冯浩恩
5楼-- · 2019-07-16 14:29
青何以堪520 发表于 2016-3-18 13:19
可能问题在你变量的值溢出了
uint型的n好像最大65535,你赋了n=100000
uchar型的num最大255,你赋了num=348965

你好,我把num和n设置成long型了,发现他的结果与改之前的确实不一样,但还是乱码,换成int型又会出现另外一组数
QQ图片20160318173005.png
冯浩恩
6楼-- · 2019-07-16 16:07
66ok 发表于 2016-3-18 11:13
常试把数组变为固定值,然后发出去试试,如果可以的你就得找找程序填值部分了,还有一个原因,接收与发送都需要时间,所以每发一个中间最好是夹入一定延时,

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

一周热门 更多>