未知昵称 2018-05-08 13:54 采纳率: 50%
浏览 2747
已采纳

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

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条回答 默认 最新

  • threenewbee 2018-05-08 15:48
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?