2012-10-05 38 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