zoukankan      html  css  js  c++  java
  • .NET 串口通信

    这段时间做了一个和硬件设备通信的小项目,涉及到扫描头、输送线、称重机、贴标机等硬件。和各设备之间通信使用的是串口或网络(Socket)的方式。扫描头和贴标机使用的网络通信,输送线和称重机使用的是串口通信。

      串口通信,以前一直觉得神秘,没想到用起来却这么简单。当然,这样简单要归功于 .NET 对其操作的封装。

      .NET 里提供了专门操作串口的类 System.IO.Ports.SerialPort,可以操作串口收发数据。只需要 new 一个对象,简单配置一下相关属性,就可以使用串口收发数据了。

      SerialPort 类常用的属性有 PortName、BaudRate、DataBits、StopBits、Parity 等。PortName 是端口名称,如COM1、COM2等,默认COM1;BaudRate 是波特率,默认 9600;DataBits 是数据位,默认是 8;StopBits 是停止位,默认是System.IO.Ports.StopBits.One、Parity 设定奇偶校验,默认是System.IO.Ports.Parity.None。

      其中端口名称设置的是你通信使用的本地端口的名称,其它参数,一般默认。具体意思?关我毛事!和设备约定相同就行了。

      所以,一般来说,使用串口的准备操作,就这么简单:

    1             System.IO.Ports.SerialPort com1 = new System.IO.Ports.SerialPort();
    2             com1.PortName = "COM1";  //端口名称,默认COM1
    3             com1.BaudRate = 9600;  //波特率,默认9600
    4             com1.DataBits = 8;  //数据位,默认8
    5             com1.StopBits = System.IO.Ports.StopBits.One;  //停止位,默认 System.IO.Ports.StopBits.One
    6             com1.Parity = System.IO.Ports.Parity.None;  //奇偶校验,默认 System.IO.Ports.Parity.None

      如果都使用的默认参数,还可以精简成这样:

    1             System.IO.Ports.SerialPort com1 = new System.IO.Ports.SerialPort("COM1");

      当然,对硬件设备的操作需要在使用前后打开或关闭资源。SerialPort 类提供了 Open 和 Close 方法用来打开或半闭串口。

      打开以后,就可以向端口读写数据了。

      SerialPort 类提供了 Write 和 WriteLine 两个方法向串口发送数据。Write 发送一个 byte 数组,和一般的流操作类似;WriteLine 可以直接发送一个字符串。

      SerialPort 类提供了 Read、ReadByte、ReadChar、ReadExisting、ReadLine 和 ReadTo 等方法可以从串口中读取数据。Read 可以把数据读取到一个 byte 数组;ReadByte 可以读取一个字节;ReadChar 可以读取一个字符;ReadExisting 可以读取当前可读取的所有数据;ReadLine 可以读取一行数据;ReadTo 这个我没用过。

      当然如果没有数据,就读取不到了。我们可以使用 BytesToRead 属性获取可读取的数据长度,如果长度为 0,就说明串口中没有接收到数据。如果需要监听端口数据,就可以单独开一个线程反复读取。

      除了使用反复读取来监听串口数据,还可以使用 SerialPort 类提供的 DataReceived 事件来监听串口中接收到的数据,当串口中有可读取的数据,系统会自动触发 DataReceived 事件处理程序。设置代码如下:

    1             System.IO.Ports.SerialPort com1 = new System.IO.Ports.SerialPort("COM1");
    2             com1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(Com1_DataReceived);

      回调方法声明如下:

    1         private void Com1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    2         {
    3             
    4         }

      理论讲完了,下面写一个简单的 Demo 实验一下。

      因为要验证收发数据,需要用到一个串口虚拟化的软件。该软件可以在 PC 上成对的虚拟串口,可以实现对 COM1 发的数据,COM2 中接收到。

      环境搭建好以后,编写代码试着在单击按钮的时候,将文本框的内容写入 COM1,然后从 COM2 中读取,并使用对话框弹出来。

      新建一个窗体,拖入一个文本框 textbox1 和一个按钮 button1,然后添加操作代码,如下:

    复制代码
     1     public partial class Form1 : Form
     2     {
     3         System.IO.Ports.SerialPort COM2 = null;
     4 
     5         public Form1()
     6         {
     7             InitializeComponent();
     8         }
     9 
    10         private void Form1_Load(object sender, EventArgs e)
    11         {
    12             COM2 = new System.IO.Ports.SerialPort("COM2");
    13             COM2.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(Com2_DataReceived);
    14             COM2.Open();
    15         }
    16 
    17         private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    18         {
    19             COM2.Close();
    20             COM2 = null;
    21         }
    22 
    23         private void button1_Click(object sender, EventArgs e)
    24         {
    25             System.IO.Ports.SerialPort com1 = new System.IO.Ports.SerialPort("COM1");
    26             com1.Open();
    27             com1.WriteLine(this.textBox1.Text);
    28             com1.Close();
    29         }
    30 
    31         private void Com2_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    32         {
    33             System.IO.Ports.SerialPort com = (System.IO.Ports.SerialPort)sender;
    34             MessageBox.Show(com.ReadExisting());
    35         }
    36     }
    复制代码


      运行,测试,如图:

    具体位置:http://www.cnblogs.com/zhhh/p/3326083.html

    调试工具,请下载:串口调试助手.exe。

  • 相关阅读:
    Windows Server 2012配置开机启动项
    Windows Server 2019 SSH Server
    NOIP2017 senior A 模拟赛 7.7 T1 棋盘
    Noip 2015 senior 复赛 Day2 子串
    Noip 2015 senior复赛 题解
    Noip 2014 senior Day2 解方程(equation)
    Noip 2014 senior Day2 寻找道路(road)
    Noip 2014 senior Day2 无线网络发射器选址(wireless)
    Noip2014senior复赛 飞扬的小鸟
    Noip 2014 senior 复赛 联合权值(link)
  • 原文地址:https://www.cnblogs.com/wlming/p/5701181.html
Copyright © 2011-2022 走看看