C# 232端口侦听

来源:互联网 发布:产品分析软件 编辑:程序博客网 时间:2024/06/04 00:43
当需要编程操纵硬件时会遇到过这样的问题,就是通过串口来接收硬件发来的数据,或是通过串口向硬件发送某种格式的命令。在C#平台上,可以通过 System.IO.Ports 命名空间下的SerialPort 类来实现。

  下面是我做过的一个简单的示例,首先获取本机关联的串行端口列表,然后获取配置文件中配置的COM端口,检查是否在本机串行端口列表中,若在列表中则进一步实例化串口对象,并为串口对象指定数据接收事件来实现监听,示例代码如下:

 

复制代码
using System.IO.Ports;namespace SerialTest{  public class SerialTest  {       #region 串口监听            private SerialPort serialPort = null;        /// <summary>        /// 开启串口监听        /// </summary>        private void StartSerialPortMonitor()        {            List<string> comList = GetComlist(false); //首先获取本机关联的串行端口列表                   if (comList.Count == 0)            {                DialogForm.Show("提示信息", "当前设备不存在串行端口!");                System.Environment.Exit(0); //彻底退出应用程序               }            else            {                string targetCOMPort = ConfigurationManager.AppSettings["COMPort"].ToString();                //判断串口列表中是否存在目标串行端口                if (!comList.Contains(targetCOMPort))                {                    DialogForm.Show("提示信息", "当前设备不存在配置的串行端口!");                    System.Environment.Exit(0); //彻底退出应用程序                   }                serialPort = new SerialPort();                //设置参数                serialPort.PortName = ConfigurationManager.AppSettings["COMPort"].ToString(); //通信端口                serialPort.BaudRate = Int32.Parse(ConfigurationManager.AppSettings["BaudRate"].ToString()); //串行波特率                serialPort.DataBits = 8; //每个字节的标准数据位长度                serialPort.StopBits = StopBits.One; //设置每个字节的标准停止位数                serialPort.Parity = Parity.None; //设置奇偶校验检查协议                serialPort.ReadTimeout = 3000; //单位毫秒                serialPort.WriteTimeout = 3000; //单位毫秒                //串口控件成员变量,字面意思为接收字节阀值,                //串口对象在收到这样长度的数据之后会触发事件处理函数                //一般都设为1                serialPort.ReceivedBytesThreshold = 1;                serialPort.DataReceived += new SerialDataReceivedEventHandler(CommDataReceived); //设置数据接收事件(监听)                try                {                    serialPort.Open(); //打开串口                }                catch (Exception ex)                {                    DialogForm.Show("提示信息", "串行端口打开失败!具体原因:" + ex.Message);                    System.Environment.Exit(0); //彻底退出应用程序                   }            }        }        /// <summary>        /// 串口数据处理函数        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        public void CommDataReceived(Object sender, SerialDataReceivedEventArgs e)        {            try            {                //Comm.BytesToRead中为要读入的字节长度                int len = serialPort.BytesToRead;                Byte[] readBuffer = new Byte[len];                serialPort.Read(readBuffer, 0, len); //将数据读入缓存                //处理readBuffer中的数据,自定义处理过程                string msg = encoding.GetString(readBuffer, 0, len); //获取出入库产品编号                DialogForm.Show("接收到的信息", msg);            }            catch(Exception ex)            {                DialogForm.Show("提示信息", "接收返回消息异常!具体原因:" + ex.Message);            }        }        /// <summary>        /// 关闭串口        /// </summary>        private void Stop()        {            serialPort.Close();        }        /// <summary>        /// 获取本机串口列表        /// </summary>        /// <param name="isUseReg"></param>        /// <returns></returns>        private List<string> GetComlist(bool isUseReg)        {            List<string> list = new List<string>();            try            {                if (isUseReg)                {                    RegistryKey RootKey = Registry.LocalMachine;                    RegistryKey Comkey = RootKey.OpenSubKey(@"HARDWARE\DEVICEMAP\SERIALCOMM");                    String[] ComNames = Comkey.GetValueNames();                    foreach (String ComNamekey in ComNames)                    {                        string TemS = Comkey.GetValue(ComNamekey).ToString();                        list.Add(TemS);                    }                }                else                {                    foreach (string com in SerialPort.GetPortNames())  //自动获取串行口名称                          list.Add(com);                }            }            catch            {                DialogForm.Show("提示信息", "串行端口检查异常!");                System.Environment.Exit(0); //彻底退出应用程序               }            return list;        }          #endregion 串口监听  }}
原创粉丝点击