2012-04-09 4 views
3

Пожалуйста, несите меня, я новичок в C, и я пытаюсь запрограммировать Arduino. Я хочу написать программу, которая выплескивает кадр данных определенной длины с байтовыми значениями от 0 до 255. Минимальный код для воспроизведения ошибки приведен ниже. При компиляции я получаю следующее сообщение об ошибке:ошибка: неверное преобразование из 'char *' в 'char'

sketch_apr09b.cpp: In function ‘char assembleFrame()’: 
sketch_apr09b.cpp:9:10: error: invalid conversion from ‘char*’ to ‘char’ 

Теперь у меня сложилось впечатление, что я плохо обращается в «обратный кадр», но я просто не могу понять, что случилось.

char assembleFrame() { 
    char frame[] = { 
    0x61 , 0x62 , 0x63 
    }; 
    return frame; 
} 

void setup() { 
    Serial.begin(115200); 
}; 

void loop() { 
    char frame = assembleFrame(); 
    Serial.print(frame); 
} 

Когда я бегу шестнадцатеричного на принимающем компьютере, я хочу видеть:

00000000 61 62 63           |abc| 
00000003 

Я нашел много подобных вопросов, не в состоянии понять, что я делать неправильно.

EDIT: Это то, к чему я придумал, но получаю неверные данные. Я думаю, что я посылаю указатель на фактические данные с этим.

byte *assembleFrame() { 
    byte frame[] = { 4 , 'a' , 'b' , 'c' }; 
    return frame; 
} 

void setup() { 
    Serial.begin(115200); 
}; 

void loop() { 
    byte *frame = assembleFrame(); 
    Serial.write(frame , frame[ 0 ]); 
} 

ответ

3

Тип char используется для хранения одного char (байт).

Ваше определение функции char assembleFrame определяет функция будет возвращать только один char, поэтому, когда вы пытаетесь вернуть char[]/char * (char массив/указатель), он терпит неудачу.

Похоже, Serial.print() может обрабатывать char *, что потенциально должно быть завершено с нулевой отметкой (потому что оно запрашивает спецификатор длины).

char *assembleFrame() { 
    char frame[] = { 
    0x61, 0x62, 0x63, 0x00 // null byte to signify end of string 
    }; 
    return frame; 
} 

void setup() { 
    Serial.begin(115200); 
}; 

void loop() { 
    char *frame = assembleFrame(); 
    Serial.print(frame); 
} 
+0

Этот код компилируется, и я вижу, что я делал неправильно, thnx. Я набирал 'char * assembleFrame()' вместо 'char * assembleFrame()'. Но теперь у меня есть новая проблема: я не могу использовать строки с нулевым завершением, потому что полезная нагрузка может содержать нулевые байты. Фиксированный размер не является проблемой. Это легко решить? (комментируя ваш ответ, у меня не было шанса на DuckDuckGo, но я сделаю это прямо сейчас). – jippie

+0

Вы можете отправлять байты в 'Serial.write()' по одному за раз, что должно допускать null. Может быть, 'assembleFrame' записывает кадр в буфер (указатель на строку) и возвращает длину - тогда вы можете выполнять итерацию через буфер и' Serial.write() 'each' char'. – lunixbochs

+1

да, нашел его всего 1 секунду назад сам :) на самом деле вы можете передать параметр длины с помощью Serial.write (buf, len 0) – jippie

-1

assembleFrame возвращает char в то время как вы вернетесь char*. Поскольку я не знаю, что вы делаете, я не могу предложить, как это исправить. Возможно, правильный тип возврата правильный.

0

Глядя на этот код:

char frame = assembleFrame(); 

Учитывая то, как вы используете его позже, ясно frame потребности быть объявлены char * не char и assembleFrame потребности быть объявлены как возвращение char *.

Смежные вопросы