2015-07-01 105 views
0

我在我的筆記本電腦上,現在無法檢查,我想知道是否打開COM2連接,併爲COM2端口添加接收事件,然後通過「serial.Close()」關閉COM2連接該程序,我仍然能夠在COM2端口上收到接收事件?假設它仍然可以接收,我想我會在接收事件中打開COM2端口連接並讀取數據,可以這樣做嗎?當COM端口關閉時是否可以接收COM端口事件?

SerialPort serial = new SerialPort() 
    { 
     PortName = "com2", 
     BaudRate = 9600, 
     Handshake = System.IO.Ports.Handshake.None, 
     Parity = Parity.None, 
     DataBits = 8, 
     StopBits = StopBits.One, 
     ReadTimeout = 400, 
     WriteTimeout = 200, 
    }; 

serial.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(Receive); 

    private void Receive(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 
    {    
     using (SerialPort serialPort = serial) 
     {     
      if (serialPort.IsOpen) 
       serialPort.Close(); 
      try 
      { 
       serialPort.Open(); 
       received_data = serialPort.ReadExisting(); 
       Dispatcher.Invoke(DispatcherPriority.Send, new UpdateUiTextDelegate(WriteMyData), received_data); 
      } 
      catch (Exception ex) 
      { 
      } 
      finally 
      { 
       if (serialPort != null) 
       { 
        if (serialPort.IsOpen) 
        { 
         serialPort.Close(); 
        } 
        Thread.Sleep(5); 
        //serialPort.Dispose(); 
       } 
       Thread.Sleep(5); 
      } 
     } 
    } 


    public void SerialCmdSendByte(byte[] hexstring) 
    { 
     using (SerialPort serialPort = serial) 
     { 
      if (serialPort.IsOpen) 
       serialPort.Close(); 
      try 
      { 
       serialPort.Open(); 


       foreach (byte hexval in hexstring) 
       { 
        byte[] _hexval = new byte[] { hexval }; 
        serialPort.Write(_hexval, 0, 1); 
        Thread.Sleep(3); 
       }     
      } 
      catch (IOException ex) 
      { 
      } 
      finally 
      { 
       if (serialPort != null) 
       { 
        if (serialPort.IsOpen) 
        { 
         serialPort.Close(); 
        } 
        Thread.Sleep(5); 
        //serialPort.Dispose(); 
       } 
       Thread.Sleep(5); 
      } 
     }    
    } 

的想法是,當我想從C#程序發送和關閉它直客場只打開一個連接,但相同的COM端口實際上是需要監聽從基於PIC的微控制器通信。目前我們遇到的問題是,以前程序從未嘗試關閉連接(與上面的代碼不同),但有時基於PIC的微控制器的接收部分工作正常,但程序的發送部分不起作用。這隻發生在某個時間,通常程序工作正常...

重新啓動系統似乎重置此確定。所以我想在上面的代碼會幫助我的情況(能夠發送,並在同一個COM端口上收聽)?

+0

串行端口的操作方式如下:打開(並保持打開),通信,關閉。如果它關閉 - 你沒有收到任何東西,也不能發送。您必須仔細研究爲什麼微控制器在重新啓動(從PC發送工作,因爲它在復位後工作)之前不會接收信號,這可能是固件中的錯誤。 – Sinatr

+0

感謝Sinatr和其他人幫助我,我專注於Windows應用程序而不是PIC控制器程序。我清理代碼並在這裏和那裏放一些延遲,縮短通信電纜,擰緊連接器連接,並檢查控制器接收溢出並清除它,所以現在可以了......感謝您的幫助! – user3663854

回答

0

不幸的是,沒有。一次只能打開1個到COM端口的連接。

如果您有一臺設備在該端口上偵聽,則其他設備將無法發送該端口。

如果您有權訪問微控制器在設備上收聽的代碼,則可以隨時寫一些內容,讓您向微控制器發送消息並讓該設備發送您的COM消息。否則,你可以做的唯一事情就是讓微控制器停止監聽端口,從你的代碼發送你的消息,接收從發送你的消息返回的任何響應,然後重新啓用微控制器的監聽特性。

編輯:

就在你的代碼註釋。 使用語句被設計爲當它超出範圍時關閉其所有連接後處理對象。

在代碼中,你是在一個使用塊創建您串口例如參考。如果按照定義的方式工作,則需要實例化串行端口實例,然後才能再次調用它。

0

作爲對jp2code答案的補充,並且由於想象力是極限,您可能需要嘗試更加「開箱即用」的解決方案,類似於中間人

THIS POST可能會讓您更好地瞭解我在說什麼。

0

當端口關閉時,您無法通過串口進行通信或偵聽。 所以你寫的代碼是絕對錯誤的。

理想情況下,您不應該關閉COM端口。

以下可能是您通信失敗的原因。

1。這似乎是最可能的答案:如果在上一次運行中COM端口沒有正確關閉,通信將不會發生。在這種情況下,您必須重置系統。這發生在系統崩潰時發生。

  1. 當連接器不緊時,可能發生這種情況。

  2. 檢查接地連接是正確的。

讓我知道你是否需要幫助改變代碼。