0

我正在使用安装了 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->启用=假;{指示}; ComPort->Write('a');

第二个函数 OnRxChar;{指示}; Timer1->启用=真;

第三功能定时器;返回第一个功能

当我使用 Sleep 而不是 Timer 时,整个应用程序冻结。我希望它对某人有用:)我花了大约一周的时间来弄清楚:P

4

1 回答 1

1

当你这样做时,ComPort->WriteString("b");你正在发送字符数组b\0。在 arduino 方面,似乎(因为您没有显示如何读取输入以及切换条件是什么),您正在读取一个字符。

所以基本上你要做的是:

Ard                Host
 | <---['a','\0']--- |
 |                   |
 | ----['2']-------> |
 | <---['b','\0']--- |

在那里,您的主机首先发送a,匹配 switch case 条件,并且在下一次读取时,它将读取\0不匹配任何 switch case 条件。

我不知道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'.

高温高压

于 2013-06-18T15:38:26.830 回答