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

Passing a variable in string in Embedded C

我正在使用 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);

    }
}

现在,当我编译我的代码时,我得到了这个错误:-

too many arguments to function 'send_string`

所以,显然它不像在 C 编程中那样接受 %cembedded C 中有没有办法在字符串中传递变量?

too many arguments to function send_string

那里的消息很清楚,你的 send_string() 只接受指向 char 的指针作为输入参数,但是在调用时,你试图传递两个输入参数 "Value = %c",val导致不匹配。

您不能按照显示的方式在此处使用格式说明符。

一般来说,方法是使用临时缓冲区,使用 snprintf() 生成输入字符串,然后将缓冲区传递给 send_string() 调用。

也就是说,由于您只感兴趣c 的值传递给 send_string(),您可以将函数缩减为仅采用char,喜欢

void send_string(char s) { ...

然后,传递常量(预定义)字符串Value =,然后,输入参数得到相同的效果。

首先,嵌入式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);
    }
}