在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
命名空间:using System.IO.Ports; 操作类声明: SerialPort sp = null; /// <summary>
/// <returns></returns> sp.DataBits = dataBit;//数据位 if (parity == 0) // sp.ReadTimeout = 1000;//设置超时读取时间 } 串口的打开和关闭 /// <summary> /// 打开串口 /// </summary> /// <param name="protName">串口号</param> /// <param name="baudRate">波特率</param> /// <param name="dataBit">数据位</param> /// <param name="stopBits">停止位</param> /// /// <param name="parity">校验位</param> /// <returns></returns> public bool OpenCom(string protName, int baudRate, int dataBit, float stopBits, int parity) { bool flag = true; if (sp == null) { sp = new SerialPort(); } sp.PortName = protName;//串口号 sp.BaudRate = baudRate;//波特率 float f = stopBits;//停止位 if (f == 0) { sp.StopBits = StopBits.None; } else if (f == 1.5) { sp.StopBits = StopBits.OnePointFive; } else if (f == 1) { sp.StopBits = StopBits.One; } else { sp.StopBits = StopBits.Two; } sp.DataBits = dataBit;//数据位 if (parity == 0) { sp.Parity = Parity.None; } else if (parity == 1) { sp.Parity = Parity.Odd; } else if (parity == 2) { sp.Parity = Parity.Even; } else { sp.Parity = Parity.None; } // sp.ReadTimeout = 1000;//设置超时读取时间 // sp.WriteTimeout = 1000;//超时写入时间 try { if (!sp.IsOpen) { sp.Open(); } } catch (Exception) { flag = false; } return flag; } /// <summary> /// 关闭端口 /// </summary> /// <returns></returns> public bool CloseCom() { try { if (sp.IsOpen) { sp.Close(); } return true; } catch { return false; } } 在串口的打开方法中 SerialPort类对分别用[BaudRate]、[Parity]、[DataBits]、[StopBits]属性设置通讯格式中的波特率、校验位、数据位、停止位,其中[Parity]和[StopBits]分别是枚举类型Parity、StopBits,Parity类型中枚举了Odd(奇)、Even(偶)、Mark、None、Space,Parity枚举了None、One、OnePointFive、Two。 项目中遇到一个问题是,一个界面开关几次后,再次关闭,要等到很长时间才能退出,等再次打开窗口,串口类接收数据的效率明显降低。 原因是 当串口正在进行大量的数据处理和页面更新的时候,如何强制关闭串口,会造成串口死掉。 解决方法是在串口方法接收数据的时候加入一个变量,先控制停止串口数据的接收,然后关闭串口,这样就不会串口死掉很长时间后才关闭的现象。
public bool SwitchDeviceState(int StateNum) byte[] data = new byte[8]; } for (; verifyIndex < b.Length - 1; verifyIndex++) 数据的发送和读取 public bool SwitchDeviceState(int StateNum) { if (sp == null) { return false; } byte[] data = new byte[8]; data[0] = 0x55;//帧头 data[1] = 0xAA;//帧头 data[2] = 0x06;//帧长度 data[3] = 0x02;//设备地址 data[4] = 0x00;//通道号(改变设备状态时,通道号为0,表示整个设备) data[5] = 0x02;//命令码 switch (StateNum) { //命令数据 case 0: data[6] = 0x00; break;//空闲 case 1: data[6] = 0x01; break;//循环刺激 case 2: data[6] = 0x02; break;//肌电反馈 case 4: data[6] = 0x04; break;//抓握采集 case 5: data[6] = 0x05; break;//电流标定 } return DataWrite(2, data); } /// <summary> /// 向模拟板发送数据命令 /// </summary> /// <param name="verifyIndex">开始计算校验位的位置</param> /// <param name="b"></param> /// <returns></returns> public bool DataWrite(int verifyIndex, byte[] b) { bool flag = true; try { int numAdjust = 0; for (; verifyIndex < b.Length - 1; verifyIndex++) { numAdjust += Convert.ToInt32(b[verifyIndex].ToString()); } if (numAdjust > 0xff) { string strAdjust = Convert.ToString(numAdjust, 16); numAdjust = Convert.ToInt32(strAdjust.Substring(strAdjust.Length - 2), 16); } b[b.Length - 1] = (byte)numAdjust; sp.Write(b, 0, b.Length); } catch { flag = false; } return flag; } 在此方面中C++语言有比较好的封装方法,C#语言我自身没有找到之前比较好的示例,于是自己写了一些简单的方法,已经可以成功向下位机模拟板进行数据发送
void sp_DataReceived(object sender, SerialDataReceivedEventArgs e) 首先SerialPort类读取数据的方法有多种,但是有的读是同步,有的是异步,同步就是和主程序保持一致,只有运行完了ReadByte之后才能运行程序之后的代码,异步就是重新开启一个线程来处理这些问题,主程序不受到干扰,继续运行。 ReadTo和ReadExisting是异步读取,剩下的都是同步读取。
原文链接:https://www.cnblogs.com/eye-like/p/3546501.html |
请发表评论