2014-02-03 2 views
2

Привет всем, почему Serial.print() не работает для Arduino micro?Невозможно просмотреть Serial.print() для Arduino micro

Я попробовал этот код

void setup() { 

    Serial.begin(9600); // initialization 
    while (!Serial){} 
    ; 

    Serial.println("Begin"); 
} 

Но ничего не было показано на последовательном мониторе.

Заранее благодарен!

+0

Вы действительно можете написать действующий код? Вы не закрыли свой блок. – zmo

+0

Счастье, я забыл закрыть блок. исправил мой код уже. – shannon

ответ

2

Я предполагаю, что вы имели в виду:

void setup() { 
    Serial.begin(9600); 
    while (!Serial); 
    Serial.println("Begin"); 
} 

и на самом деле то, что вы хотите:

void setup() { 
    Serial.begin(9600); 
    Serial.println("Begin"); 
} 

, потому что я думаю, что !Serial не определено поведение, Serial является экземпляр для последовательной связи , И вызов оператора not класса Serial может компилироваться и работать, но он всегда будет возвращать то же самое, независимо от того, является ли оно истинным или ложным. Если он вернет false, вы просто закончите блокировку своего ардуино от выполнения чего-либо еще после этого утверждения.

Хотя, в основном, при настройке последовательной связи вы можете с уверенностью предположить, что он готов к общению. Иногда вам может потребоваться немного отложить (примерно 3 секунды от моего собственного опыта), для главного компьютера для настройки устройства для каждого arduinos atmega32uX, что относится к Micro и Leonardo. Если вы не добавите эту задержку в 3 секунды, оператор Begin будет напечатан Arduino, но вы его не увидите, так как компьютер не перезагрузил устройство снова до он печатается.

Чтобы лучше понять, что я имею в виду попробовать следующий код:

void setup() { 
    Serial.begin(9600); 
    Serial.println(10); 
    delay(1000); 
    Serial.println(9); 
    delay(1000); 
    Serial.println(8); 
    delay(1000); 
    Serial.println(7); 
    delay(1000); 
    Serial.println(6); 
    delay(1000); 
    Serial.println(5); 
    delay(1000); 
    Serial.println(4); 
    delay(1000); 
    Serial.println(3); 
    delay(1000); 
    Serial.println(2); 
    delay(1000); 
    Serial.println(1); 
    delay(1000); 
    Serial.println("Begin"); 
} 

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

НТН

+1

"while (! Serial) {};" заменяет задержку 3s для U32 и USB arduino's. Это обычная практика. И может быть оставлено это для других AVR-устройств USB, поскольку Serial немедленно запускается в этих случаях. Итак, ваше первое предположение верно. Ошибка Шеннона была с {, как вы указали. – mpflaga

+0

Я думаю, что zmo правильный, поскольку я пытался запустить код с (! Serial) {}, 'begin' не печатается. Я добавил задержку с использованием задержки (3000), и она работает. – shannon

1

Для Леандро, Micro, а также любые другие доски с использованием микроконтроллеров Atmega32u4, вы должны быть уверены, чтобы установить RTS и DTR высокие после подключения к контроллеру. Вот код C#, который я использовал:

_port.Handshake = Handshake.None; 
_port.Open(); 
_port.RtsEnable = true; 
_port.DtrEnable = true; 
0

У меня была аналогичная проблема. Я слушал серийный порт и подождал, пока Ардуино отправит строку Arduino is ready!. Только после этого я отправлял данные через последовательный порт (в моем случае через USB). Способ решения проблемы - подождать несколько секунд до обмена сообщениями с помощью Serial. Но в моем случае я нуждался в этом, чтобы общаться как можно скорее. Так что я сделал:

String READY_MSG = "Arduino is ready!"; 
bool isConnected = false; 

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

void loop(){ 
    while(!Serial){ 
     // Do nothing... Wait for serial connection 
     isConnected = false; 
    } 
    // If we were not connected, it means we need to greet with READY_MSG 
    if(!isConnected){ 
     isConnected = true; 
     Serial.print(READY_MSG); 
    } 
    // We can safely communicate now! 
} 

Надеюсь, это поможет кому-то!

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