关于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,选其他会乱码
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define N 6 //可一次接收数据量
- void rs232_init();
- uchar flag,i,d,num;
- uint n; //删除无用变量
- uchar table[6];
- uchar table1[N]; //接收缓存数组
- uchar j=0; //接收计数器
- //sbit led=P1^0;
- main()
- {
- rs232_init();
- while(1)
- {
- // num++;
- n=100000;num=348965;
- for(i=0;i<6;i++)
- {
- d=(int)(num/n);
- num=(int)(num-n*d);
- d=(char)(d+0x30);
-
- n=n/10;
- table[i]=d;
- }
- if(flag==1)
- {
- ES=0;
- for(i=0;i<6;i++)
- {
- SBUF=table[i];
- while(!TI);
- TI=0;
- }
- for(j=0;j<N;j++) //发送接收数组
- {
- SBUF=table1[j];
- while(!TI);
- TI=0;
- }
- j=0; //清零接收计数器
- ES=1;
- flag=0;
- }
- }
- }
- void rs232_init()
- {
- TMOD=0x20;
- TH1=0xfd;
- TL1=0xfd;
- TR1=1;
- SM0=0;
- SM1=1;
- REN=1; //先设定号工作方式,在打开允许接收
- EA=1;
- ES=1;
- }
- void ser()interrupt 4
- {
- RI=0;
- table1[j++]=SBUF; //存数据到接收缓存
- if(j==N) //数组满时,允许发送
- flag=1;
- }
小编把 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);这个要怎么修改
噢噢,知道了,谢谢!
结果如何了