Почему на моем Arduino нет серийных данных? - PullRequest
6 голосов
/ 29 сентября 2011

Я запустил простую последовательную программу на моем Arduino Uno , которая просто выводит на экран все, что вы печатаете.Это прекрасно работает при запуске в Arduino Sketch IDE (v22).

int incomingByte = 0;   // for incoming serial data

void setup() {
    Serial.begin(115200);   // opens serial port, sets data rate
}

void loop() {
    // send data only when you receive data:
    if (Serial.available() > 0) {
        // read the incoming byte:
        incomingByte = Serial.read();

        // say what you got:
        Serial.print("I received: ");
        Serial.println(incomingByte, DEC);
    }
}

(код взят из http://arduino.cc/en/Serial/Available)

Однако я предпочитаю не использовать Arduino IDE и скорее скомпилируюмой код C ++ с avr-g ++, поэтому я написал это, которое должно функционировать точно так же, как указано выше:

extern "C" {
#include <avr/io.h>
}
#include <HardwareSerial.h>

extern "C" void __cxa_pure_virtual() { while(1); }

int main (void)
{
    int incomingByte = 0;

    Serial.begin(115200);

    while (1) {
        if (Serial.available() > 0) {
            incomingByte = Serial.read();

            //print as an ASCII character
            Serial.print("received: ");
            Serial.println(incomingByte, DEC);
        }
    }
    return 1;
}

Я компилирую и запускаю его, но он не работает.Я никогда не вижу, чтобы мой текст эхом возвращался ко мне. Я попытался распечатать значение Serial.available() в цикле while(1), и оно всегда равно нулю. Всякий раз, когда я печатаю на клавиатуре, я вижу, что загорается светодиод RX, но ничего не происходитпосле этого я могу отредактировать свой код для успешного вызова Serial.println(), если он находится вне условного Serial.available().

Я подтвердил, что моя скорость передачи в моем последовательном программном обеспечениитакже установлен на 115200. И да, мое последовательное программное обеспечение указывает на правильный последовательный порт.

Чего мне не хватает?

Ответы [ 3 ]

3 голосов
/ 29 сентября 2011

Оригинальный клейкий код Arduino выглядит так:

#include <WProgram.h>
int main(void)
{
    init();
    setup();
    for (;;)
        loop();
    return 0;
}

В вашем коде отсутствует init(). init() определено в $ARDUINO_HOME/hardware/arduino/cores/arduino/wiring.c, вы можете либо напрямую ссылаться на него, либо просто скопировать код init() в свой код.

2 голосов
/ 30 сентября 2011

Нашел ответ на свой вопрос:

Оказывается, библиотека HardwareSerial.h использует прерывания. Это то, что автоматически решается для вас при сборке в Arduino IDE. Если вы не используете Arduino IDE (как и я), вы должны не забыть разрешить прерывания самостоятельно.

Просто #include <avr/interrupt.h> и вызовите sei();, чтобы включить прерывания, прежде чем пытаться использовать последовательную библиотеку.

ура!

2 голосов
/ 29 сентября 2011

Возможно, вы неправильно инициализировали порт UART на чипе.Это должно быть сделано вручную для микроконтроллеров, и Arduino IDE, вероятно, делал это для вас.Проверьте таблицу AVR для вашего чипа, в частности, раздел последовательного порта.

...