在嵌入式C中传递字符串中的变量

时间:2016-07-12 09:26:07

标签: c gcc microcontroller avr-gcc atmelstudio

我正在使用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中是否有一种方法可以在字符串中传递变量?

2 个答案:

答案 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);
    }
}