我是菜鳥,以前沒寫過以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); } }