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

浙公网安备 33010602011771号