如何捕获断开连接的串口?

加入
1月23日,2020年1月23日
消息
12
编程经验
1-3
所以我有一个C #windows表单应用程序,带有GUI,允许我通过蓝牙串行连接连接到Arduino,并且当连接破坏时,我想打开GUI背景红色。

我在ConnectToarduino函数中创建了一个ErrorHandler,但它似乎没有正常工作。当我拉上Arduino的电源时,GUI不会变红!

C#:
  private void connectToArduino()
      {
            string selectedPort = comboBox1.GetItemText(comboBox1.SelectedItem);
            portArduino = new SerialPort(selectedPort, 9600, Parity.None, 8, StopBits.One);
            portArduino.RtsEnable = true;
            portArduino.DtrEnable = true;

            try
            {
                portArduino.Open();
                isConnectedArduino = true;
            }
            catch (Exception e)
            {
                label8.Text = "Connection to Micro Failed. Try Again";
            }

            portArduino.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
            portArduino.ErrorReceived += new SerialErrorReceivedEventHandler(ErrorReceivedHandler);

            button1.Text = "Disconnect";
            enableControlsArduino();
        }

错误处理程序:

C#:
    private void ErrorReceivedHandler(object sender, SerialErrorReceivedEventArgs e)
    {
        Invoke(new Action(() =>
        {
            this.BackColor = Color.Red;
        }));
    }
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,892
地点
切萨皮克,va.
编程经验
10+
它不会瞬间。该事件仅在检测到错误时被解雇。通常在完成读取或写入操作并失败时检测错误。
 
加入
1月23日,2020年1月23日
消息
12
编程经验
1-3
@skydiver. 您是否建议我的表格最终会变红?我是以正确的方式使用errorreceivedHandler,以便我试图检测到什么或者有更好的解决方案吗?

理想情况下,我会用一些简单的东西,但我不知道是否存在这样的东西:

C#:
if (portArduino.IsConnected()) {
     do this;
} else {
     do that;
}
 
加入
1月23日,2020年1月23日
消息
12
编程经验
1-3
@sheepings. 我不确定你的意思是在一个新线程中运行循环。

我假设刚刚在港口打开后才能与DataReceived Handler所做的操作相似。然后,我在处理程序函数中完成更多操作:
同样的事情不适用于错误的处理程序。

C#:
   private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        {

            if (isConnectedArduino)
            {
                try
                {
                    incoming_data = portArduino.ReadLine();
                    portArduino.Write(travel_command);
                }
                catch (Exception e1)
                {

                }
            }
            else
            {
                incoming_data = portMotor.ReadLine();
            }

            // this is executing on a separate thread - so throw it on the UI thread
            Invoke(new Action(() =>
            {
                textBox3.Text += incoming_data;
                textBox3.AppendText(Environment.NewLine);
                deactivate_event(incoming_data);
                RFID_reader(incoming_data);
                chart_setup(incoming_data);
                xlxs_builder(incoming_data);

            }));

        }
 
最佳 底部