使用SerialPort类设计串口通讯程序 (VS2005)

一.概述

Visual Studio 6.0 中编写串口通讯程序,一般都使用 Microsoft Communication Control (简称 MSComm )的通讯控件,只要通  过对此控件的属性和事件进行相应编程操作,就可以轻松地实现串口通讯。但在 Microsoft.Net 技术广泛应用的今天, Visual Studio.Net 没有将此控件加入控件库,所以人们采用了许多方法在 Visual Studio.Net 来编写串口通讯程序: 第一种方法是通过采用 Visual Studio 6.0 中原来的 MSComm 控件这是最简单的,最方便的方法,但需要注册;第二种方法是采用微软在 .NET 推出了一个串口控件,基于 .NET P/Invoke 调用方法实现;第三种方法是自己用 API 写串口通信,虽然难度高,但可以方便实现自己想要的各种功能。
现在微软推出了最新版本的 Visual Studio 2005 开发工具,可以不再采用第三方控件的方法来设计串口通讯程序。 NET Framework 2.0 类库包含了 SerialPort , 方便地实现了所需要串口通讯的多种功能,为了使 MSComm 编程方法快速转换到以 SerialPort 类为核心的串口通讯的设计方法,本文着重讨论了 Visual Studio 6.0 MSComm 控件和 SerialPort 类设计方法的异同点。
 
二. SerialPort 常用属性、方法和事件
1 .命名空间
System.IO.Ports 命名空间包含了控制串口重要的 SerialPort 类,该类提供了 同步 I/O 和事件驱动的 I/O 、对管脚和中断状态的访问以及对串行驱动程序属性的访问,所以在程序代码起始位置需加入 Using System.IO.Ports
2 .串口的通讯参数
串口通讯最常用的参数就是 通讯端口号及通讯格式 ( 波特率、数据位、停止位和校验位 ) ,在 MSComm 中相关的属性是 CommPort Settings SerialPort 类与 MSComm 有一些区别 :
a. 通讯端口号
[PortName] 属性 获取或设置通信端口,包括但不限于所有可用的 COM 端口,请注意该属性返回类型为 String ,不是 Mscomm.CommPort short 类型。通常情况下, PortName 正常返回的值为 COM1 COM2 ……, SerialPort 类最大支持的端口数突破了 CommPort 控件中 CommPort 属性不能超过 16 的限止,大大方便了用户串口设备的配置。
b. 通讯格式
SerialPort 类对分别用 [BaudRate] [Parity] [DataBits] [StopBits] 属性设置通讯格式中的波特率、数据位、停止位和校验位,其中 [Parity] [StopBits] 分别是枚举类型 Parity StopBits Parity 类型中枚举了 Odd( ) Even( ) Mark None Space Parity 枚举了 None One OnePointFive Two
SerialPort 类提供了七个重载的构造函数,既 可以对已经实例化的 SerialPort 对象设置上述相关 属性的值,也可以 使用指定的端口名称、波特率和奇偶校验位数据位和停止位直接初始化 SerialPort 类的新实例。
3 .串口的打开和关闭
SerialPort 类没有采用 MSComm.PortOpen=True/False 设置属性值打开关闭串口,相应的是调用类的 Open() Close() 方法。
4. 数据的发送和读取
Serial 类调用重载的 Write WriteLine 方法发送数据,其中 WriteLine 可发送字符串并在字符串末尾加入换行符,读取串口缓冲区的方法有许多,其中除了 ReadExisting 和ReadTo,其余的方法都是同步调用,线程被阻塞直到缓冲区有相应的数据或大于ReadTimeOut属性设定的时间值后,引发ReadExisting异常。
5.DataReceived 事件
该事件类似于 MSComm 控件中的 OnComm 事件, DataReceived 事件在 接收到了 [ReceivedBytesThreshold] 设置的字符个数或接收到了文件结束字符并将其放入了输入缓冲区时被触发。其中 [ ReceivedBytesThreshold] 相当于 MSComm 控件的 [Rthreshold] 属性,该事件的用法与 MsComm 控件的 OnComm 事件在 CommEvent comEvSend comEvEof时是一致的。  
 
三. SerialPort 的使用
对于熟悉 MSComm 控件的程序设计者, SerialPort 类是相当容易上手的。在进行串口通讯时,一般的流程是设置 通讯端口号及波特率、数据位、停止位和校验位,再打开端口连接,发送数据,接收数据,最后关闭端口连接这样几个步骤。
数据接收的设计方法在这里比较重要,采用轮询的方法比较浪费时间,在 Visual Basic 中的延时方法中一般会调用 API 并用 DOEvents 方法来处理,但程序不易控制,建议采用 DataReceived 事件触发的方法,合理的设置 ReceivedBytesThreshold 的值,若接收的是定长的数据,则将 ReceivedBytesThreshold 设为接收数据的长度,若接收数据的结尾是固定的字符或字符串则可采用 ReadTo 的方法或在 DataReceived 事件中判断接收的字符是否满足条件
SerialPort 类读取数据的许多方法是同步阻塞调用,尽量避免在主线程中调用,可以使用异步处理或线程间处理调用这些读取数据的方法。
由于 DataReceived 事件在辅线程被引发,当收到完整的一条数据,返回主线程处理或在窗体上显示时,请注意跨线程的处理, C# 可采用控件异步委托的方法 Control.BeginInvoke 及同步委托的方法 Invoke
 
四.结束语
.NET 平台下熟练使用 SerialPort 类,可以很好地开发出串口通讯类程序,对于过去使用 MSComm 控件设计了一些通讯程序,也可以将 MSComm 控件替换为 SerialPort 类,当然为了避免对以前的项目做大的改动,可以使用 SerialPort 类设计一些与 MSComm 控件具有相同接口的类,在今后工业控制中, SerialPort 类将广泛地应用于串口通讯程序的设计中,发挥着与 MSComm 控件一样的作用。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Windows系统上使用SerialPort类来调用串口,您需要遵循以下步骤: 1. 在Visual Studio中创建一个新的Windows桌面应用程序项目。 2. 添加一个文本框和两个按钮,一个用于打开串口,另一个用于关闭串口。 3. 在“解决方案资源管理器”中,右键单击项目名称,选择“添加”>“引用”。 4. 在“管理NuGet程序包”对话框中搜索“SerialPort”并安装。 5. 在代码文件中导入SerialPort命名空间:using System.IO.Ports; 6. 创建一个SerialPort对象。例如:SerialPort serialPort1 = new SerialPort(); 7. 设置串口的属性,例如:serialPort1.PortName = "COM1"; serialPort1.BaudRate = 9600; 8. 使用Open()方法打开串口serialPort1.Open(); 9. 使用Write()方法向串口发送数据:serialPort1.Write("Hello World!"); 10. 使用DataReceived事件处理程序接收串口数据。例如:serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived); 下面是一个简单的示例代码来演示如何使用SerialPort类来打开、关闭和发送数据到串口: ``` using System; using System.IO.Ports; namespace SerialPortExample { public partial class Form1 : Form { SerialPort serialPort1 = new SerialPort(); public Form1() { InitializeComponent(); } private void buttonOpen_Click(object sender, EventArgs e) { try { serialPort1.PortName = "COM1"; serialPort1.BaudRate = 9600; serialPort1.Open(); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } private void buttonClose_Click(object sender, EventArgs e) { try { serialPort1.Close(); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } private void buttonSend_Click(object sender, EventArgs e) { try { serialPort1.Write("Hello World!"); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) { try { string data = serialPort1.ReadLine(); Invoke(new Action(() => textBoxReceived.AppendText(data))); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } } } ``` 注意:在使用SerialPort类时,要确保始终正确地关闭串口。在打开串口后,最好使用try-catch块来处理可能出现的异常。同时,为了避免UI线程阻塞,最好将DataReceived事件处理程序放在Invoke块中。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值