等到Arduino的例程结束

时间:2013-06-18 15:20:56

标签: c++ serial-port arduino communication c++builder

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

1 个答案:

答案 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