搜索
bottom↓
回复: 14

51单片机用“sprintf”遇到问题,输出变量自动扩大256倍

[复制链接]

出0入0汤圆

发表于 2016-2-22 13:04:42 | 显示全部楼层 |阅读模式
不知道这样标题对不对?

单片机用的是STC12C5608AD,
准备用他的4路PWM做一个电脑风扇的调速器。但是刚开始折腾显示部分就遇到了一个小麻烦。
屏幕用了两个,一个是MP3拆的12864液晶。显示正常。
另一个是某宝买的串口通讯彩屏。
在使用“sprintf”函数然后输出串口时,里面的变量会有一个随机的初始值(比如照片中原本应显示0,实际显示221)。然后变量会自动扩大256倍,实际显示出来的数值就是变量扩大256倍在加上这个初始值(比如第二张照片中原本应该显示1,现在显示“221+1*256”=477)
除了变量以外的数值显示正常!
折腾了好久也没有一个所以然……
所以请各位大神帮忙出出主意

相关代码:
#include "stdio.h"
uchar Aold=0,Bold=0,st=0,num=0;//±àÂëÆ÷²âÊÔ
uchar idata buf[64];

void SendData(uchar dat1)
{
        ES=0;
        TI=0;
        //TB8=~P;
        SBUF=dat1;
        while(!TI);
        TI=0;
}

void SendString(char *s)
{
        while(*s)
        {
        SendData(*s++);
        }
        delay(10);
}       

sprintf(buf,"DS16(115,147,'0-255:%02d',15);\r\n",num);
SendString(buf);       

下面是图:

初始值应为0,实际显示221

原本应该显示1,现在显示“221+1*256”=477

串口传出的数据,除变量外其他正常

原本应显示2,实际显示733

原本应显示9,实际显示2525

整个“小玩意儿”,网线没有协议,纯粹当做延长线用


“完整”源代码,就算不能解决问题,也可以给初学者一个参考,(st7567液晶当做字符屏,中断方式驱动旋转编码器)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2016-2-22 14:04:36 | 显示全部楼层
jswd0810 发表于 2016-2-22 13:42
你的buf是uchar,后面的格式是%d

虽然还是不怎么懂,但是百度了一下,
buf改成char,效果一样
后面的格式%02hu也一样

出0入0汤圆

发表于 2016-2-22 14:06:23 | 显示全部楼层
估计是变量类型定义错了

出0入0汤圆

发表于 2016-2-22 14:09:53 | 显示全部楼层
把num定义成int就可以正常显示了
这个问题不知道有没有好的解决方法,当时好像试过强制转换也不行

出0入475汤圆

发表于 2016-2-22 14:13:00 | 显示全部楼层
8位机
打印格式默认是 int

所以两个解决办法 1.前面加'b'表示UCHAR,例如 %02bd
2.printf("%02d",(unsigned int)num)

实际上都是强制转换的概念

也许你后面遇到  long的还会出错,所以补充一下,logn的需要加'l'转换

出0入0汤圆

发表于 2016-2-22 14:57:20 | 显示全部楼层
jswd0810 发表于 2016-2-22 14:29
sprintf(buf,"DS16(115,147,'0-255:%02c',15);\r\n",num);
这样试试

%c不是打印字符的吗,楼主要的是数值。。。

出0入30汤圆

发表于 2016-2-22 15:07:27 | 显示全部楼层
/*******************************************
KEIL里扩展出了b,h,l来对输入字节宽的设置:
(1)b八位
(2)h十六位(默认)
(3)l三十二位
在Keil C51中用printf输出一个单字节变量时要使用%bd,如
unsigned char counter;
printf(“Current count: %bd\n”, counter);//输出8位”十进制有符号整数”
printf(“Current count: %bx\n”, counter);//输出8位”无符号以十六进制表示的整数”

以上请参考

出0入0汤圆

 楼主| 发表于 2016-2-22 16:51:59 | 显示全部楼层
1a2b3c 发表于 2016-2-22 14:13
8位机
打印格式默认是 int

谢谢了。
两个方法都试过了,都可以用,但是用“unsigned int”没必要,而且占用资源多,所以选择了加一个“b”

出0入0汤圆

 楼主| 发表于 2016-2-22 16:52:24 | 显示全部楼层
jswd0810 发表于 2016-2-22 14:29
sprintf(buf,"DS16(115,147,'0-255:%02c',15);\r\n",num);
这样试试

这样不行。
显示到屏幕上是乱码

出0入0汤圆

 楼主| 发表于 2016-2-22 16:53:01 | 显示全部楼层
lovelywwei 发表于 2016-2-22 15:07
/*******************************************
KEIL里扩展出了b,h,l来对输入字节宽的设置:
(1)b八位

谢谢了!这个比较全面

出0入0汤圆

发表于 2016-3-28 11:53:05 | 显示全部楼层
之前还没注意到这个问题,学习了~~~

出0入0汤圆

发表于 2016-3-28 16:25:48 | 显示全部楼层
没遇到过这个问题。

出0入8汤圆

发表于 2016-3-28 16:57:49 来自手机 | 显示全部楼层
学习了~~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-14 00:34

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表