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