2016-07-12 8 views
1

Я использую ATmega8, и я пытаюсь отправить строку над USART (в стиле printf), которые включают переменную. Я использую Atmel Studio 6.2 в качестве IDE для программирования AVR. Вот мой код: -Передача переменной в строке в Embedded C

#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, как это делает в программировании C. Есть ли способ в embedded C передать переменную в строку?

+0

Там нет языка «встроенный C»! И эта функция не входит в стандартную библиотеку, поэтому ** не работает ** в программировании «C». Сначала вы можете изучить C и какие функции. – Olaf

ответ

1

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 =, а затем входной аргумент go получает тот же эффект.

+0

Вы на самом деле * можете * - Но вам нужно переписать функцию, чтобы принять список переменных аргументов. Тем не менее, ваш метод с использованием 's [n] printf намного меньше усилий. – tofro

+1

Извините, но использование 'printf'-bloat во встроенной системе - действительно плохая идея - если она доступна вообще. – Olaf

+0

@tofro вот почему я упомянул _ ".. то, как вы показали .." _. –

-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); 
    } 
} 
+0

Повторяю то, что я написал на другой ответ: использование 'printf'-bloat во встроенной системе - действительно плохая идея - если она доступна вообще. (И ваш ответ содержит то же самое, что и другой, немного более сложный). Btw. 1KiB-буфер в системе, которая имеет только 1KiB ОЗУ? Шутки в сторону? – Olaf

+0

@Olaf Это должно быть так плохо, если вы не называете это слишком часто.Для меня он неплохо работал на STM32. На Atmega8 это должно быть хуже, хотя ... И да, возможно, 1KiB-буфер на Atmega8 - это не очень хорошая идея ... Во всяком случае, мы не знаем, что OP пытается достичь, но явно он хотел использовать синтаксис 'printf'. Я тоже не рекомендую. – Rames

+0

@Olaf Я имею в виду, что если операция занимает 1 секунду, но выполняется один раз в минуту, тогда ее время выполнения может быть приемлемым. Я просто ответил на вопрос. Он хотел использовать синтаксис 'printf'. Напишите лучший ответ, если хотите, но, очевидно, ОП не опытный программист и хотел чего-то простого ... Что происходит медленно, а что не зависит от ваших требований. Иногда вы хотите быстро реализовать функцию, не переосмысливая преобразование float в строку и тому подобное. – Rames