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

去年写的一个国家电网的抄表软件用到了SerialPort串口通讯,昨天有个网友说他遇到的问题,无法解决,我吧自己写的代码贴上来,如有问题者可以给我发微博或者 MSN haitao_kang@163.com
我写的是用的多线程来操作串口的
 
代码如下:
public class SerialPortManage
       {
             //串口资源
             private static SerialPort m_SerialPort = new SerialPort();
             //端口号
             private static string m_strPortName = "Com1";
             //停止位
             private static StopBits m_StopBits = StopBits.One;
             //校验位
             private static Parity m_Parity = Parity.Even;
             //每个字节的位数
             private static int m_iDataBits = 8;
             //波特率
             private static int m_iBaudRate = 1200;
             //
             private static int m_iCurrentRecieveByteCount  = 0;
             //接收数据
             private static string inceptData = "";
             //接收数据长度
             private static int inceptDataCount = 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 int InceptDataCount
             {
                   get { return SerialPortManage.inceptDataCount; }
                   set { SerialPortManage.inceptDataCount = value; }
             }
             public static SerialPort SerialPort
             {
                   get { return SerialPortManage.m_SerialPort; }
                   set { SerialPortManage.m_SerialPort = value; }
             }
             public static int IDataBits
             {
                   get { return SerialPortManage.m_iDataBits; }
                   set { SerialPortManage.m_iDataBits = value; }
             }
             public static string StrPortName
             {
                   get { return SerialPortManage.m_strPortName; }
                   set { SerialPortManage.m_strPortName = value; }
             }
             public static Parity Parity
             {
                   get { return SerialPortManage.m_Parity; }
                   set { SerialPortManage.m_Parity = value; }
             }
             public static int IBaudRate
             {
                   get { return SerialPortManage.m_iBaudRate; }
                   set { SerialPortManage.m_iBaudRate = value; }
             }
             public static StopBits StopBits
             {
                   get { return SerialPortManage.m_StopBits; }
                   set { SerialPortManage.m_StopBits = value; }
             }
             public static int ICurrentRecieveByteCount
             {
                   get { return SerialPortManage.m_iCurrentRecieveByteCount ; }
                   set { SerialPortManage.m_iCurrentRecieveByteCount  = value; }
             }

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

             /// <summary>
             /// 设置串口
             /// </summary>
             /// <param name="strPortName"></param>
             /// <param name="iBaudRate"></param>
             /// <returns></returns>
             public static Boolean setUpCom(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 Boolean setUpCom()
             {
                   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 Boolean openCom()
             {
                   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 += new SerialDataReceivedEventH andler(m_SerialPort_DataReceived);
                         flag = true;
                   }
                   catch (Exception)
                   {
                         throw;
                   }
                   return flag;
             }


             /// <summary>
             /// 发送数据
             /// </summary>
             /// <param name="data"></param>
             /// <returns></returns>
             public static int SendData(byte[] data)
             {
                   //应加判断端口是否已经打开
                   m_SerialPort.DataReceived += new SerialDataReceivedEventH andler(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>
             /// <param name="sender"></param>
             /// <param name="e"></param>
             public static void m_SerialPort_DataReceived(object sender, SerialDataReceivedEventA rgs e)
             {
                   //lock ("myLock")
                   //{
                         int readCount = 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 void m_SerialPort_DataReceived()
             {
                   //m_SerialPort.DataReceived += new SerialDataReceivedEventH andler(m_SerialPort_DataReceived);
                   //lock ("myLock")
                   //{
                         count++;
                         System.Threading.Thread.Sleep(100);
                         int readCount = 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>
             /// <param name="msgtype"></param>
             /// <param name="msg"></param>
             /// <param name="count"></param>
             private static void Log(LogMsgType msgtype, string msg, int count)
             {
                   //this.richTextBox1.Invoke(new EventHandler(delegate
                   //{
                   inceptData += msg;
                   inceptDataCount += count;
                   //this.richTextBox1.SelectedText = string.Empty;
                   //this.richTextBox1.SelectionFont = new Font(this.richTextBox1.SelectionFont, FontStyle.Bold);
                   //this.richTextBox1.SelectionColor = LogMsgTypeColor[(int)msgtype];
                   //this.richTextBox1.AppendText(msg);
                   //this.richTextBox1.ScrollToCaret();
                   //}));

                   //MessageBox.Show(data);
             }
            
            
             /// <summary>
             /// 十六进制转换字节数组
             /// </summary>
             /// <param name="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;
            
            
            
     
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值