zoukankan      html  css  js  c++  java
  • 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);
                }
            }
  • 相关阅读:
    DataFrame的iloc与loc的区别是什么?
    [笔记]《算法图解》第十一章 接下来如何做
    [笔记]《算法图解》第十章 K最近邻算法
    leetcode NO.171 Excel表列序号 (python实现)
    [笔记]《算法图解》第九章 动态规划
    [笔记]《算法图解》第八章 贪婪算法
    [笔记]《算法图解》第七章 狄克斯特拉算法
    leetcode NO.7 反转整数 (python3实现)
    [错误处理]电脑风扇很响处理方案
    比对两文件夹下文件名的区别
  • 原文地址:https://www.cnblogs.com/icewatermei/p/13903024.html
Copyright © 2011-2022 走看看