2013-06-18 2 views
0

Я использую C++ Builder 6 с установленным компонентом TComPort и Arduino. Вещь, что я пытаюсь сделать это следующим образом:Ожидание, пока рутина закончится на Arduino

for (int a = 0; a < n; a++){ 
    Edit1->Text = "first"; 
    ComPort->WriteString("a"); 
    //wait till process on Arduino is finished 
    //receive char from Arduino and continue 
    Edit1->Text = "scnd"; 
    ComPort->WriteString("b"); 
    //wait till process on Arduino is finished 
} 

Arduino код (корпус):

case 'b': 
    digitalWrite(ledPin2, HIGH); 
    delay(1000); 
    Serial.write('2'); 
    digitalWrite(ledPin2, LOW); 
    break; 

Я пытался использовать OnRxChar, но есть проблема с получением строки из Arduino. Иногда они «пустые», а иногда они правильные (2). Может ли кто-нибудь вести меня, какая лучшая функция я могу использовать?

Edit: ComPort имеет функцию Read(void *,int,bool), но я понятия не имею, что void* и int обозначает (я новичок).

Редакция 2: Решение! Это то, что я сделал:

1-я функция; Timer1-> Enabled = false; {инструкции}; ComPort-> Write ('a');

2-я функция OnRxChar; {инструкции}; Timer1-> Enabled = true;

3-я функция Таймер; вернуться к 1-й функции

Когда я использовал Sleep вместо Timer, все замораживание приложения. Я надеюсь, что это будет полезно кому-то :) Я провожу неделю, чтобы понять: P

ответ

1

Когда вы делаете ComPort->WriteString("b"); Вы отправляете массив символов b\0. На стороне arduino, кажется (как вы не показываете, как вы читаете ввод и что такое условие переключения), что вы читаете персонажа.

Поэтому в основном то, что вы делаете:

Ard    Host 
| <---['a','\0']--- | 
|     | 
| ----['2']-------> | 
| <---['b','\0']--- | 

Там, ваш хост посылает первый a, соответствующий условию переключателя случая, и при следующем чтении он не будет читать \0 соответствующие ни одному из условий переключателя регистра.

Я не знаю, о ComPort аргументы, но вы должны смотреть на какой-то метод, который был бы как ComPort->WriteChar(char) вместо ComPort->WriteString(string), так что вы хотите обменять только символы:

Ard    Host 
| <---['a']-------- | 
|     | 
| ----['2']-------> | 
| <---['b']-------- | 

UPDATE (см первый комментарий) :

Как я не нашел общественной документации ComPort, я не могу точно вам помочь, но, чтобы сделать ваш C++ код ожидание ввода от Arduino, вы должны сделать что-то, что будет выглядеть как то, что следует:

// blocks while there is no input on the serial line 
while (!ComPort->available()); 

, если вы не имеете Arduino подобный метод available() в коммуникационный порт, вы всегда можете сделать что-то вроде

char input = '\0'; 
while ((c = ComPort->ReadChar()) == ERROR); 

где ERROR является возвращаемое значение тайм-аута, или если это не вы можете проверить против != '2'.

HTH

+0

Когда я отправляю строку в Arduino, он включает светодиод. Моя проблема заключается в том, как дождаться окончания процесса Arduino и перейти к следующей строке на C++. – Mike

+0

Помогло ли мое обновление? – zmo

+0

Я пытался сделать это с циклом while, но он запустил программу, когда он попал внутрь цикла:/Я нашел другое решение: я использую ComPort1-> Read (buff, 1, true); и программа ждет символа char (это здорово!), но мне нужно добавить ShowMessage для выполнения строк в функции Read, иначе просто пропустите их:/ – Mike

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