永发信息网

uart串口通信和sprintf函数一起用就有问题了

答案:2  悬赏:40  手机版
解决时间 2021-01-29 19:09
  • 提问者网友:了了无期
  • 2021-01-29 02:02
下面是程序,哪里有问题了?

#include
#include
typedef unsigned char uint8;
typedef unsigned int uint16;

sfr AUXR = 0x8E;
bit flag_500ms = 0;

void Config_Uart();
void Uart_Send(uint8 *str);
void Config_Timer_0();

void main()
{
uint8 str[40];
EA = 1;
Config_Uart();
Config_Timer_0();
sprintf(str,"%d",1234567890);
while(1)
{
if(flag_500ms)
{
flag_500ms = 0;
Uart_Send(str);
}
}
}
void Uart_Send(uint8 *str)
{
uint8 *p;
p = str;
while(*p != '\0')
{
SBUF = *p;
while(!TI);
TI = 0;
p++;
}
}
void Config_Uart()
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设定定时器1为16位自动重装方式
TL1 = 0x8F; //设定定时初值
TH1 = 0xFD; //设定定时初值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
ES = 1;
}
void Config_Timer_0()
{
TMOD |= 0xF0;
TMOD &= 0x01;
TH0 = (65536-2000)/256;
TL0 = (65536-2000)%256;
ET0 = 1;
TR0 = 1;
}
void Isr_Timer_0() interrupt 1
{
static uint16 counter = 0;
TH0 = (65536-2000)/256;
TL0 = (65536-2000)%256;
counter++;
if(counter>=250)
{
counter = 0;
flag_500ms = 1;
}
}

这个在上位机上只显示1,但是我将它变为sprintf(str,"%s%6.3f%c%c","temperature:",22.0625,'\r','\n');它就显示temperature:22.062,好的很,这是为什么呢?
最佳答案
  • 五星知识达人网友:北方的南先生
  • 2021-01-29 02:12
1. 保证目标缓冲区长度够用 2. 格式串和后边的参数一定要对应, 个数和类型都必须相同 3. 使用"%s"时更要加倍小心, 限制转换长度是个可行的方法, 如: "%.100s" 4. 用snprintf代替sprintf, 要安全一些
全部回答
  • 1楼网友:何以畏孤独
  • 2021-01-29 02:45
没看懂什么意思?
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯