none
如何通过serialPort 接收2个字节的数据,并在textBox上显示出来呢? RRS feed

  • 问题

  • HELLO ,看我,你在干什么呢?

     

       

           爱你,,,痛彻我心扉,给了你仅有的一片天

      我想我只会,,,紧握住你双手,凋零的玫瑰

      品尝,你赐给的泪水。。。

      或许你曾为我流泪,如今,你让我。。。。痛彻心扉

     

    好,言归正传,失恋已去,SerialPort 和textBox 已来

     我的问题如下:

     

         1)如何通过SerialPort组件接收 33H 34H这2组16进制数据呢?

         2)如何通过textBox 控件,把接收到的33H, 34H  在这个控件上显示出来呢?

    2017年10月30日 3:42

答案


  • Hi 绿绿山水,

    SerialPort类中有DataReceived事件,当串口的读缓存有数据到达时则触发DataReceived事件,其中SerialPort.ReceivedBytesThreshold属性决定了当串口读缓存中数据多少个时才触发DataReceived事件,默认为1。

    你可以在接受方法中使用下面得方法获取得到得字节数组,然后转为16进制数据。

             byte[] readBuffer = new byte[serialPort1.ReadBufferSize];
                serialPort1.Read(readBuffer, 0, readBuffer.Length);
                string hexstr = byteToHexStr(readBuffer);
                SetText(hexstr);

    最后需要显示在textBox上得话需要调用Invoke方法来显示数据到UI线程得控件上(因为接受数据得线程和UI线程不是一个线程,会有线程间安全得问题)。

      delegate void SetTextCallback(string text);
    
            private void SetText(string text)
            {
                if (this.textBox1.InvokeRequired)//如果调用控件的线程和创建创建控件的线程不是同一个则为True
                {
                    while (!this.textBox1.IsHandleCreated)
                    {
                        //解决窗体关闭时出现“访问已释放句柄“的异常
                        if (this.textBox1.Disposing || this.textBox1.IsDisposed)
                            return;
                    }
                    SetTextCallback d = new SetTextCallback(SetText);
                    this.textBox1.Invoke(d, new object[] { text });
                }
                else
                {
                    this.textBox1.Text = text;
                }
            }

    全部相关代码如下:

     private void SerialPortdemotest_Load(object sender, EventArgs e)
            {
                serialPort1.DataReceived += SerialPort1_DataReceived;
            }
    
            delegate void SetTextCallback(string text);
    
            private void SetText(string text)
            {
                if (this.textBox1.InvokeRequired)//如果调用控件的线程和创建创建控件的线程不是同一个则为True
                {
                    while (!this.textBox1.IsHandleCreated)
                    {
                        //解决窗体关闭时出现“访问已释放句柄“的异常
                        if (this.textBox1.Disposing || this.textBox1.IsDisposed)
                            return;
                    }
                    SetTextCallback d = new SetTextCallback(SetText);
                    this.textBox1.Invoke(d, new object[] { text });
                }
                else
                {
                    this.textBox1.Text = text;
                }
            }
    
    
            private void SerialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
            {
                byte[] readBuffer = new byte[serialPort1.ReadBufferSize];
                serialPort1.Read(readBuffer, 0, readBuffer.Length);
                string hexstr = byteToHexStr(readBuffer);
                SetText(hexstr);
            }
    
            // 字节数组转16进制字符串   
            public  string byteToHexStr(byte[] bytes)
            {
                string returnStr = "";
                if (bytes != null)
                {
                    for (int i = 0; i < bytes.Length; i++)
                    {
                        returnStr += bytes[i].ToString("X2");//ToString("X2") 为C#中的字符串格式控制符
                    }
                }
                return returnStr;
            }
    


    Best Regards,

    Yohann Lu



    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年10月30日 8:30
    版主

全部回复

  • HELLO ,看我,你在干什么呢?

     

       

           爱你,,,痛彻我心扉,给了你仅有的一片天

      我想我只会,,,紧握住你双手,凋零的玫瑰

      品尝,你赐给的泪水。。。

      或许你曾为我流泪,如今,你让我。。。。痛彻心扉

     

    好,言归正传,失恋已去,SerialPort 和textBox 已来

     我的问题如下:

     

         1)如何通过SerialPort组件接收 33H 34H这2组16进制数据呢?

         2)如何通过textBox 控件,把接收到的33H, 34H  在这个控件上显示出来呢?

    2017年10月28日 1:48

  • Hi 绿绿山水,

    SerialPort类中有DataReceived事件,当串口的读缓存有数据到达时则触发DataReceived事件,其中SerialPort.ReceivedBytesThreshold属性决定了当串口读缓存中数据多少个时才触发DataReceived事件,默认为1。

    你可以在接受方法中使用下面得方法获取得到得字节数组,然后转为16进制数据。

             byte[] readBuffer = new byte[serialPort1.ReadBufferSize];
                serialPort1.Read(readBuffer, 0, readBuffer.Length);
                string hexstr = byteToHexStr(readBuffer);
                SetText(hexstr);

    最后需要显示在textBox上得话需要调用Invoke方法来显示数据到UI线程得控件上(因为接受数据得线程和UI线程不是一个线程,会有线程间安全得问题)。

      delegate void SetTextCallback(string text);
    
            private void SetText(string text)
            {
                if (this.textBox1.InvokeRequired)//如果调用控件的线程和创建创建控件的线程不是同一个则为True
                {
                    while (!this.textBox1.IsHandleCreated)
                    {
                        //解决窗体关闭时出现“访问已释放句柄“的异常
                        if (this.textBox1.Disposing || this.textBox1.IsDisposed)
                            return;
                    }
                    SetTextCallback d = new SetTextCallback(SetText);
                    this.textBox1.Invoke(d, new object[] { text });
                }
                else
                {
                    this.textBox1.Text = text;
                }
            }

    全部相关代码如下:

     private void SerialPortdemotest_Load(object sender, EventArgs e)
            {
                serialPort1.DataReceived += SerialPort1_DataReceived;
            }
    
            delegate void SetTextCallback(string text);
    
            private void SetText(string text)
            {
                if (this.textBox1.InvokeRequired)//如果调用控件的线程和创建创建控件的线程不是同一个则为True
                {
                    while (!this.textBox1.IsHandleCreated)
                    {
                        //解决窗体关闭时出现“访问已释放句柄“的异常
                        if (this.textBox1.Disposing || this.textBox1.IsDisposed)
                            return;
                    }
                    SetTextCallback d = new SetTextCallback(SetText);
                    this.textBox1.Invoke(d, new object[] { text });
                }
                else
                {
                    this.textBox1.Text = text;
                }
            }
    
    
            private void SerialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
            {
                byte[] readBuffer = new byte[serialPort1.ReadBufferSize];
                serialPort1.Read(readBuffer, 0, readBuffer.Length);
                string hexstr = byteToHexStr(readBuffer);
                SetText(hexstr);
            }
    
            // 字节数组转16进制字符串   
            public  string byteToHexStr(byte[] bytes)
            {
                string returnStr = "";
                if (bytes != null)
                {
                    for (int i = 0; i < bytes.Length; i++)
                    {
                        returnStr += bytes[i].ToString("X2");//ToString("X2") 为C#中的字符串格式控制符
                    }
                }
                return returnStr;
            }
    


    Best Regards,

    Yohann Lu



    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年10月30日 8:30
    版主