我正在使用已安装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-&GT;启用= FALSE; {指令}; ComPort-→写( 'A');第二个功能OnRxChar; {指令}; Timer1-&GT;启用=真;
第三功能定时器; 回到第一个功能
当我使用Sleep而不是Timer整个app冻结时。我希望它对某人有用:)我花了一周时间来弄明白:P
答案 0 :(得分: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']-------- |
更新(参见第一条评论):
由于我没有找到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