簡體   English   中英

串口myPort.Datareceived C#

[英]serial port myPort.Datareceived C#

你好朋友在C#中有一個從連接的串行設備讀取數據的表單,我的問題是我什至更改了myPort.DataReceived方法的表單仍在運行並接收數據。 我無法關閉與串行端口的連接,因為該方法不會停止執行。 我已經嘗試過在更改表單時將其壓縮的命令,但是當您嘗試運行myPort.Close時它會崩潰,我相信這就是為什么myPort.DataReceived仍在運行的原因,因此我刪除了代碼,並繼續執行myPort.Close以另一種形式打開。 我認為我的解決方案是停止myPort.DataReceived然后關閉連接,但是找不到解決方法。下面是我的代碼摘錄:

 namespace EntradaFinalCliente { public partial class ConsultaSerial : Form { string SerialString; private SerialPort myport; public ConsultaSerial() { InitializeComponent(); abrirSerial(); lerDados(); } public void abrirSerial() { myport = new SerialPort(); myport.BaudRate = 9600; myport.PortName = SerialPort1; myport.DataReceived += myport_DataReceived; } private void lerDados() { if (myport.IsOpen == false) { try { myport.Open(); } catch { return; } } } private void myport_DataReceived(object sender, SerialDataReceivedEventArgs e) { Thread.Sleep(100); SerialString = myport.ReadExisting(); this.Invoke(new EventHandler(Analisa)); } private void Analisa(object sender, EventArgs e) { checarSerial(); } 

這是我關閉表單按鈕:

 private void button1_Click (object sender, EventArgs e) { myPort.Close (); this.Hide (); var form1 = new Form1 (); form1.Closed + = (s, args) => this.Close (); Form1.Show (); } 

您遇到的問題是,一旦觸發事件,您的應用程序將進入函數myport_DataReceived 無論端口是否已關閉,該功能將繼續執行。 如果端口已關閉,則該功能將在最后一次執行。 等待100毫秒會使情況變得更糟。 因此,我的建議是刪除等待代碼,並在代碼周圍放置try catch語句,以使線程干凈地終止。

此外,與使用成員myPort相比,使用sender讀取傳入的數據更好,因為sender是觸發事件的sender 當您打開兩個或多個端口時,這也有助於消除混亂。

還建議將DataReceived事件處理程序函數的主體保持在最低限度。 只做您需要獲取數據的內容。 然后,您可以將數據存儲在內存中,並使用存儲的數據在其他位置進行更復雜的處理。

  private void myport_DataReceived(object sender, SerialDataReceivedEventArgs e)
  {
      Thread.Sleep(100); // Why do you need to wait for 100 ms? If the event reaches here, it will have the data to read. Can remove?
      try
      {
          SerialPort sp = (SerialPort)sender;
          SerialString = sp.ReadExisting();
          this.Invoke(new EventHandler(Analisa));
      }
      catch (Exception ex)
      {
           // Do something else
           Console.WriteLine(ex.Message);
      }

  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM