• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

结构体在单片机上输出错误

执念.执战 2018-03-26 浏览量:1027
typedef unsigned char uint8_t; 
typedef struct {
  uint8_t dat;
  int temp;
}Tempsave;
void Test_Transform_temp(void){
		int temp;
		uint8_t dat1,dat2;
		uint8_t dat[10];

		Tempsave tem;
		tem.dat=50;
		tem.temp=110;
		dat1=tem.dat;
		temp=tem.temp;
		sprintf(dat,"%d,%05d\n",dat1,temp);
                //sprintf(dat,"%d,%05d\n",tem.dat,tem.temp);//j结果一样
               // printf(dat);//电脑上输出正确
		USART_SendStr("transform test: ");
		USART_SendStr(dat);//单片机输出就不对
}

这么一段代码,STVD编译的STM8L单片机中就是输出不对,为12800,25600,改变赋值,输出也改变。特意在电脑用软件编译运行了一下,没错啊,电脑上输出结果正确。又换了个单片机,用keil,运行也是这样。
debug 查看数据
tem.dat=50,和tem.temp=110数据对,
dat1=tem.dat; 这一步,dat1 是0,temp=tem.temp;后面的temp是138。就算直接将tem.dat 赋值到sprintf中,也错。以前用也没觉得有啥问题,突然出现这么个错误,我又去查了下结构体的使用,没错啊。
总感觉和正确结果就那么一道窗户纸的距离,但是找了半天,捅到的都是墙。求指点,谢谢。
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 你这个结构体没有定义结构体名称,至申明了一个结构体变量Tempsave,所以

    它只能使用一次,不能再定义其他结构体,也即是说不能Tempsave tem;这样定义。

    改正:

    typedef struct Tempsave{
      uint8_t dat;
      int temp;
    };

    • 发布于 2018-03-26
    • 举报
    • 评论 4
    • 0
    • 0
执念.执战 回复了 hayden:听了你的话我也忽然想到结构体好像只能使用一次的问题。于是全部修改了一遍。但是这个问题依然存在。只有将结构体中的uint8_t 改为 int 型,才能输出正确结果。但这个类型不是我想要的,不过还能将就用,因为数据也没超出范围。 回复
hayden 回复了 hayden:uint8_t好像是unsigned char吧只有1个字节,int有四个字节,你搞错了吧 回复
执念.执战 回复了 hayden:我需要的就是 uint8_t,但是结构体中定义为 int 才正常,定义为uint8_t 就出现上面问题。使用的数据都不超过255(实际不超过4,就是将其放到一个比特的两位中做标志位). 回复
电子老工程师 回复了 :客户的实物,型号:MJ13333,厂牌: Motorola Solutions, Inc. 回复

其他答案 数量:4
  • 可以把单片机输出的发出来让我看看吗
    • 发布于2018-03-26
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :ROHS文件需要代理商渠道向原厂申请。 回复

执念.执战 回复了 冰山一角 :对,这是在电脑上运行的。单片机只用串口输出函数,同样的程序是不行的。 回复
电子老工程师 回复了  :TPH1R403NL系列号, 尾缀L1:reel装 Q:无铅环保 M:产地代码。 回复

执念.执战 回复了 我对面的武器 :对啊,我上面对于uint8_t 赋值的数都小于150. 回复
电子老工程师 回复了  :销售产品名称:IPG16N10S4-61 可订购产品名称:IPG16N10S461ATMA1,名称不同,产品同一颗料,尾缀知识库已有介绍,请查阅 回复

  •  dat最大是255,你设置了12800,25600,但是其值还是255,,所以没有变
    • 发布于2018-04-22
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

结构体在单片机上输出错误