int sprintf(char *string, char *format [,argument,...]);

51内核单片机+KEIL51编译器

在使用AT命令初始化模块时,使用sprintf进行指令数据值整合

若将数据直接使用%d转化成整形输入,数据到buf中出现错误

unsigned char xdata buf_a[10] = {0}}, buf_b[10] = {0};

sprintf(buf_a, "val_a=%d\r\n", 1); // 输出错误

sprintf(buf_b, "val_b=%d\r\n", 4);

尝试将数据值加大测试

sprintf 使用上的问题 数据错误

sprintf(buf_a, "val_a=%d\r\n", 255); // 一个字节,输出错误
    
sprintf(buf_b, "val_b=%d\r\n", 256); // 两个字节,出错正确

输入常数255的时候,占一个字节,他就给你分配一个字节,输入256的时候占2个字节
他就给你分配两个字节,两个字节的数据,则可以输出正确

sprintf 使用上的问题 数据错误

验证数据类型不同,输出内容
unsigned char xdata val_a = 123;
unsigned int xdata  val_b = 123; 

sprintf(buf_a, "val_a=%d\r\n", val_a);  // char型,一个字节,输出错误
sprintf(buf_b, "val_b=%d\r\n", val_b); // int 型,两个字节,输出正确

sprintf 使用上的问题 数据错误

查阅资料,keil51 内存没有对齐,在使用1个字节sprintf时出现数据错乱,

解决方法,在输出%d时,将数据类型定义成两个字节以上(short / int)。

 


    
 

相关文章: