通用串口类
来源:互联网 发布:telnet 内网端口不通 编辑:程序博客网 时间:2024/06/06 01:20
public class SerialClass { SerialPort _serialPort = null; //定义委托 public delegate void SerialPortDataReceiveEventArgs(object sender, SerialDataReceivedEventArgs e, byte[] bits); //定义接收数据事件 public event SerialPortDataReceiveEventArgs DataReceived; //定义接收错误事件 //public event SerialErrorReceivedEventHandler Error; //接收事件是否有效 false表示有效 public bool ReceiveEventFlag = false; #region 获取串口名 private string protName="COM4"; public string PortName { get { return _serialPort.PortName; } set { _serialPort.PortName = value; protName = value; } } #endregion #region 获取比特率 private int baudRate; public int BaudRate { get { return _serialPort.BaudRate; } set { _serialPort.BaudRate = value; baudRate = value; } } #endregion #region 默认构造函数 /// <summary> /// 默认构造函数,操作COM1,速度为19200,没有奇偶校验,8位字节,停止位为1 "COM1", 9600, Parity.None, 8, StopBits.One /// </summary> public SerialClass() { _serialPort = new SerialPort(protName); _serialPort.BaudRate = 19200; _serialPort.Parity = Parity.None; _serialPort.DataBits = 8; _serialPort.StopBits = StopBits.One; _serialPort.Handshake = Handshake.None; _serialPort.RtsEnable = true; _serialPort.ReadTimeout = 2000; setSerialPort(); } #endregion #region 构造函数 /// <summary> /// 构造函数, /// </summary> /// <param name="comPortName"></param> public SerialClass(string comPortName) { _serialPort = new SerialPort(comPortName); _serialPort.BaudRate = 19200; _serialPort.Parity = Parity.None; _serialPort.DataBits = 8; _serialPort.StopBits = StopBits.One; _serialPort.Handshake = Handshake.None; _serialPort.RtsEnable = true; _serialPort.ReadTimeout = 2000; setSerialPort(); } #endregion #region 构造函数,可以自定义串口的初始化参数 /// <summary> /// 构造函数,可以自定义串口的初始化参数 /// </summary> /// <param name="comPortName">需要操作的COM口名称</param> /// <param name="baudRate">COM的速度</param> /// <param name="parity">奇偶校验位</param> /// <param name="dataBits">数据长度</param> /// <param name="stopBits">停止位</param> public SerialClass(string comPortName, int baudRate, Parity parity, int dataBits, StopBits stopBits) { _serialPort = new SerialPort(comPortName, baudRate, parity, dataBits, stopBits); _serialPort.RtsEnable = true; //自动请求 _serialPort.ReadTimeout = 3000;//超时 setSerialPort(); } #endregion #region 析构函数 /// <summary> /// 析构函数,关闭串口 /// </summary> ~SerialClass() { if (_serialPort.IsOpen) _serialPort.Close(); } #endregion #region 设置串口参数 /// <summary> /// 设置串口参数 /// </summary> /// <param name="comPortName">需要操作的COM口名称</param> /// <param name="baudRate">COM的速度</param> /// <param name="dataBits">数据长度</param> /// <param name="stopBits">停止位</param> public void setSerialPort(string comPortName, int baudRate, int dataBits, int stopBits) { if (_serialPort.IsOpen) _serialPort.Close(); _serialPort.PortName = comPortName; _serialPort.BaudRate = baudRate; _serialPort.Parity = Parity.None; _serialPort.DataBits = dataBits; _serialPort.StopBits = (StopBits)stopBits; _serialPort.Handshake = Handshake.None; _serialPort.RtsEnable = false; _serialPort.ReadTimeout = 3000; _serialPort.NewLine = "/r/n"; setSerialPort(); } #endregion #region 设置接收函数 /// <summary> /// 设置串口资源,还需重载多个设置串口的函数 /// </summary> void setSerialPort() { if (_serialPort != null) { //设置触发DataReceived事件的字节数为1 _serialPort.ReceivedBytesThreshold = 1; //接收到一个字节时,也会触发DataReceived事件 _serialPort.DataReceived += new SerialDataReceivedEventHandler(_serialPort_DataReceived); //接收数据出错,触发事件 _serialPort.ErrorReceived += new SerialErrorReceivedEventHandler(_serialPort_ErrorReceived); //打开串口 //openPort(); } } #endregion #region 打开串口资源 /// <summary> /// 打开串口资源 /// <returns>返回bool类型</returns> /// </summary> public bool openPort() { bool ok = false; //如果串口是打开的,先关闭 if (_serialPort.IsOpen) _serialPort.Close(); try { //打开串口 _serialPort.Open(); ok = true; } catch (Exception Ex) { throw Ex; } return ok; } #endregion #region 关闭串口 /// <summary> /// 关闭串口资源,操作完成后,一定要关闭串口 /// </summary> public void closePort() { //如果串口处于打开状态,则关闭 if (_serialPort.IsOpen) _serialPort.Close(); } #endregion #region 接收串口数据事件 /// <summary> /// 接收串口数据事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { //禁止接收事件时直接退出 if (ReceiveEventFlag) { return; } try { System.Threading.Thread.Sleep(2); byte[] _data = new byte[_serialPort.BytesToRead]; _serialPort.Read(_data, 0, _data.Length); if (_data.Length == 0) { return; } if (DataReceived != null) { DataReceived(sender, e, _data); } _serialPort.DiscardInBuffer(); //清空接收缓冲区 } catch (Exception ex) { //throw ex; } } #endregion #region 接收数据出错事件 /// <summary> /// 接收数据出错事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void _serialPort_ErrorReceived(object sender, SerialErrorReceivedEventArgs e) { } #endregion #region 发送数据string类型 public void SendData(string data) { //发送数据 //禁止接收事件时直接退出 if (ReceiveEventFlag) { return; } if (_serialPort.IsOpen) { _serialPort.Write(data); } } #endregion #region 发送数据byte类型 /// <summary> /// 数据发送 /// </summary> /// <param name="data">要发送的数据字节</param> public void SendData(byte[] data, int offset, int count) { //禁止接收事件时直接退出 if (ReceiveEventFlag) { return; } try { if (_serialPort.IsOpen) { _serialPort.DiscardInBuffer();//清空接收缓冲区 _serialPort.Write(data, offset, count); } } catch (Exception ex) { throw ex; } } #endregion #region 发送命令 /// <summary> /// 发送命令 /// </summary> /// <param name="SendData">发送数据</param> /// <param name="ReceiveData">接收数据</param> /// <param name="Overtime">超时时间</param> /// <returns></returns> public int SendCommand(byte[] SendData, ref byte[] ReceiveData, int Overtime) { if (_serialPort.IsOpen) { try { ReceiveEventFlag = true; //关闭接收事件 _serialPort.DiscardInBuffer(); //清空接收缓冲区 _serialPort.Write(SendData, 0, SendData.Length); int num = 0, ret = 0; System.Threading.Thread.Sleep(10); ReceiveEventFlag = false; //打开事件 while (num++ < Overtime) { if (_serialPort.BytesToRead >= ReceiveData.Length) break; System.Threading.Thread.Sleep(10); } if (_serialPort.BytesToRead >= ReceiveData.Length) { ret = _serialPort.Read(ReceiveData, 0, ReceiveData.Length); } else { ret = _serialPort.Read(ReceiveData, 0, _serialPort.BytesToRead); } ReceiveEventFlag = false; //打开事件 return ret; } catch (Exception ex) { ReceiveEventFlag = false; //throw ex; } } return -1; } #endregion #region 获取串口 /// <summary> /// 获取所有已连接短信猫设备的串口 /// </summary> /// <returns></returns> public string[] serialsIsConnected() { List<string> lists = new List<string>(); string[] seriallist = getSerials(); foreach (string s in seriallist) { } return lists.ToArray(); } #endregion #region 获取当前全部串口资源 /// <summary> /// 获得当前电脑上的所有串口资源 /// </summary> /// <returns></returns> public string[] getSerials() { return SerialPort.GetPortNames(); } #endregion #region 字节型转换16 /// <summary> /// 把字节型转换成十六进制字符串 /// </summary> /// <param name="InBytes"></param> /// <returns></returns> public static string ByteToString(byte[] InBytes) { string StringOut = ""; foreach (byte InByte in InBytes) { StringOut = StringOut + String.Format("{0:X2} ", InByte); } return StringOut; } #endregion #region 十六进制字符串转字节型 /// <summary> /// 把十六进制字符串转换成字节型(方法1) /// </summary> /// <param name="InString"></param> /// <returns></returns> public static byte[] StringToByte(string InString) { string[] ByteStrings; ByteStrings = InString.Split(" ".ToCharArray()); byte[] ByteOut; ByteOut = new byte[ByteStrings.Length]; for (int i = 0; i <= ByteStrings.Length - 1; i++) { //ByteOut[i] = System.Text.Encoding.ASCII.GetBytes(ByteStrings[i]); ByteOut[i] = Byte.Parse(ByteStrings[i], System.Globalization.NumberStyles.HexNumber); //ByteOut[i] =Convert.ToByte("0x" + ByteStrings[i]); } return ByteOut; } #endregion #region 十六进制字符串转字节型 /// <summary> /// 字符串转16进制字节数组(方法2) /// </summary> /// <param name="hexString"></param> /// <returns></returns> public static byte[] strToToHexByte(string hexString) { hexString = hexString.Replace(" ", ""); if ((hexString.Length % 2) != 0) hexString += " "; byte[] returnBytes = new byte[hexString.Length / 2]; for (int i = 0; i < returnBytes.Length; i++) returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16); return returnBytes; } #endregion #region 字节型转十六进制字符串 /// <summary> /// 字节数组转16进制字符串 /// </summary> /// <param name="bytes"></param> /// <returns></returns> public static string byteToHexStr(byte[] bytes) { string returnStr = ""; if (bytes != null) { for (int i = 0; i < bytes.Length; i++) { returnStr += bytes[i].ToString("X2"); } } return returnStr; } #endregion } #endregion
阅读全文
0 0
- 通用串口类
- 通用控制台和串口控制台
- 串口数据解析通用方法
- 通用串口测试工具 使用方法
- WINCE6.0 把调试串口改为通用串口
- 通用的I/O模拟串口程序
- MS51单片机通用串口发送接收程序
- 430之通用异步串口通信模块
- AVR简单通用的串口配置方法
- Qt -- Qt5.5.1实现通用串口程序
- 通用类
- 调试串口通用程序的几种技巧
- usb转RS232通用串口与虚拟机连接使用
- Java串口通信的通用模式及其问题
- Qt (六) -- Qt5.5.1实现通用串口程序
- 串口类
- 串口类
- 串口类
- Linux下安装php
- VC 使用OnCtlColor函数来改变控件颜色
- for循环的闭包
- Android FloatMath.ceil过时的解决办法
- React-Native
- 通用串口类
- cordova自定义插件步骤
- SRS(simple-rtmp-server)流媒体服务器源码分析--启动
- Navicat for MySQL使用手记--实现自动备份数据库
- Unity3D 04-GameObject,Component,Time,Input,Physics
- 工作中遇到的一些问题集合
- 作为前端,应该知道什么是‘单元测试’?
- jsp项目web实战
- C语言快速讲解(六)联合体、枚举、IO