我正在使用ATmega8,我正在尝试通过包含变量的USART(printf
样式)发送字符串。我使用Atmel Studio 6.2
作为AVR编程的IDE。这是我的代码: -
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
void USARTInit(uint16_t ubrr_value) // initialize USART
{
UBRRL = ubrr_value;
UBRRH = (ubrr_value>>8);
UCSRC|=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
UCSRB=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
}
void USARTWriteChar(char data) // send character using USART
{
while(!(UCSRA & (1<<UDRE)));
UDR=data;
}
void send_string(char s[]) // send string using USART
{
int i =0;
while (s[i] != 0x00)
{
USARTWriteChar(s[i]);
i++;
}
USARTWriteChar('\n');
}
int main(void)
{
USARTInit(51);
char val='A';
while(1)
{
send_string("Value = %c",val);
}
}
现在,当我编译代码时,我收到了这个错误: -
函数'send_string`
的参数太多了
所以,显然它不像C编程那样接受%c
。在embedded C
中是否有一种方法可以在字符串中传递变量?
答案 0 :(得分:1)
函数
的参数太多了send_string
消息很清楚,你的send_string()
只接受指向char
的指针作为输入参数,但在调用时,你试图传递两个输入参数"Value = %c",val
导致不匹配。
您不能以您显示的方式使用格式说明符。
通常,要采用的方法是使用临时缓冲区,使用snprintf()
生成输入字符串,然后将缓冲区传递给send_string()
调用。
也就是说,由于您只是感兴趣将c
的值传递给send_string()
,因此您可以将函数减少为仅{{1}像
char
然后,传递常量(预定义的)字符串void send_string(char s) { ...
然后,输入参数go获得相同的效果。
答案 1 :(得分:-1)
首先,没有嵌入式C语言这样的东西。你正在用C编程。这段代码无效。
您的函数void send_string(char s[])
只接受char []
类型的一个参数。您将其称为send_string("Value = %c",val);
,因此您将两个参数传递给它。在C字符串%
中,字符没有特殊含义。它对printf
函数只有意义。您的通话等同于send_string("It doesn't matter what you write here", 'A');
你可以用另一种方式做你想做的事:
#include <stdio.h>
...
int main(void)
{
USARTInit(51);
char val='A';
char buffer[64];
sprintf(buffer, "Value = %c", val);
while(1)
{
send_string(buffer);
}
}