2016-12-07 11 views
0

我正在嘗試編寫一個與控制器通信的程序。當連接成功建立時,控制器應發送「歡迎」消息,事實上,當我使用通信軟件進行連接時,控制器會發出「歡迎」消息。但是,使用下面的.NET代碼,我從來沒有看到歡迎消息。除此之外,它的作品。我如何捕獲此消息。這似乎是在連接建立的那一刻發送的。在C中連接時捕獲串行歡迎消息#

再次,我可以在連接後與控制器進行良好的通信,但我似乎無法獲得連接打開時發送的歡迎消息。

using System; 
using System.IO.Ports; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public delegate void AddDataDelegate(String myString); 
     public AddDataDelegate myDelegate; 
     SerialPort sp; 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     public void AddDataMethod(String myString) 
     { 
      richTextBox1.AppendText(myString); 
      richTextBox1.SelectionStart = richTextBox1.Text.Length; 
      richTextBox1.ScrollToCaret(); 
     } 
     private void button1_Click(object sender, EventArgs e) 
     { 
      try 
      {     
       sp = new SerialPort(comboBox1.SelectedItem.ToString(),Int32.Parse(comboBox2.SelectedItem.ToString())); 
       sp.DataReceived += SerialPort_OnDataReceived; 
       sp.Close(); 
       sp.Open(); 
       richTextBox1.AppendText("open\n"); 
       button2.Enabled = true; 
       button3.Enabled = true; 
      } 
      catch (Exception ex) 
      { 
       richTextBox1.AppendText(ex.Message); 
      } 
     } 
     void SerialPort_OnDataReceived(object sender,SerialDataReceivedEventArgs args) 
     { 
      SerialPort sp = sender as SerialPort;    
      string s = sp.ReadExisting(); 
      richTextBox1.Invoke(this.myDelegate, new Object[] { s }); 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      sp.WriteLine(textBox1.Text); 
      textBox1.Text = ""; 
     }  

     private void button3_Click(object sender, EventArgs e) 
     { 
      sp.DiscardOutBuffer(); 
      sp.DiscardInBuffer(); 
      sp.Close(); 
      richTextBox1.AppendText("\nclosed\n"); 

     } 
     private void Form1_Load_1(object sender, EventArgs e) 
     { 
      this.myDelegate = new AddDataDelegate(AddDataMethod); 
      string[] Ports = SerialPort.GetPortNames(); 
      comboBox2.SelectedIndex = comboBox2.Items.Count - 1; 
      Array.Sort(Ports, (a, b) => string.Compare(a.Substring(3).PadLeft(3, '0'), b.Substring(3).PadLeft(3, '0'))); 
      foreach (string port in Ports) 
      { 
       comboBox1.Items.Add(port); 
      } 
      comboBox1.SelectedIndex = 0; 
     } 

    } 
} 
+0

「DataRecevied」中的斷點是否曾經命中?您設置的'SerialPort'配置屬性太少,請檢查波特率,位大小,握手等。也許您的控制器沒有收到任何內容。 – Sinatr

+0

串行端口位於OSI網絡層模型的最底部。他們不知道有關「連接」的豆子,它需要TCP使用的協議類型。一般來說,你必須用* something *來讓控制器變得癢癢,這往往和發送單個「\ r」或「\ n」一樣簡單。在上電後看到您的RTS或DTR握手信號打開的可能性很大。檢查手冊或使用電話。或者你根本就沒有收到任何東西,當你忽略Handshake屬性時可能會有結果。 –

+0

Sinatr,我可以在連接時與控制器通信。我可以發送命令給它(通過textBox1)並且可以毫無困難地接收響應。唯一的問題是我無法獲得最初的歡迎消息。該消息基本上包含我想要捕獲的控制器的版本號。 '串行'的其他參數很好。實際上這是一個USB設備。 –

回答

0

我解決了它。連接和試圖從端口提取數據之間需要稍微延遲。