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); } }