• .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     }
    复制代码


      运行,测试,如图:

  • 相关阅读:
    CodeForces 452C Magic Trick (排列组合)
    zoj 3209 Treasure Map(精确覆盖)
    POJ 1459 Power Network(网络流 最大流 多起点,多汇点)
    POJ 1273 Drainage Ditches(网络流 最大流)
    HDU Tickets(简单的dp递推)
    ZOJ 3080 ChiBi(spfa)
    URAL 1036(dp+高精度)
    最佳的 清楚浮动 clearfix
    响应式开发
    javascript 性能优化
  • 原文地址:https://www.cnblogs.com/Brainpan/p/6419515.html
Copyright © 2020-2023  润新知