新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51 單片機 sprintf 數字格式問題

        51 單片機 sprintf 數字格式問題

        作者: 時間:2016-11-19 來源:網絡 收藏
        最近做51小車,期間發現,sprintf51單片機上發生了一點小意外。

        出現意外的源程序如下:

        本文引用地址:http://www.104case.com/article/201611/318118.htm
        #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)強制轉換一下



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 云浮市| 加查县| 竹溪县| 金华市| 贺兰县| 台东市| 安化县| 磐石市| 叶城县| 新建县| 云梦县| 泌阳县| 武胜县| 肥城市| 通山县| 铅山县| 奈曼旗| 馆陶县| 太谷县| 苏尼特左旗| 郸城县| 铅山县| 莫力| 裕民县| 金门县| 噶尔县| 启东市| 建水县| 婺源县| 宁河县| 龙门县| 剑川县| 鄂托克旗| 澄迈县| 岗巴县| 长阳| 怀柔区| 灵丘县| 葫芦岛市| 灵石县| 昭苏县|