2013-06-01 3 views
0

Хорошо, у меня проблема. Я программирую что-то, что использует симулятор полета microsoft X SDK и Arduino. Приложение должно передавать данные через последовательный порт на Arduino борту, и я использую эти функции:Последовательный порт связи Arduino, C++

http://playground.arduino.cc/Interfacing/CPPWindows

Программа отлично работает за исключением того, что он вдруг перестает работать. Программа представляет собой цикл while (1), который непрерывно выполняет функцию, которая запрашивает данные для симулятора, а затем отправляет строку через последовательный порт. Это, как я вызвать функцию WriteData:

WriteData((char *)cadena.c_str(),8); 

Будучи cadena строковое я посылаю. Функция WriteData заключается в следующем:

bool Serial::WriteData(char *buffer, unsigned int nbChar) 
{ 
    DWORD bytesSend; 
    //Try to write the buffer on the Serial port 
    if(!WriteFile(this->hSerial, (void *)buffer, nbChar, &bytesSend, 0)) 
    { 
     //In case it don't work get comm error and return false 
     ClearCommError(this->hSerial, &this->errors, &this->status); 

     return false; 
    } 
    else 
     return true; 
    } 

Я видел, что, если я комментирую всю if-else, поэтому функция WriteFile никогда не вызывается, программа не перестает работать и идет на отлично (за исключением того, что информация не отправляется в Arduino). Если эта строка выполнена, программа останавливается через минуту или около того. И, останавливаясь, я не имею в виду сбой или что-то еще, я просто хочу сказать, что он останавливается, консоль все еще там со всеми сообщениями, она просто перестает работать.

Что может быть?

EDIT: Хорошо, ардуино также непрерывно отправлял данные, которые никогда не читались программой, может быть, это проблема? Может ли быть так, что буфер был заполнен, а WriteFile ждал, пока на нем не будет места ?, потому что знаю, что я не пишу в сериал, кажется, что он работает нормально ...

ответ

0

WriteFile() будет стоять когда буфер передачи заполнен до емкости. Он будет пуст, когда вы позаботитесь о правильном установлении связи. Либо электрически, проводя сигналы DSR и CTS, которые, как правило, пропускаются на Arduino. Или отключив функцию подтверждения связи, SetCommState(). Установка тайм-аутов с помощью SetCommTimeouts() - еще одна достойная стратегия для добавления минимального восстановления ошибок.

Не читать данные, присланные Arduino, также не имеет большого количества очков. Лучше всего реализовать это постепенно, чтобы вы могли сосредоточиться на решении одной проблемы за раз. Однако он, как правило, не позволяет ПК передавать данные по модулю ошибки проводки связи.

+0

Спасибо за ответ. Я попробую некоторых из них посмотреть, как это работает. – MyUserIsThis

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