C#网络编程

串口编程

作者:陈广
日期:2019-1-15


上一篇文章,我们已经对串口通信的理论知识有了稍微的了解,接下来,可以使用 C# 语言对串口进行操作了。在开始编写程序之前,需要做一些准备工作。由于大部分同学手头上不会有带串口的硬件,所以需要安装一个模拟串口软件:Virtual Serial Port Driver Pro。这样就可以在一台电脑之上安装两个虚拟串口,当您向其中一个虚拟串口发串口数据时,此软件会将数据传送至另一个虚拟串口,这样我们就可以编程进行接收了。也可以实现在一端发送数据,另一端进行接收。

准备工作

我安装的是 Virtual Serial Port Driver Pro 9.0 版本,大家可以在网上自行下载。打开软件后,在【First port】栏选择【COM2】,然后在【Second port】栏选择【COM3】(也可选择任意两个空闲串口),然后点击【Add virtual pair】按钮加入这一对串口。最终效果如下图所示:

图 1: 添加一对虚拟串口

好,现在可以关闭虚拟串口软件了。为查看这一对串口是否安装完毕,可在【开始】图标上点鼠标右键,选择【计算机管理】菜单项,打开【计算机管理】窗口,选中【设备管理器】项,在右边窗口中展开【端口(COM 和 LPT)】项,查看是否存在刚才创建的两个虚拟串口。如下图所示:

图 2: 查看虚拟串口

为了验证这两个虚拟串口是否可以互相通信,打开两个串口调试助手,将其中一个的【串口号】设置为“COM2”,另一个的【串口号】设置为“COM3”。点【打开】按钮,然后互发信息,查看是否可以互相通信。效果如下图所示:

图 3:在虚拟串口中互发信息

串口信息的接收

.NET Core 并没有内置串口开发包,所以只能使用 .NET Framework 来进行串口开发,工具我们使用的是 Visual Studio。如果实在要使用 .NET Core 进行开发,有很多的串口开发 NuGet 包可供选择。在 .NET Framework 中,我们可以使用 System.IO.Ports命名空间下的SerialPort进行串口开发。

在 Visual Studio 中新建一个控制台应用程序,输入如下代码:

using System;
using System.Text;
using System.IO.Ports;

namespace ConsoleApp2
{
    class Program
    {
        static SerialPort com = new SerialPort();

        static void Main(string[] args)
        {
            com.PortName = "COM2"; //设置串口号
            com.BaudRate = 9600; //设置波特率
            com.DataReceived += DataReceived; //设置接收数据事件方法
            try
            {
                com.Open();
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.ReadLine();
        }

        static void DataReceived(object sender,SerialDataReceivedEventArgs e)
        {
            byte[] buff = new byte[com.BytesToRead]; //设置接收缓冲
            com.Read(buff, 0, buff.Length); //读取接收到的串口数据
            string recvStr = Encoding.ASCII.GetString(buff); //转换为字符串
            Console.WriteLine(recvStr);
        }
    }
}

打开串口调试助手,将串口号设置为“COM3”,波特率设置为“9600”,单击【打开】按钮以连接 COM3 串口。启动应用程序,在串口调试助手中发送英文字符串,可以看到应用程序这边读取信息成功,如下图所示:

图 4:接收串口信息

我们可以看到,SerialPort使用起来还是很方便的,特别是接收数据这块,只要收到数据就会触发DataReceived事件,我们只需要在这个事件的方法里编写处理代码就可以很轻松地接收完成数据接收。其它的和网络编程基本类似。

串口信息的发送

接下来我们演示如何向串口发送数据。将应用程序代码更改如下:

using System;
using System.Threading;
using System.IO.Ports;

namespace ConsoleApp2
{
    class Program
    {
        static SerialPort com = new SerialPort();

        static void Main(string[] args)
        {
            com.PortName = "COM2"; //设置串口号
            com.BaudRate = 9600; //设置波特率
            
            try
            {
                com.Open();
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            for(int i=1;i<100;i++)
            {
                com.Write("this is test string:" + i.ToString());
                Console.WriteLine("send string " + i.ToString());
                Thread.Sleep(1000);
            }
            Console.ReadLine();
        }
    }
}

打开串口调试助手,勾选【接收区设置】栏的【自动换行显示】,并去掉【十六进制显示】项的勾选。点【打开】按钮监听 COM3 口,打开应用程序,可以看到串口调试助手接收到了应用程序每秒发送一次的信息,如下图所示:

图 5:向串口发送信息

这里我们只是简单地演示了通过串口发送和接收信息,只是带大家入门,如果要发送字节流,和 Socket 编程类似,这里就不再详述了。我们也会在 RFID 编程中演示它更复杂的使用方法。

;

© 2018 - IOT小分队文章发布系统 v0.3