C# SerialPort 串口通讯 通过计算…

来源:互联网 发布:淘宝生活用品店 编辑:程序博客网 时间:2024/06/05 20:21
去年写的一个国家电网的抄表软件用到了SerialPort串口通讯,昨天有个网友说他遇到的问题,无法解决,我吧自己写的代码贴上来,如有问题者可以给我发微博或者MSN haitao_kang@163.com
我写的是用的多线程来操作串口的

C# <wbr>SerialPort <wbr>串口通讯 <wbr>通过计算机232来和外部设备通讯 <wbr>DL/T1997 <wbr>DL/T2007 <wbr>通讯协议

C# <wbr>SerialPort <wbr>串口通讯 <wbr>通过计算机232来和外部设备通讯 <wbr>DL/T1997 <wbr>DL/T2007 <wbr>通讯协议

C# <wbr>SerialPort <wbr>串口通讯 <wbr>通过计算机232来和外部设备通讯 <wbr>DL/T1997 <wbr>DL/T2007 <wbr>通讯协议

C# <wbr>SerialPort <wbr>串口通讯 <wbr>通过计算机232来和外部设备通讯 <wbr>DL/T1997 <wbr>DL/T2007 <wbr>通讯协议

C# <wbr>SerialPort <wbr>串口通讯 <wbr>通过计算机232来和外部设备通讯 <wbr>DL/T1997 <wbr>DL/T2007 <wbr>通讯协议

C# <wbr>SerialPort <wbr>串口通讯 <wbr>通过计算机232来和外部设备通讯 <wbr>DL/T1997 <wbr>DL/T2007 <wbr>通讯协议

C# <wbr>SerialPort <wbr>串口通讯 <wbr>通过计算机232来和外部设备通讯 <wbr>DL/T1997 <wbr>DL/T2007 <wbr>通讯协议

C# <wbr>SerialPort <wbr>串口通讯 <wbr>通过计算机232来和外部设备通讯 <wbr>DL/T1997 <wbr>DL/T2007 <wbr>通讯协议

C# <wbr>SerialPort <wbr>串口通讯 <wbr>通过计算机232来和外部设备通讯 <wbr>DL/T1997 <wbr>DL/T2007 <wbr>通讯协议


代码如下:
public class SerialPortManage
    {
       //串口资源
       private static SerialPortm_SerialPort = new SerialPort();
       //端口号
       private static stringm_strPortName = "Com1";
       //停止位
       private static StopBitsm_StopBits = StopBits.One;
       //校验位
       private static Parity m_Parity= Parity.Even;
       //每个字节的位数
       private static int m_iDataBits= 8;
       //波特率
       private static int m_iBaudRate= 1200;
       //
       private static intm_iCurrentRecieveByteCount = 0;
       //接收数据
       private static stringinceptData = "";
       //接收数据长度
       private static intinceptDataCount = 0;
       //重复接收次数
       private static int count =0;
       //是否执行递归
       private static Boolean flag =false;

       public enum DataMode { Text,Hex }
       public enum LogMsgType {Incoming, Outgoing, Normal, Warning, Error };
       

       ///<summary>
       /// get,set方法
       ///</summary>
       public static intInceptDataCount
       {
          get { return SerialPortManage.inceptDataCount;}
          set { SerialPortManage.inceptDataCount = value;}
       }
       public static SerialPortSerialPort
       {
          get { return SerialPortManage.m_SerialPort;}
          set { SerialPortManage.m_SerialPort = value;}
       }
       public static intIDataBits
       {
          get { return SerialPortManage.m_iDataBits;}
          set { SerialPortManage.m_iDataBits = value;}
       }
       public static stringStrPortName
       {
          get { return SerialPortManage.m_strPortName;}
          set { SerialPortManage.m_strPortName = value;}
       }
       public static ParityParity
       {
          get { return SerialPortManage.m_Parity; }
          set { SerialPortManage.m_Parity = value; }
       }
       public static intIBaudRate
       {
          get { return SerialPortManage.m_iBaudRate;}
          set { SerialPortManage.m_iBaudRate = value;}
       }
       public static StopBitsStopBits
       {
          get { return SerialPortManage.m_StopBits; }
          set { SerialPortManage.m_StopBits = value;}
       }
       public static intICurrentRecieveByteCount
       {
          get { returnSerialPortManage.m_iCurrentRecieveByteCount; }
          set { SerialPortManage.m_iCurrentRecieveByteCount= value; }
       }

       public static stringInceptData
       {
          get { return SerialPortManage.inceptData; }
          set { SerialPortManage.inceptData = value;}
       }

       ///<summary>
       /// 设置串口
       ///</summary>
       /// <paramname="strPortName"></param>
       /// <paramname="iBaudRate"></param>
       ///<returns></returns>
       public static BooleansetUpCom(string strPortName, int iBaudRate)
       {
          Boolean flag = false;
          try
          {
              if(m_SerialPort.IsOpen)
                 m_SerialPort.Close();
             //设置串口参数
              m_iBaudRate= iBaudRate;
             m_strPortName = strPortName;
              if(openCom())
                 flag = true;
          }
          catch (Exception)
          {

             throw;
          }
          return flag;
       }
       public static BooleansetUpCom()
       {
          Boolean flag = false;
          try
          {
              if(m_SerialPort.IsOpen)
                 m_SerialPort.Close();
             //设置串口参数
             //m_iBaudRate = m_iBaudRate;
             //m_strPortName = m_strPortName;
              if(openCom())
                 flag = true;
          }
          catch (Exception)
          {

             throw;
          }
          return flag;
       }



       ///<summary>
       /// 打开串口
       ///</summary>
       ///<returns></returns>
       public static BooleanopenCom()
       {
          Boolean flag = false;
          try
          {
              if(m_SerialPort.IsOpen)
                 m_SerialPort.Close();

             //设置串口参数
             m_SerialPort.BaudRate = m_iBaudRate;
             m_SerialPort.DataBits = m_iDataBits;
             m_SerialPort.StopBits = m_StopBits;
             m_SerialPort.Parity = m_Parity;
             m_SerialPort.PortName = m_strPortName;
              if(m_iBaudRate <= 1200)
                 m_SerialPort.ReadTimeout =1000;
              else if(m_iBaudRate == 2400)
                 m_SerialPort.ReadTimeout =800;
              else if(m_iBaudRate == 4800)
                 m_SerialPort.ReadTimeout =500;
              else if(m_iBaudRate >= 9600)
                 m_SerialPort.ReadTimeout =200;
              //打开串口
             m_SerialPort.Open();
             m_SerialPort.DataReceived += newSerialDataReceivedEventHandler(m_SerialPort_DataReceived);
              flag =true;
          }
          catch (Exception)
          {
             throw;
          }
          return flag;
       }


       ///<summary>
       /// 发送数据
       ///</summary>
       /// <paramname="data"></param>
       ///<returns></returns>
       public static intSendData(byte[] data)
       {
          //应加判断端口是否已经打开
          m_SerialPort.DataReceived += newSerialDataReceivedEventHandler(m_SerialPort_DataReceived);

          inceptData = "";
          inceptDataCount = 0;
          count = 0;
          flag = true;
          try
          {
              //发送数据到串口
             m_SerialPort.Write(data, 0, data.Length);
          }
          catch (FormatException)
          {
             throw;
          }
          return data.Length;
       }


       ///<summary>
       /// 接收数据
       ///</summary>
       /// <paramname="sender"></param>
       /// <paramname="e"></param>
       public static voidm_SerialPort_DataReceived(object sender,SerialDataReceivedEventArgs e)
       {
          //lock ("myLock")
          //{
              intreadCount = 0;
              //获取字节长度
              int bytes =m_SerialPort.BytesToRead;

              //创建字节数组
              byte[]buffer = new byte[bytes];
             //ComPort.ReadTimeout = 100;
              //读取缓冲区的数据到数组
              readCount =m_SerialPort.Read(buffer, 0, bytes);
             Log(LogMsgType.Incoming,ByteArrayToHexString(buffer), readCount);
              if(InceptData.EndsWith("16") || count > 5)
              {
                 flag = false;
                 return;
              }
              else
              {
                 if (flag)
                 {
                    System.Threading.Thread.Sleep(200);
                    m_SerialPort_DataReceived();
                 }
                 else
                    return;
              }
          //}
       }

       ///<summary>
       /// 接收数据
       ///</summary>
       public static voidm_SerialPort_DataReceived()
       {
          //m_SerialPort.DataReceived += newSerialDataReceivedEventHandler(m_SerialPort_DataReceived);
          //lock ("myLock")
          //{
             count++;
             System.Threading.Thread.Sleep(100);
              intreadCount = 0;
              //获取字节长度
              int bytes =m_SerialPort.BytesToRead;

              //创建字节数组
              byte[]buffer = new byte[bytes];
             //ComPort.ReadTimeout = 100;
              //读取缓冲区的数据到数组
              readCount =m_SerialPort.Read(buffer, 0, bytes);
              //显示读取的数据到数据窗口
              if(!(buffer.Length < 2))
              {
                 Log(LogMsgType.Incoming,ByteArrayToHexString(buffer), readCount);
              }
              if(InceptData.EndsWith("16") || count > 5)
              {
                 flag = false;
                 return;
              }
              else
              {
                 if (flag)
                 {
                    System.Threading.Thread.Sleep(200);
                    m_SerialPort_DataReceived();
                 }
                 else
                    return;
              }
          //}
       }

       ///<summary>
       /// 显示数据日志
       ///</summary>
       /// <paramname="msgtype"></param>
       /// <paramname="msg"></param>
       /// <paramname="count"></param>
       private static voidLog(LogMsgType msgtype, string msg, int count)
       {
          //this.richTextBox1.Invoke(newEventHandler(delegate
          //{
          inceptData += msg;
          inceptDataCount += count;
          //this.richTextBox1.SelectedText =string.Empty;
          //this.richTextBox1.SelectionFont = newFont(this.richTextBox1.SelectionFont, FontStyle.Bold);
          //this.richTextBox1.SelectionColor =LogMsgTypeColor[(int)msgtype];
          //this.richTextBox1.AppendText(msg);
          //this.richTextBox1.ScrollToCaret();
          //}));

          //MessageBox.Show(data);
       }
       
       
       ///<summary>
       /// 十六进制转换字节数组
       ///</summary>
       /// <paramname="s"></param>
       ///<returns></returns>
       private static byte[]HexStringToByteArray(string s)
       {
          s = s.Replace(" ", "");
          byte[] buffer = new byte[s.Length / 2];
          for (int i = 0; i < s.Length; i +=2)
              buffer[i /2] = (byte)Convert.ToByte(s.Substring(i, 2), 16);
          return buffer;
       
       
       
       ///<summary>
       /// 字节数组转换十六进制
       ///</summary>
       /// <paramname="data"></param>
       ///<returns></returns>
       private static stringByteArrayToHexString(byte[] data)
       {
          StringBuilder sb = new StringBuilder(data.Length* 3);
          foreach (byte b in data)
             sb.Append(Convert.ToString(b, 16).PadLeft(2,'0'));//.PadRight(3, ' '));
          return sb.ToString().ToUpper();
       }
    }
0 0
原创粉丝点击