ccc9149
未知昵称
采纳率89.7%
2018-05-08 13:54

C#连接串口接受数据显示问题。很急。

10
已采纳

C#串口上位机工具,接收到发过来的一串16进制数据,格式如下:
FA AF 00 08 FF 31 32 33 34 FA AF 00 07 FF 35 36 后面可能还会有FA AF开头的

这串数据分析如下:识别FA AF为固定开始的头,紧接着后面的两个00 08为第一个整个字符串实际长度(FA AF 00 08 01 31 32 33 34),FF为固定的数据,不用管。

FF后面对应的数据为实际需要输出显示的数据(31 32 33 34),长度为4,然后这4个数据以正常的ASCII码显示出来。

第一个(FA AF 00 08 FF 31 32 33 34)实际需要的数据31 32 33 34对应的ASCII码为1234

第二个(FA AF 00 07 FF 35 36)实际需要的数据35 36对应的ASCII码为56

所以串口最终输出在textbox中显示为123456

以下代码是接受数据并显示在textbox的代码。怎么修改能达到以上的要求?

private void Com_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            byte[] ReDatas = new byte[ComDevice.BytesToRead];
            ComDevice.Read(ReDatas, 0, ReDatas.Length);//读取数据
            this.AddData(ReDatas);//输出数据
        }

        /// <summary>
        /// 添加数据
        /// </summary>
        /// <param name="data">字节数组</param>
        public void AddData(byte[] data)
        {
            if (rbtnHex.Checked)
            {
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < data.Length; i++)
                {
                    sb.AppendFormat("{0:x2}" + " ", data[i]);
                }
                AddContent(sb.ToString().ToUpper());
            }
            else if (rbtnASCII.Checked)
            {
                AddContent(new ASCIIEncoding().GetString(data));
            }
            else if (rbtnUTF8.Checked)
            {
                AddContent(new UTF8Encoding().GetString(data));
            }
            else if (rbtnUnicode.Checked)
            {
                AddContent(new UnicodeEncoding().GetString(data));
            }
            else
            {}

            lblRevCount.Invoke(new MethodInvoker(delegate
            {
                lblRevCount.Text = (int.Parse(lblRevCount.Text) + data.Length).ToString();
            }));
        }


        /// <summary>
        /// 输入到显示区域
        /// </summary>
        /// <param name="content"></param>
        private void AddContent(string content)
        {
            this.BeginInvoke(new MethodInvoker(delegate
            {
                if(chkAutoLine.Checked && txtShowData.Text.Length>0)
                {
                    txtShowData.AppendText("\r\n");
                }
                txtShowData.AppendText(content);
            }));
        }
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

3条回答

  • caozhy 回答这么多问题就耍赖把我的积分一笔勾销了 3年前

    前面5个字节FA AF 00 08 FF是固定的么?那么跳过
    AddContent(new ASCIIEncoding().GetString(data.Skip(5).ToArray()));

    点赞 评论 复制链接分享
  • xxy8452126 xxy8452126 3年前

    把读出来的数据添加一段数据处理就可以了
    ///
    /// 输入到显示区域
    ///
    ///
    private void AddContent(string content)
    {
    this.BeginInvoke(new MethodInvoker(delegate
    {
    if(chkAutoLine.Checked && txtShowData.Text.Length>0)
    {
    txtShowData.AppendText("\r\n");
    }
    string newcontent = "";
    string[] str1 = Regex.Split(content, "FA AF ");
    if (str1.Length > 0)
    {
    foreach (var item in str1)
    {
    if (item.Length!=0)
    {
    string[] str2 = Regex.Split(item, " FF ");
    string[] str3 = str2[1].Split(' ');
    foreach (var item2 in str3)
    {
    if (item2.Length != 0)
    {
    newcontent += item2.Substring(1);
    }
    }
    }
    }
    }
    txtShowData.AppendText(newcontent);
    }));
    }
    注意使用Regex要添加using System.Text.RegularExpressions;

    点赞 评论 复制链接分享
  • vapor0911 vapor0911 3年前

    //首先把FA AF 开头的五个字节剔除,获取一个新的数组
    byte[] m_data=new byte[data.length];
    int nCount=0;
    for (int i = 0; i < data.Length; i++)
    {
    if(data[i]==0xFA && data[i+1]==0xAF)
    {
    i=i+4;
    continue;
    }
    m_data[nCount]=data[i];
    nCount++;
    }
    //然后用m_data替换后边所有的data

    点赞 评论 复制链接分享