我正在使用带有已安装的TComPort组件和Arduino的C ++ Builder 6。我正在尝试做的事情如下:
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:解决方案!
这是我所做的:
第一功能;
Timer1-> Enabled = false;
{instructions};
ComPort-> Write('a');
第二个函数OnRxChar;
{instructions};
Timer1-> Enabled = true;
第三功能定时器;
返回第一个功能
当我使用睡眠而不是计时器时,整个应用程序冻结。我希望这对某人有用:)我花了大约一周的时间来弄清楚: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());
如果您在comport中没有类似arduino的方法
available()
,则可以始终执行类似char input = '\0';
while ((c = ComPort->ReadChar()) == ERROR);
其中
ERROR
是超时时返回的值,如果不是,则可以对照!= '2'
进行检查。HTH