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("端口已經打開,請檢測人員站上儀器進行檢測!\r\n   檢測完成后再進行確定即可獲取數據!", "提示", 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);
            }
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM