顽皮黑蓝 2017-11-05 08:27 采纳率: 0%
浏览 2461
已结题

C#读取电子称串口数据,显示在TextBox控件

已经能显示出来数据,但是我应该如何提取数据到textbox中,与电子秤上的重量同步显示图片说明

  • 写回答

4条回答

  • devmiao 2017-11-05 09:58
    关注
     using System;
    using System.IO.Ports;
    using System.Text;
    using System.Threading;
    namespace weight
    {
        /// <summary>
        /// 电子秤接口信息类,封装COM口数据
        /// </summary>
        public class WeightInformation
        {
            string _wdata;
            string _wunit;
            string _qdata;
            string _qunit;
            string _percentage;
            /// <summary>
            /// 获取或设置重量
            /// </summary>
            public string WData { get { return this._wdata; } set { this._wdata = value; } }
            /// <summary>
            /// 获取或设置重量单位
            /// </summary>
            public string WUnit { get { return this._wunit; } set { this._wunit = value; } }
            /// <summary>
            /// 获取或设置数量
            /// </summary>
            public string QData { get { return this._qdata; } set { this._qdata = value; } }
            /// <summary>
            /// 获取或设置数量单位
            /// </summary>
            public string QUnit { get { return this._qunit; } set { this._qunit = value; } }
            /// <summary>
            /// 获取或设置百分数
            /// </summary>
            public string Percentage { get { return this._percentage; } set { this._percentage = value; } }
        }
        /// <summary>
        /// 电子称数据读取类
        /// </summary>
        public class WeightReader : IDisposable
        {
            #region 字段、属性与构造函数
            SerialPort sp;
            int _speed = 300;
            /// <summary>
            /// 获取或设置电脑取COM数据缓冲时间,单位毫秒
            /// </summary>
            public int Speed
            {
                get
                {
                    return this._speed;
                }
                set
                {
                    if (value < 300)
                        throw new Exception("串口读取缓冲时间不能小于300毫秒!");
                    this._speed = value;
                }
            }
            public bool InitCom(string PortName)
            {
                return this.InitCom(PortName, 4800, 300);
            }
            /// <summary>
            /// 初始化串口
            /// </summary>
            /// <param name="PortName">数据传输端口</param>
            /// <param name="BaudRate">波特率</param>
            /// <param name="Speed">串口读数缓冲时间</param>
            /// <returns></returns>
            public bool InitCom(string PortName, int BaudRate,int Speed) 
            {
                try
                {
                    sp = new SerialPort(PortName, BaudRate, Parity.None, 8);
                    sp.ReceivedBytesThreshold = 10;
                    sp.Handshake = Handshake.RequestToSend;
                    sp.Parity = Parity.None;
                    sp.ReadTimeout = 600;
                    sp.WriteTimeout = 600;
                    this.Speed = Speed;
                    if (!sp.IsOpen)
                    {
                        sp.Open();
                    }
                    return true;
                }
                catch
                {
                    throw new Exception(string.Format("无法初始化串口{0}!",PortName));
                }
            }
            #endregion
            #region 串口数据读取方法
            public WeightInformation ReadInfo()
            {
                string src = this.ReadCom();
                WeightInformation info = new WeightInformation();
                info.WData = this.DecodeWeightData(src);
                info.WUnit = this.DecodeWeightUnit(src);
                info.Percentage = this.DecodePercentage(src);
                info.QData = this.DecodeQualityData(src);
                info.QUnit = this.DecodeQualityUnit(src);
                return info;
            }
            /// <summary>
            /// 将COM口缓存数据全部读取
            /// </summary>
            /// <returns></returns>
            private string ReadCom()//返回信息 
            {
                if (this.sp.IsOpen)
                {
                    Thread.Sleep(this._speed);
                    string res = "";
                    //for (int i = 0; i < 5; i++)
                    //{
                    byte[] buffer = new byte[sp.BytesToRead];
                    sp.Read(buffer, 0, buffer.Length);
                    res = System.Text.Encoding.ASCII.GetString(buffer);
                    //if (res != "")
                    //    break;
                    //}
                    if (res == "")
                    {
                        throw new Exception("串口读取数据为空,参数设置是否正确!");
                    }
                    return res;
                }
                return "";
            }
            #endregion
            #region  基本取数方法
            /// <summary>
            /// 从字符串中取值
            /// </summary>
            /// <param name="head">起始字符串</param>
            /// <param name="intervalLen">间隔位长度</param>
            /// <param name="valueLen">值长度</param>
            /// <param name="src">源字符串</param>
            /// <returns></returns>
            private string DecodeValue(string head, int intervalLen, int valueLen,string src)
            {
                int index = src.IndexOf(head);
                return src.Substring(index + intervalLen, valueLen);
            }
            /// <summary>
            /// 取重量
            /// </summary>
            /// <param name="srcString">源字符串</param>
            /// <returns></returns>
            private string DecodeWeightData(string srcString)
            {
                return this.DecodeValue("GS,", 3, 8,srcString);
            }
            /// <summary>
            /// 取重量单位
            /// </summary>
            /// <param name="srcString">源字符串</param>
            /// <returns></returns>
            private string DecodeWeightUnit(string srcString)
            {
                return this.DecodeValue("GS,", 12, 2, srcString);
            }
            /// <summary>
            /// 取百分数
            /// </summary>
            /// <param name="srcString">源字符串</param>
            /// <returns></returns>
            private string DecodePercentage(string srcString)
            {
                return this.DecodeValue("U.W.", 4, 14, srcString);
            }
            /// <summary>
            /// 取数量
            /// </summary>
            /// <param name="srcString">源字符串</param>
            /// <returns></returns>
            private string DecodeQualityData(string srcString)
            {
                return this.DecodeValue("PCS", 3, 9, srcString);            
            }
    
            /// <summary>
            /// 取数量单位
            /// </summary>
            /// <param name="srcString">源字符串</param>
            /// <returns></returns>
            private string DecodeQualityUnit(string srcString)
            {
                return this.DecodeValue("PCS", 12, 3, srcString);            
            }
            #endregion
            #region 释放所有资源
            public void Dispose()
            {
                if (sp != null && sp.IsOpen)
                {
                    sp.Close();
                }
            }
            #endregion
        }
    }
    

    调用ReadInfo,用TextBox1.Text = weight.ReadInfo().WData.ToString();

    评论

报告相同问题?

悬赏问题

  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波
  • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗
  • ¥15 钢筋实图交点识别,机器视觉代码
  • ¥15 如何在Linux系统中,但是在window系统上idea里面可以正常运行?(相关搜索:jar包)
  • ¥50 400g qsfp 光模块iphy方案
  • ¥15 两块ADC0804用proteus仿真时,出现异常
  • ¥15 关于风控系统,如何去选择
  • ¥15 这款软件是什么?需要能满足我的需求
  • ¥15 SpringSecurityOauth2登陆前后request不一致