Windows Form SerialPort与Arduino通信,读取ASCII不是字符

时间:2016-12-17 18:24:25

标签: c++ winforms arduino serial-port visual-studio-2015

我正在尝试在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#。

提前感谢您的帮助。

0 个答案:

没有答案