C#以16进制接收串口数据

        我是菜鸟,以前没写过以16进制接收串口数据!而现在我在写一个血压脉搏的接口,就是以16进制接收,然后要转为10进制显示。我就在百度上搜索如何以16进制接收网上方法很多,但就是会让人眼花缭乱。其中最可笑的是,网上的方法都要接收到后转为16进制(不用转的方法,也许我没找到),我就搞了很大个圈子后才发现不用转为10进制。不说了,还是进入正题,

        我把我的工作记录下来,以便以后工作。也许有些网友们看着有点头痛

        1、写一个类(XueYaMaiBo),用于打开端口,存储数据,数据解析之类的(写一个类目的在于,不要把所有代码都写在窗口里,这样代码管理方法,看着也方便)。

    /// <summary>
    /// 血压脉搏仪
    /// </summary>
    public class XueYaMaiBo
    {
        /// <summary>
        /// 血压脉搏COM口
        /// </summary>
        public SerialPort XymbCOM = new SerialPort();
        /// <summary>
        /// 深圳瑞光康泰RBP-9000C接收到的数据:以16进制为结果
        /// </summary>
        //public string RuiGuanKangTai_RBP9000C = null;
        public byte[] RuiGuanKangTai_RBP9000C = new Byte[19];//这里的19是所要接收的数据有多少个。我是这样理解的。因为在我的项目里,需要接收数据的个数是19号

        #region 打开端口
        /// <summary>
        /// 深圳瑞光康泰RBP-9000C打开端口
        /// </summary>
        /// <param name="COMPort">COM名称,如:COM1</param>
        /// <param name="BaudRate">波特率,如:9600</param>
        /// <param name="DataBits">数据位,如:8</param>
        /// <param name="StopBits">停止位,如:1</param>
        public string OpenComForRBP9000C(string COMPort, int BaudRate, int DataBits, string getStopBits)
        {
            string _res = JWConst.SUCC;
            RuiGuanKangTai_RBP9000C = new Byte[19];
            //判断是否已经打开,若打开则先关闭
            if (XymbCOM.IsOpen)
            {
                XymbCOM.Close();
            }
            else
            {
                XymbCOM.PortName = COMPort;
                XymbCOM.BaudRate = BaudRate;
                XymbCOM.DataBits = DataBits;
                switch (getStopBits)
                {
                    case "1":
                        XymbCOM.StopBits = StopBits.One;
                        break;
                    case "1.5":
                        XymbCOM.StopBits = StopBits.OnePointFive;
                        break;
                    case "2":
                        XymbCOM.StopBits = StopBits.Two;
                        break;

                    default:
                        return _res = "停止位不正确!停止位只能设置:1、1.5、2";
                }
            }
            try
            {
                XymbCOM.Open();
                ErrorLog.Add("端口打开成功!");
            }
            catch (Exception e1)
            {
                ErrorLog.Add("打开端口失败!原因:" + e1.ToString());
                return e1.ToString();
            }
            return _res;
        }
        #endregion

        #region 接收的数据转换为ArrayList

        /// <summary>
        /// 接收的数据转换为ArrayList
        /// </summary>
        /// <returns></returns>
        public ArrayList GetResault()
        {
            ArrayList _arrayList = new ArrayList();
            for (int i = 0; i < RuiGuanKangTai_RBP9000C.Length; i++)
            {
                _arrayList.Add(RuiGuanKangTai_RBP9000C[i]);
            }
            return _arrayList;
        }
        #endregion

    }

  2、窗口的Load事件中加载监听方法:

private void Form_dxlr_Load(object sender, EventArgs e)
        {
            Xymb.XymbCOM.DataReceived += XymbCOM_DataReceived;//血压脉搏监听事件
        }
        /// <summary>
        /// 血压脉搏监听事件,用于接收16进制结果
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void XymbCOM_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            Xymb.XymbCOM.Read(Xymb.RuiGuanKangTai_RBP9000C, 0, 19);
        }

     3、在获取数据按钮里写以下代码

        private void 血压脉搏ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            string _res = JWConst.SUCC;
            try
            {
                SjzdData _sjzdModel = HISPub.SjzdDataList.Find(m => m.Zdflbm == 27 && m.Bzdm == "3");
                if (_sjzdModel == null)
                {
                    XtraMessageBox.Show("数据字典点未设置血压脉搏仪(深圳瑞光康泰RBP-9000C)的COM口参数!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
                string[] _array = _sjzdModel.Sbcs.Split(',');

                string _com = _array[0].Split(':')[1];
                int _btl = Convert.ToInt32(_array[1].Split(':')[1]);
                int _sjw = Convert.ToInt32(_array[2].Split(':')[1]);
                string _tzw = _array[3].Split(':')[1];

                //打开端口
                Xymb.OpenComForRBP9000C(_com, _btl, _sjw, _tzw);

                XtraMessageBox.Show("端口已经打开,请检测人员站上仪器进行检测!
   检测完成后再进行确定即可获取数据!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);

                Xymb.XymbCOM.Close();

                //解析接收到的结果,把16进制转换为10进制
                ArrayList _arryList =Xymb.GetResault();
                //接下来就可以把需要数据查看到了,然后想怎么做都行了
            }
            catch (Exception e1)
            {
                XtraMessageBox.Show(e1.ToString(), "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                ErrorLog.Add(e1);
            }
        }
原文地址:https://www.cnblogs.com/icewatermei/p/13903024.html