C#实现串口通信

20 篇文章 0 订阅
一个小项目中应用到的串口通信,把核心源码整理一下.
C#实现串口通信其实非常简单,用到的类 SerialPort ,引用的命名空间System.IO.Ports.SerialPort类中主要用到的属性,有一下几个:
   PortName 通信端口名称
   BaudRate 串行波特率
   DataBits 每个字节的标准数据位长度
   Parity  奇偶校验检查协议
   StopBits 每个字节的标准停止位数
   HandShaking 串行端口数据传输的握手协议
SerialPort方法:
   Open 打开一个新的串行端口连接
   Write 将数据写入串行端口输出缓冲区
   WriteLine 将指定的字符串和NewLine值输出缓冲区
   Read 从缓冲区读取数据
   ReadLine 一直读取到输入缓冲区中的NewLine值
 
将SerialPort的类操作封装了一下,呵呵,见下类SerialPortCommunication          
  1. using System;
  2. using System.Collections.Generic;

  3. using System.Text;
  4. using System.IO.Ports;
  5. using System.Threading;
  6. namespace SerialPortComm
  7. {
  8.     public class SerialPortCommunication
  9.     {
  10.         #region SerialPort 基本设置
  11.         /// <summary>
  12.         /// 端口号
  13.         /// </summary>
  14.         public string PortName = "COM1";
  15.         /// <summary>
  16.         /// 波特率
  17.         /// </summary>
  18.         public Int32 BaudRate = 9600;
  19.         /// <summary>
  20.         /// 数据位
  21.         /// </summary>
  22.         public int DataBits = 8;
  23.         /// <summary>
  24.         /// 校验位
  25.         /// </summary>
  26.         public string Paritys = "None";
  27.         /// <summary>
  28.         /// 停止位
  29.         /// </summary>
  30.         public string StopBits = "One";
  31.         /// <summary>
  32.         /// 握手协议
  33.         /// </summary>
  34.         public string HandShaking = "None";
  35.         #endregion


  36.         private Thread thread = null;
  37.         SerialPort serialPort = new SerialPort();

  38.         public bool KeepRead = true;
  39.         /// <summary>
  40.         /// 接受数据
  41.         /// </summary>
  42.         public event SerialPortEventHandler ReceivedData;

  43.         /// <summary>
  44.         /// 异常处理
  45.         /// </summary>
  46.         public event SerialPortEventHandler SerialPortException;


  47.         public SerialPortCommunication(string portName)
  48.         {
  49.             PortName = portName;

  50.             //构造函数初始化

  51.             SerialPortSetting spSetting = new SerialPortSetting("config.xml");
  52.             PortConfig pConfig = spSetting.GetSerialPortName(PortName);
  53.             if (pConfig == null)
  54.             {
  55.                 pConfig = new PortConfig();
  56.                 pConfig.PortName = this.PortName;
  57.                 spSetting.AddSerialPort(pConfig);//不存在则添加默认配置
  58.             }
  59.             //加载配置信息
  60.             this.BaudRate = Int32.Parse(pConfig.BaudRate);
  61.             this.DataBits = int.Parse(pConfig.DataBits);
  62.             this.Paritys = pConfig.Paritys;
  63.             this.StopBits = pConfig.StopBits;
  64.             this.HandShaking = pConfig.HandShaking;
  65.         }


  66.         /// <summary>
  67.         /// 打开端口
  68.         /// </summary>
  69.         public void Open()
  70.         {
  71.             serialPort.Encoding = Encoding.UTF8;//编码

  72.             serialPort.PortName = PortName;
  73.             serialPort.BaudRate = BaudRate;
  74.             serialPort.DataBits = DataBits;
  75.             serialPort.Parity = (Parity)Enum.Parse(typeof(Parity), Paritys);
  76.             serialPort.StopBits = (StopBits)Enum.Parse(typeof(StopBits), StopBits);
  77.             serialPort.Handshake = (Handshake)Enum.Parse(typeof(Handshake), HandShaking);

  78.             serialPort.WriteTimeout = 100;
  79.             serialPort.ReadTimeout = 100;

  80.             if (serialPort.IsOpen)
  81.             {
  82.                 serialPort.Close();
  83.             }
  84.             try
  85.             {
  86.                 serialPort.Open();
  87.                 Start();
  88.             }
  89.             catch
  90.             {
  91.                 SerialPortException(thisnew SerialPortEventArgs(serialPort.PortName, "打开异常,端口已经存在或已经占用!"));
  92.             }
  93.         }


  94.         /// <summary>
  95.         /// 返回端口打开状态
  96.         /// </summary>
  97.         public bool IsOpen
  98.         {
  99.             get { return serialPort.IsOpen; }
  100.         }


  101.         /// <summary>
  102.         /// 发送字符串
  103.         /// </summary>
  104.         /// <param name="sendStrings"></param>
  105.         public void SendLine(string sendStrings)
  106.         {
  107.             serialPort.WriteLine(sendStrings);

  108.         }

  109.         /// <summary>
  110.         /// 发送字符串
  111.         /// </summary>
  112.         /// <param name="sendStrings"></param>
  113.         public void Send(string sendStrings)
  114.         {
  115.             serialPort.Write(sendStrings);

  116.         }

  117.         /// <summary>
  118.         /// 发送字符串(开始和结束的字符串)
  119.         /// </summary>
  120.         /// <param name="sendStrings">发送的字符串</param>
  121.         /// <param name="StartStrings">开始字符串</param>
  122.         /// <param name="EndStrings">结束字符串</param>
  123.         public void Send(string sendStrings, string StartStrings, string EndStrings)
  124.         {
  125.             serialPort.Write(StartStrings + sendStrings + EndStrings);
  126.         }

  127.         /// <summary>
  128.         /// 关闭端口
  129.         /// </summary>
  130.         public void Close()
  131.         {
  132.             if (thread != null && serialPort != null)
  133.             {
  134.                 KeepRead = false;
  135.                 thread.Join();
  136.                 thread = null;
  137.                 serialPort.Close();
  138.                 serialPort = null;
  139.             }
  140.         }


  141.         //接受数据处理
  142.         public void ReceiveProcess()
  143.         {
  144.             while (KeepRead)
  145.             {
  146.                 if (serialPort.IsOpen)
  147.                 {
  148.                     try
  149.                     {
  150.                         string ReceiveLine = serialPort.ReadLine();
  151.                         ReceivedData(thisnew SerialPortEventArgs(serialPort.PortName, ReceiveLine));
  152.                     }
  153.                     catch
  154.                     {
  155.                        //超时
  156.                     }
  157.                 }
  158.             }
  159.         }

  160.         private void Start()
  161.         {
  162.             if (KeepRead)
  163.             {
  164.                 thread = new Thread(new ThreadStart(ReceiveProcess));
  165.                 thread.Start();
  166.             }
  167.         }

  168.     }
  169. }


下面代码主要为 SerialPortCommunication 事件的参数
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. namespace SerialPortComm
  5. {
  6.     /// <summary>
  7.     /// SerialPort事件处理委托
  8.     /// </summary>
  9.     /// <param name="sender"></param>
  10.     /// <param name="e"></param>
  11.     public delegate void SerialPortEventHandler(object sender, SerialPortEventArgs e);
  12.     /// <summary>
  13.     /// 事件参数
  14.     /// </summary>
  15.     public class SerialPortEventArgs : EventArgs
  16.     {
  17.         private string _Message;
  18.         private string _PortName;
  19.         /// <summary>
  20.         /// 消息
  21.         /// </summary>
  22.         public string Message
  23.         {
  24.             set { _Message = value; }
  25.             get { return _Message; }
  26.         }
  27.         /// <summary>
  28.         /// 端口名
  29.         /// </summary>
  30.         public string PortName
  31.         {
  32.             set { _PortName = value; }
  33.             get { return _PortName; }
  34.         }
  35.         /// <summary>
  36.         /// 构造函数
  37.         /// </summary>
  38.         /// <param name="portName">端口名称</param>
  39.         /// <param name="message">消息内容</param>
  40.         public SerialPortEventArgs(string portName, string message)
  41.         {
  42.             this.PortName = portName;
  43.             this.Message = message;
  44.         }
  45.     }
  46. }
XML配置类 SerialPortSetting 代码略,可以见前一篇文章...


PS.1.通信双放设置必须一致;2.计算机与计算机串口通信时候记得用交叉线。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值