Я использую 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
Когда вы делаете 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'
,
НТН
Других решений пока нет …