SerialDataReceived事件不会触发(Arduino Clone的SerialPort设置)

时间:2019-04-13 13:38:37

标签: c# wpf events arduino serial-port

这是我的第一个问题,因为在任何地方都找不到答案。

我对WPF和C#并不是特别陌生,但是我以前从未阅读过SerialData,而且我肯定还存在一些基本问题。

设置:

Arduino克隆(SparkFun Pro Micro)发送“ Hello!” +每秒向USB串行端口(COM5)发送一个数字:

String hello = "hello!";
Serial.println(hello + i);
i++;
delay(1000);

并尝试使用简单的按钮在WPF中接收它,该按钮将数据刷新到TextBlock(tbData)。

SerialPort sp = null;
String str = null;
int i = 0;

public MainWindow()
{
      InitializeComponent();
      sp = new SerialPort("COM5", 9600);
      sp.DataReceived += new SerialDataReceivedEventHandler(ReceiveData);
      sp.Open();
}


void ReceiveData(object sender, SerialDataReceivedEventArgs e)
{
      str = sp.ReadLine();
}

private void Refresh_Click(object sender, RoutedEventArgs e)
{
      tbData.Text = str;
}

但是什么也没发生,我似乎得到了一个空字符串,因为当我按下Refresh_Click按钮时,TextBlock没有显示任何内容。

我可以使它与新线程一起使用,但是它会保持超时,我在这里(Timeouts in C# serial port)读到最好的方法(似乎最简单)是使用SerialDataReceived事件。

t = new Thread(() =>
{
      int i = 0;
      while (run)
      {
            SerialString = sp.ReadLine();
            Thread.Sleep(1000);
      }

      sp.Close();

});

我所缺少的一定是某些改变缓冲区大小的方法吗?还是类似的东西?

1 个答案:

答案 0 :(得分:0)

似乎我找到了答案!

我对串行通信一无所知,但是今天我遇到了MODE cmd函数:

C:\Users\Username>mode

Status for device COM5:
-----------------------
    Baud:            9600
    Parity:          None
    Data Bits:       8
    Stop Bits:       1
    Timeout:         ON
    XON/XOFF:        OFF
    CTS handshaking: OFF
    DSR handshaking: OFF
    DSR sensitivity: OFF
    DTR circuit:     OFF
    RTS circuit:     OFF

我注意到,每当我让Arduino IDE向我报告数据时,它都会改变-它总是会成功完成! -并且每当我尝试使WPF都执行相同操作时。 上面是我尝试运行自己的代码后的MODE返回,并且:

Status for device COM5:
-----------------------
    Baud:            9600
    Parity:          None
    Data Bits:       8
    Stop Bits:       1
    Timeout:         OFF
    XON/XOFF:        OFF
    CTS handshaking: OFF
    DSR handshaking: OFF
    DSR sensitivity: OFF
    DTR circuit:     ON
    RTS circuit:     ON

这是在Arduino IDE中打开“工具”>“串行监视器”并立即再次将其关闭后显示的内容。

我从以下位置更改了WPF代码:

sp = new SerialPort("COM5", 9600);
sp.Open();

收件人:

sp = new SerialPort("COM5", 9600);
//sp.ReadTimeout = 200;
sp.DtrEnable = true;
sp.RtsEnable = true;
sp.DataBits = 8;
sp.StopBits = StopBits.One;
sp.Open();

现在,线程示例和SerialDataReceived事件都运行顺利(很好,除非我无法在SerialDataReceived线程中更新UI线程)。

我希望那里的人会觉得有用。

相关问题