我正在尝试在Visual Studio中创建一个c ++窗体应用程序,它与Arduino进行通信并使用三个trackBars控制三个LED。我设法写了发送消息Arduino的代码。但是当我启动程序时,我想询问Arduino关于LED状态的信息,将滑块设置在正确的位置。
我的解决方案是对Arduino进行编程,如果它得到了' x1'命令,它发回由逗号分隔的LED值(从0到255)。 Arduino上的代码应该没问题,因为我使用相同的代码在Qt Creator中做同样的事情,并且在那里工作得很好。
我的测试代码就像我点击一个按钮一样,它会发送' x1'命令Arduino,在SerialPort的DataReceived事件中,我将接收到的值放在标签中。
有两个问题。 第一个是,即使我使用Convert :: ToString(),我也得到数字和逗号的ASCII码。 (例如:0,0,0,我进入屏幕:484448444844)
第二个是我不总是得到整个信息。有时最后2-3个字符丢失,如果我再次单击该按钮,它会显示在新消息的开头。 (每次单击按钮时都会清除标签,并且DataReceived事件会附加到它上面)。我知道有时某些部分会被延迟,但是这些部分不应该在到达时触发DataReceived事件,并显示在消息的末尾?
我怎样摆脱这些问题?
DataReceived事件的代码:
private: System::Void serialPort1_DataReceived(System::Object^ sender,
System::IO::Ports::SerialDataReceivedEventArgs^ e)
{
//Try to read from serial
for (int i = 0; i < serialPort1->BytesToRead; i++)
{
lblTest->Text += Convert::ToString(serialPort1->ReadByte());
}
}
按钮的代码:
private: System::Void btnTest_Click(System::Object^ sender,
System::EventArgs^ e) {
lblTest->Text = String::Empty;
serialPort1->Write("x1");
}
我发送信息的方式:
private: void sendSerialData(String^ data)
{
if (serialPort1->IsOpen)
{
serialPort1->Write(data);
lblMessage->Text = "Message sent to device: " + data;
}else {
lblMessage->Text = "Message transmission failed!";
}
}
以下是我将这些数据从Arduino发送到PC的方式:
Serial.print(redVal);
Serial.print(',');
Serial.print(greenVal);
Serial.print(',');
Serial.print(blueVal);
Serial.print(',');
Serial.flush();
我很乐意找到一些有关使用除MSDN网站之外的SerialPort的教程,因为它只是列出了属性,示例代码并不那么容易理解。由于某种原因,我找不到太多的c ++,只能用于c#,但由于后来的项目,我无法切换到c#。
提前感谢您的帮助。