2012-10-05 75 views
-1

我有一個帶有2個按鈕(位和數據)的圖形用戶界面。當我按下BIT按鈕時,它會將十六進制數據發送到與設備連接的端口。設備以另一個十六進制重播。我用port.DataReceived函數讀取這個十六進制數值,將其顯示在文本框中,並檢查每個字節中的每一位,並在文本框中顯示值的位。這認爲工作正常。當我按下數據按鈕時,我發送一個不同的十六進制給同一個設備,並以不同的十六進制重播。現在我只想顯示重播而不檢查它。我沒有ideea,我怎麼能做到這一點,因爲當按下數據按鈕發送十六進制,接收來自設備的響應,並將每一位都發送出去。我不想這樣做,我只是想在十六進制中顯示它。如果有人能幫助我,我會在這裏發佈我的代碼。處理從設備收到的數據

我試着讓2個不同的功能來讀取設備的重播,但我認爲這種方式並不好。我閱讀關於國旗的相同內容,我希望這是解決我的問題的更好方法,我想尋求幫助。

我也會在這裏發佈我的代碼。

+0

題外話:你可能想想想你對「[hex](http://en.wikipedia.org/wiki/Hex)」[adecimal]這個詞的用法。請記住,您將*位*發送給您的設備,而不是十六進制數字。十六進制只是表示這些位是如何表示給你的。同樣,設備不會用「十六進制」[adecimal number]回答,但會收集一些位(分組爲一個字節,一個字或一系列這些字),然後您可以將其轉換爲十進制數,或者十六進制或任何其他格式。 – stakx

+0

我完全同意你的stakx。我使用了非學院形式,謝謝。 – gheo

+0

如果可以的話,它總是很好的發佈你的代碼。這兩個函數如何工作(就接收和處理數據而言)的一個例子可能會使建議行動方案變得更容易。 – Chris

回答

0

爲什麼不分離出readFromDevice()代碼,並將接收到的值傳遞迴調用方法?這樣你就可以用任何不同的方式處理返回的值。

編輯:

我猜遺贈是要異步回覆(即,它會回覆一些時間,你發送後數據)?如果是這樣的話,你需要添加一個事件處理程序到COM端口,然後處理你收到的數據。

您還需要跟蹤哪個按鈕被點擊。你可以使用一個簡單的布爾值爲:

//In the data buttons click handler 
DataButtonClicked = true; 
BitButtonClicked = false; 


//add an event handler to the port 
String RecievedData; 
SerialPort mySerialPort = new SerialPort("COM1"); 
mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); 

//code for the event handler 
private static void DataReceivedHandler(
        object sender, 
        SerialDataReceivedEventArgs e) 
{ 
    SerialPort sp = (SerialPort)sender; 
    RecievedData = sp.ReadExisting(); 

    if(DataButtonClicked) 
    { 
     //display the value one way 
    } 
    if(BitbuttonClicked) 
    { 
     //display the value another way 
    } 
} 

我已經根據我在下面發佈的MSDN鏈接。

+0

我試圖做到這一點,但我失敗了。我會再次嘗試更多的關注。我真的在C#中新的,我敢肯定,我不明白相同的想法。感謝您的建議 – gheo

+0

你可以發佈你的代碼嗎? 這可能有些用處:http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.datareceived.aspx – Jay

+0

謝謝你的幫助傑伊。這個週末我很忙,但是週一我會介紹我的代碼,如果我解決了問題。 – gheo

0
namespace read_display_data 

{ 公共部分Form1類:表格 {

SerialPort port = new SerialPort("COM2", 19200, Parity.None, 8, StopBits.One); 


    public Form1() 
    { 
     InitializeComponent(); 



     port.Open(); 

    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
    port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceivedBIT); 

     // port.ReadTimeout = 500; 



    } 



    private void BITbutton_Click(object sender, EventArgs e) 
    { 




      port.Write(new byte[] { 0x10 0x04, 0x06 }, 0, 3); 

      byte[] buffer1 = new byte[] { 0x10 0x04, 0x06 }; 

      LogSent(LogMsgType.Outgoing, DateTime.Now + " -- " + ByteArrayToHexString(buffer1) + "\n"); 

      //port.Close(); 

    } 

私人無效Databutton_Click(對象發件人,EventArgs的) {

 port.Write(new byte[] { 0x11, 0x43, 0x0D}, 0, 3); 


     byte[] buffer1 = new byte[] {0x11, 0x43, 0x0D }; 

     LogSent(LogMsgType.Outgoing, DateTime.Now + " -- " + ByteArrayToHexString(buffer1) + "\n"); 
    } 





    private Color[] LogMsgTypeColor = { Color.Blue, Color.Green, Color.Black, Color.Orange, Color.Red }; 


    public enum LogMsgType { Incoming, Outgoing, Normal, Warning, Error }; 








    void port_DataReceivedBIT(object sender, SerialDataReceivedEventArgs e) 
    { 

      //port.Open(); 

      this.Invoke(new EventHandler(AddReceiveBIT)); 

    } 


    private void AddReceiveBIT (object s, EventArgs e) 
    { 


      Thread.Sleep(100); 


      byte[] buffer = new byte[port.BytesToRead]; 

      port.Read(buffer, 0, buffer.Length); 


      LogReceive(LogMsgType.Incoming, DateTime.Now + " -- " + ByteArrayToHexString(buffer) + "\n"); 


      Log(LogMsgType.Incoming, checkBit(buffer) + "\n"); 

     } 




    private string checkBit(byte[] buffer) 
    { 
     StringBuilder message = new StringBuilder(); 
     var responseByte = buffer[7]; 
     if ((responseByte & (1 << 0)) == 0) 
     { 
      message.AppendFormat("rezerved                   ok "); 
     } 
     else 
     { 
      message.AppendFormat("rezerved                   error "); 
     } 




     if ((responseByte & (1 << 1)) == 0) 
     { 
      message.AppendFormat("rezerved                   ok "); 
     } 
     else 
     { 
      message.AppendFormat("rezerved                   error "); 
     } 



     if ((responseByte & (1 << 2)) == 0) 
     { 
      message.AppendFormat("rezerved                   ok "); 
     } 
     else 
     { 
      message.AppendFormat("rezerved                   error "); 
     } 



     if ((responseByte & (1 << 3)) == 0) 
     { 
      message.AppendFormat("rezerved                   ok "); 
     } 
     else 
     { 
      message.AppendFormat("rezerved                   error "); 
     } 





     if ((responseByte & (1 << 4)) == 0) 
     { 
      message.AppendFormat("rezerved                   ok "); 
     } 
     else 
     { 
      message.AppendFormat("rezerved                   error "); 
     } 





     if ((responseByte & (1 << 5)) == 0) 
     { 
      message.AppendFormat("rezerved                   ok "); 
     } 
     else 
     { 
      message.AppendFormat("rezerved                   error "); 
     } 




     if ((responseByte & (1 << 6)) == 0) 
     { 
      message.AppendFormat("Serial Communication              ok "); 
     } 
     else 
     { 
      message.AppendFormat("Serial Communication                error "); 
     } 





     if ((responseByte & (1 << 7)) == 0) 
     { 
      message.AppendFormat("Optical Zoom                  ok "); 
     } 
     else 
     { 
      message.AppendFormat("Optical Zoom                  error "); 
     } 

     return message.ToString(); 
    } 



    private string ByteArrayToHexString(byte[] PortBuffer) 
    { 
     StringBuilder sb = new StringBuilder(PortBuffer.Length * 3); 
     foreach (byte b in PortBuffer) 
      sb.Append(Convert.ToString(b, 16).PadLeft(2, '0').PadRight(3, ' ')); 
     return sb.ToString().ToUpper(); 


    } 




    private void LogReceive(LogMsgType msgtype, string msg) 
    { 
     richTextBox1.Invoke(new EventHandler(delegate 
     { 
      richTextBox1.SelectedText = string.Empty; 
      richTextBox1.SelectionFont = new Font(richTextBox1.SelectionFont, FontStyle.Bold); 
      richTextBox1.SelectionColor = LogMsgTypeColor[(int)msgtype]; 
      richTextBox1.AppendText(msg); 
      richTextBox1.ScrollToCaret(); 


     } 
     )); 


    } 
    private void LogSent(LogMsgType msgtype, string msg) 
    { 
     textBox2.Invoke(new EventHandler(delegate 
     { 
      textBox2.SelectedText = string.Empty; 
      textBox2.AppendText(msg); 
      textBox2.ScrollToCaret(); 

     } 
     )); 


    } 


    private void Log(LogMsgType msgtype, string msg) 
    { 
     textBox3.Invoke(new EventHandler(delegate 
     { 
      textBox3.Clear(); 
      textBox3.SelectedText = string.Empty; 
      textBox3.AppendText(msg); 
      textBox3.ScrollToCaret(); 


     } 
     )); 


    } 


    private void textBox2_TextChanged(object sender, EventArgs e) 
    { 

    } 

    private void label2_Click(object sender, EventArgs e) 
    { 

    } 

    private void label1_Click(object sender, EventArgs e) 
    { 

    } 

    private void textBox3_TextChanged(object sender, EventArgs e) 
    { 

    } 


    private void textBox4_TextChanged(object sender, EventArgs e) 
    { 

    } 

    private void richTextBox1_TextChanged(object sender, EventArgs e) 
    { 

    } 
+0

有我的代碼克里斯。我把它發佈在這裏,希望我能解決我的問題。 – gheo