В ожидании окончания рутины на Arduino

Я использую C ++ Builder 6 с установленным компонентом TComPort и 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).
Кто-нибудь может подсказать мне, какую функцию лучше всего использовать?

Редактировать:
ComPort имеет функцию Read(void *,int,bool) но я понятия не имею, что void* а также int выступает за (я новичок).

Изменить 2: Решение !!
Вот что я сделал:

1-я функция;
Timer1-> Enabled = ложь;
{инструкции};
ComPort-> Write ( ‘а’);

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

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

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

0

Решение

Когда вы делаете 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']-------- |

ОБНОВЛЕНИЕ (см. Первый комментарий):

Как я не нашел публичной документации 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',

НТН

1

Другие решения

Других решений пока нет …