我正在使用带有已安装的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

10-06 01:08