AVR单片机C程序问题 100
这是我用SHT75温湿度传感器采集数据并输出的一个程序的一部分,data[4]是所采集的4字节数据,然后用数组a[8]分别将各位和十位表示出来。程序部分如下:voidpu...
这是我用SHT75温湿度传感器采集数据并输出的一个程序的一部分,data[4]是所采集的4字节数据,然后用数组a[8]分别将各位和十位表示出来。程序部分如下:
void putchar0(unsigned char *c)
{
while(!(UCSR0A&(1<<UDRE0)));//等待上一个字节发完
UDR0=*c;
}
void putchar1(unsigned char *c)
{
for(int i=0;i<10;i++)
{
while(!(UCSR0A&(1<<UDRE0)));//等待上一个字节发完
UDR0=c[i];
}
}
int main()
{
unsigned char a[8]={};
unsigned char m[10]="Tempture:";
unsigned char n[10]="Humility:";
int j=0;
DDRC=0xff;
PORTC=0xff;
DDRB=0xff;
PORTB=0xff;
uart0_init();
connectionreset();
_delay_ms(5);
while(1)
{
temp_and_humi();
for(int i=0;i<4;i++)
{
a[j++]=data[i]/10+'0';
a[j++]=data[i]%10+'0';
}
putchar1(m);
putchar0(&a[0]);
putchar0(&a[1]);
putchar0(".");
putchar0(&a[2]);
putchar0(&a[3]);
putchar0(' ');
putchar1(n);
putchar0(&a[4]);
putchar0(&a[5]);
putchar0(".");
putchar0(&a[6]);
putchar0(&a[7]);
putchar0(' ');
j=0;
_delay_ms(5000);
}
}
我是用串口芯片在STC_ISP输出这些字符,可为什么它只输出Tempture: 呢?也就是说执行完了putchar1(m);它就直接又进入循环条件判断,这是为什么呢?百思不得其解。。。 展开
void putchar0(unsigned char *c)
{
while(!(UCSR0A&(1<<UDRE0)));//等待上一个字节发完
UDR0=*c;
}
void putchar1(unsigned char *c)
{
for(int i=0;i<10;i++)
{
while(!(UCSR0A&(1<<UDRE0)));//等待上一个字节发完
UDR0=c[i];
}
}
int main()
{
unsigned char a[8]={};
unsigned char m[10]="Tempture:";
unsigned char n[10]="Humility:";
int j=0;
DDRC=0xff;
PORTC=0xff;
DDRB=0xff;
PORTB=0xff;
uart0_init();
connectionreset();
_delay_ms(5);
while(1)
{
temp_and_humi();
for(int i=0;i<4;i++)
{
a[j++]=data[i]/10+'0';
a[j++]=data[i]%10+'0';
}
putchar1(m);
putchar0(&a[0]);
putchar0(&a[1]);
putchar0(".");
putchar0(&a[2]);
putchar0(&a[3]);
putchar0(' ');
putchar1(n);
putchar0(&a[4]);
putchar0(&a[5]);
putchar0(".");
putchar0(&a[6]);
putchar0(&a[7]);
putchar0(' ');
j=0;
_delay_ms(5000);
}
}
我是用串口芯片在STC_ISP输出这些字符,可为什么它只输出Tempture: 呢?也就是说执行完了putchar1(m);它就直接又进入循环条件判断,这是为什么呢?百思不得其解。。。 展开
2个回答
展开全部
void putchar0(unsigned char c) //这个副程序修改为 传值呼叫
{
while(!(UCSR0A&(1<<UDRE0)));//等待上一个字节发完
UDR0=c;
}
putchar0(a[0]); //把a[0]位址的内容显示出来
putchar0(a[1]);//把a[1]位址的内容显示出来
其他的也修改下,应该可以才对
{
while(!(UCSR0A&(1<<UDRE0)));//等待上一个字节发完
UDR0=c;
}
putchar0(a[0]); //把a[0]位址的内容显示出来
putchar0(a[1]);//把a[1]位址的内容显示出来
其他的也修改下,应该可以才对
追问
经多次尝试,我已成功修改程序并得到了正确的运行结果,改地地方只有一点:把putchar1中的i<10改为i<9。分析一下,字符串其实是9位,加上结束标志位'\0'共计10位,也就是说我不输出‘\0’位,就能够顺利输出余下部分的字符了,但我还是不明白为什么会这样呢?你认为呢?
追答
对串口来讲'\0' 就是NULL就是0,也是可以传送的,只是无法用ascii显示,要用hex显示
当初看你的程序,两个副程序都是传址呼叫,也就是传到副程序的是个地址。
putchar0(&a[0]); //这样用没有问题
putchar0("."); //这样用,传给副程序的是内容".",所以才建议改一下putchar0
你现在的情形,会不会是编译造成的?将数组的长度调整一下8->9 或者10->11
或者用串口调试伴侣v2.0试试,会不会软件对你输出0,造成显示问题
putchar1本身并没有错才对!!
意法半导体(中国)投资有限公司
2023-06-12 广告
2023-06-12 广告
STM32F103是一款高性能的嵌入式芯片,由意法半导体(STMicroelectronics)公司生产。它是STM32系列芯片之一,具有紧凑、低功耗、高性能等特点,被广泛应用于嵌入式系统中。STM32F103的主要特点包括:1. 集成了A...
点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询