您的位置 首页 5G

51 单片机 sprintf 数字格局问题

最近做51小车,期间发现,sprintf在51单片机上发生了一点小意外。出现意外的源程序如下:#includereg51.h>#includestdio.h>typedef…

最近做51小车,期间发现,sprintf51单片机上发生了一点小意外。

呈现意外的源程序如下:

#include #include typedef unsigned char uchar;typedef unsigned int uint;uchar n;uint dat;char buf[128];void delay_ms(unsigned int nCount){unsigned int j = 0,i=0;for (j = nCount; j != 0; j--)for(i = 7960; i != 0; i--);}#define UART#define SENDSTR#ifdef UART//串口初始化 晶振为 11.0592M  方法 1 波特率 300-57600 void InitCom(unsigned char BaudRate) { unsigned char THTL; switch (BaudRate) { case 1: THTL = 64; break; //波特率 300 case 2: THTL = 160; break; //600 case 3: THTL = 208; break; //1200 case 4: THTL = 232; break; //2400 case 5: THTL = 244; break; //4800 case 6: THTL = 250; break; //9600 case 7: THTL = 253; break; //19200 case 8: THTL = 255; break; //57600 default: THTL = 208; } SCON = 0x50; //串口方法 1,答应接纳 TMOD = 0x20; //守时器1守时方法2 TCON = 0x40; //设守时器 1 开端计数 TH1 = THTL; TL1 = THTL; PCON = 0x80; //波特率加倍操控,SMOD 位 RI = 0; //清收发标志 TI = 0; // 发送TR1 = 1; //发动守时器 }//向串口输出一个字符(非中止方法) void ComOutChar(char OutData) { SBUF = OutData; //输出字符 while(!TI); //空语句判别字符是否发完 TI = 0; //清 TI } void send_str(char *str){while(*str) ComOutChar(*str++);}#define UARTOUT(inum) ComOutChar((uchar)inum);// ComOutChar((uchar)inum>>8);ComOutChar((uchar)inum&0xff);	   #endif // UARTvoid main(){  InitCom(6);for (n=0; n<8; ++n) {P0 ^= 0x0f;dat = 4*n + 1;sprintf(buf,"n:%u dat:%u \n", n, dat);send_str(buf);	delay_ms(100);}}

串口接纳到的数据却不是意料的:

这儿的 n, dat, 冒号,空格,换行都没有犯错,仅仅两个整数在sprintf中呈现了一些反常。

我们都来看看为什么啊?

跋文:后来发现,原来是Keil完成的sprintf的问题——要求"%d"对应的参数有必要以int型(2B)传入,sprintf在转义时不论如何都读取两个字节;

而这儿用char(1B)传入所以导致呈现了这样的状况,解决方法也比较简单——只需在传入的参数前面各自加上(int)强制转化一下

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/5g/264888.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部