SerialPort控件的使用
- 格式:doc
- 大小:255.00 KB
- 文档页数:36
VisualStudio2005中serialPort控件访问串口实例点评:这个例子包括了这个控件几乎所有的操作,非常有参考价值.serialPort 是在.net framework2.0中才有的东西,感觉这个东西和MSCOMM很相似.这里给出的例子是基于和C-SHAPE的,相应的可以在Cshape和c++中使用,基本上都是一样的.ImportsImportsImportsPublicmparer.OrdinalIgnoreCasessOffaultet.PortName)ort.BaudRate)Parity)ort.DataBits)ort.StopBits)lPort.Handshake)'Set the read/write timeouts_serialPort.ReadTimeout=500_serialPort.WriteTimeout=500_serialPort.Open()_continue=TruereadThread.Start()Console.Write("Name:")name=Console.ReadLine()Console.WriteLine("Type QUIT to exit")While(_continue)message=Console.ReadLine()If sComparer.Equals("quit",message)Then_continue=FalseElse_serialPort.WriteLine(_String.Format("<{0}>:{1} ",name,message))End Ifend whilereadThread.Join()_serialPort.Close()End SubPublic Shared Sub Read()While(_continue)TryDim message As String=_s erialPort.ReadLine()Console.WriteLine(message)Catch ex As TimeoutException'Do nothingEnd TryEnd WhileEnd SubPublic Shared Function SetPortName(ByVal default PortName As String)As StringDim newPortName As StringConsole.WriteLine("Available Ports:")Dim s As StringFor Each s In SerialPort.GetPortNames()Console.WriteLine("{0}",s)Next sConsole.Write("COM port({0}):",defaultPort Name)newPortName=Console.ReadLine()If newPortName=""ThennewPortName=defaultPortNameEnd IfReturn newPortNameEnd FunctionPublic Shared Function SetPortBaudRate(ByVal def aultPortBaudRate As Integer)As IntegerDim newBaudRate As StringConsole.Write("Baud Rate({0}):",defaultP ortBaudRate)newBaudRate=Console.ReadLine()If newBaudRate=""ThennewBaudRate=defaultPortBaudRate.ToS tring()End IfReturn Integer.Parse(newBaudRate)End FunctionPublic Shared Function SetPortParity(ByVal defau ltPortParity As Parity)As ParityDim newParity As StringConsole.WriteLine("Available Parity options: ")Dim s As StringFor Each s In[Enum].GetNames(GetType(Pari ty))Console.WriteLine("{0}",s)Next sConsole.Write("Parity({0}):",defaultPortParit y.ToString())newparity=Console.ReadLine()If newparity=""Thennewparity=defaultPortParity.ToStrin g()End IfReturn CType([Enum].Parse(GetType(Parit y),newParity),Parity)End FunctionPublic Shared Function SetPortDataBits(ByVal def aultPortDataBits As Integer)As IntegerDim newDataBits As StringConsole.Write("Data Bits({0}):",defaultP ortDataBits)newDataBits=Console.ReadLine()If newDataBits=""ThennewDataBits=defaultPortDataBits.ToS tring()End IfReturn Integer.Parse(newDataBits)End FunctionPublic Shared Function SetPortStopBits(ByVal def aultPortStopBits As StopBits)As StopBitsDim newStopBits As StringConsole.WriteLine("Available Stop Bits opt ions:")Dim s As StringFor Each s In[Enum].GetNames(GetType(Stop Bits))Console.WriteLine("{0}",s)Next sConsole.Write("Stop Bits({0}):",defaultPortS topBits.ToString())newStopBits=Console.ReadLine()If newStopBits=""ThennewStopBits=defaultPortStopBits.ToS tring()End IfReturn CType([Enum].Parse(GetType(StopBit s),newStopBits),StopBits)End FunctionPublic Shared Function SetPortHandshake(ByVal de faultPortHandshake As Handshake)As HandshakeDim newHandshake As StringConsole.WriteLine("Available Handshake opti ons:")Dim s As StringFor Each s In[Enum].GetNames(GetType(Hand shake))Console.WriteLine("{0}",s)Next sConsole.Write("Stop Bits({0}):",defaultPortH andshake.ToString())newHandshake=Console.ReadLine()If newHandshake=""ThennewHandshake=defaultPortHandshake.T oString()End IfReturn CType([Enum].Parse(GetType(Handshak e),newHandshake),Handshake)End FunctionEnd Class。
VB2005中SerialPort发送与接收16进制数据上一篇帖子介绍了vb2005中serialport的基本用法,需要注意的是writeline是在发送字符串后加了个换行符(vblf),readline接收时遇到换行符接收才结束。
isopen的用法只能判断用open方法打开的串口,其他程序已打开的串口是无法判断的,所以判断未使用的串口还要用try或on error的方法判断。
上位机和单片机通信用16进制比较多,下面是16进制通信的例子,数据发送用write,数据接收用readbyte。
imports system.io.ports 使用serialport所引用的命名空间public class form1dim fx() as byte 待发送数据数组dim rc() as byte 接收数据数组private sub button1_click(byval sender as system.object, byval e as system.eventargs) hand les button1.clickif button1.text = 打开串口 thenserialport1.portname = com1serialport1.open() 串口打开与关闭button1.text = 关闭串口button2.enabled = truetimer1.enabled = trueelseif serialport1.isopen then serialport1.close()button1.text = 打开串口timer1.enabled = falsebutton2.enabled = falseend ifend sub待发送数据处理与发送private sub button2_click(byval sender as system.object, byval e as system.eventargs) hand les button2.clickdim i as integerdim n as integerdim cmd as string = textbox1.textn = len(cmd) \ 2redim fx(n)for i = 1 to nfx(i) = cbyte(&h & mid(cmd, 2 * i - 1, 2))nextserialport1.write(fx, 1, n) 发送数组fx第1到n数据end sub数据定时接收与显示private sub timer1_tick(byval sender as system.object, byval e as system.eventargs) handles timer1.tickdim strrc as stringdim i as integerdim n as integern = serialport1.bytestoread 读缓冲区数据量,有数据则接收if n > 0 thenredim rc(n)strrc =for i = 1 to nrc(i) = serialport1.readbytestrrc += cstr(hex(rc(i))) & 数据转为16进制显示nexttextbox2.text = strrcend ifend subend class。
上位机实战经验 'VB2010中有一个串口控件SerialPort。
用这个控件很容易实现一个简单的上位机的功能。
本文介绍使用中的几个主要问题:如何打开串口;如何发送数据;如何接收数据;如何显示接收到的数据;如何关闭串口。
1 如何打开串口在“打开串口”按键按下的事件处理程序中,先检查串口是否是“关闭”状态。
如果是、则设置SerialPort 的属性(这些属性也可以在设计时在属性窗口中设置),然后打开串口。
程序如下:Private Sub Open_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OpenPort.ClickIf (SerialPort1.IsOpen = False) ThenSerialPort1.PortName = "COM1" ' 端口号SerialPort1.BaudRate = 9600 ' 波特率SerialPort1.ReceivedBytesThreshold = 1' 接收到1个字符时,就触发DataReceived事件SerialPort1.NewLine = "vbCrLf" ' 接收到的数据的换行符SerialPort1.Open() ' 打开串口End IfEnd Sub要注意的是:打开串口前,下位机必须接到PC的USB端口并上电。
2 如何发送数据在“发送消息”按键按下的事件处理程序中,先检查串口是否处于“打开”状态。
如果是,则发出消息。
程序如下:Private Sub SendMessage_Click(ByVal sender As System.Object, ByVal e AsSystem.EventArgs) Handles SendMessage.ClickIf (SerialPort1.IsOpen) ThenSerialPort1.Write("message") ' 发出消息"message"End IfEnd Sub3 如何接收数据接收数据比发送数据要复杂一些。
qserialport用法1. 介绍Qt是一个跨平台的应用程序开发框架,提供了丰富的库和工具,用于开发图形界面和非图形界面的应用程序。
其中,qserialport是Qt提供的一个用于串口通信的模块,可以方便地实现串口的读写操作。
本文将介绍qserialport的用法,包括如何配置串口参数、打开和关闭串口、读取和写入数据等操作。
通过学习本文,您将能够快速上手使用qserialport进行串口通信。
2. 安装qserialport在开始之前,您需要确保已经安装了Qt框架。
qserialport是Qt的一个模块,但在某些版本的Qt中可能没有默认安装此模块。
您可以通过以下步骤来安装qserialport:1.打开Qt的安装程序。
2.选择“维护工具”菜单下的“添加或删除组件”。
3.在弹出的对话框中,找到并选中“Qt Serial Port”模块。
4.点击“确定”按钮开始安装。
完成安装后,您就可以在Qt项目中使用qserialport了。
3. 配置串口参数在使用qserialport进行串口通信之前,您需要先配置串口的参数,包括串口号、波特率、数据位、校验位和停止位等。
首先,您需要创建一个QSerialPort对象,并设置其串口号。
串口号可以通过setPortName()方法进行设置,例如:QSerialPort serialPort;serialPort.setPortName("COM1"); // 设置串口号为COM1接下来,您可以设置其他串口参数,例如波特率、数据位、校验位和停止位等。
这些参数可以通过setBaudRate()、setDataBits()、setParity()和setStopBits()等方法进行设置。
例如,设置波特率为9600、数据位为8、无校验位和一个停止位的代码如下:serialPort.setBaudRate(QSerialPort::Baud9600); // 设置波特率为9600serialPort.setDataBits(QSerialPort::Data8); // 设置数据位为8serialPort.setParity(QSerialPort::NoParity); // 设置无校验位serialPort.setStopBits(QSerialPort::OneStop); // 设置一个停止位除了上述参数,您还可以设置流控制、超时和缓冲区大小等参数,具体方法请参考Qt官方文档。
ms-help://MS.VSCC.v80/MS.MSDN.v80/DEVFX.v20.chs/cpref8/html/T_System_IO_P orts_SerialPort_Members.htm//串口控件一.概述在Visual Studio 6.0中编写串口通讯程序,一般都使用Microsoft Communication Control(简称MSComm)的通讯控件,只要通过对此控件的属性和事件进行相应编程操作,就可以轻松地实现串口通讯。
但在技术广泛应用的今天,Visual 没有将此控件加入控件库,所以人们采用了许多方法在Visual 来编写串口通讯程序:第一种方法是通过采用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。
在WinForms中,`SerialPort`类用于与串行端口进行通信。
要使用`SerialPort`的`ReadByte`方法从串行端口读取一个字节,您可以按照以下步骤进行操作:首先,确保您已经在WinForms应用程序中引用了`System.IO.Ports`命名空间。
接下来,您可以在您的代码中实例化`SerialPort`对象,并打开串行端口。
以下是一个简单的示例:using System;using System.IO.Ports;namespace SerialPortExample{class Program{static void Main(string[] args){SerialPort serialPort = new SerialPort("COM1", 9600); // 创建一个SerialPort对象,指定串行端口和波特率serialPort.Open(); // 打开串行端口int data = serialPort.ReadByte(); // 读取一个字节的数据Console.WriteLine("Received data: " + data); // 输出接收到的数据serialPort.Close(); // 关闭串行端口}}}在这个示例中,我们首先创建了一个`SerialPort`对象,并指定了串行端口和波特率。
接着,我们使用`Open`方法打开串行端口,并使用`ReadByte`方法从串行端口读取一个字节的数据。
最后,我们输出接收到的数据,并使用`Close`方法关闭串行端口。
请注意,上述示例是一个控制台应用程序示例。
在WinForms应用程序中,您可以将相同的代码放在事件处理程序中,例如在按钮点击事件中读取串行端口数据,并在界面上显示。
您还需要确保在使用串行端口时处理异常和资源释放,以确保程序的稳定性和可靠性。
VB,C# MSComm控件的用法与详细介绍MSComm 是控件MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。
MSComm控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API 函数,而且在VC、VB、Delphi与C#等语言中均可使用。
Microsoft Communications Control(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。
具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。
1.MSComm控件两种处理通讯的方式MSComm控件提供下列两种处理通讯的方式:事件驱动方式和查询方式。
1.1 事件驱动方式事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。
在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者 Carrier Detect (CD) 或 Request To Send (RTS) 线上一个字符到达或一个变化发生时。
在这些情况下,可以利用 MSComm 控件的 OnComm 事件捕获并处理这些通讯事件。
OnComm 事件还可以检查和处理通讯错误。
所有通讯事件和通讯错误的列表,参阅 CommEvent 属性。
在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。
这种方法的优点是程序响应及时,可靠性高。
每个MSComm 控件对应着一个串行端口。
如果应用程序需要访问多个串行端口,必须使用多个MSComm 控件。
1.2 查询方式查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。
在程序的每个关键功能之后,可以通过检查 CommEvent 属性的值来查询事件和错误。
如果应用程序较小,并且是自保持的,这种方法可能是更可取的。
例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。
C++中的SerialPort用法一、概述在C++编程中,SerialPort(串口)是一种常用的通信方式。
它可以用于连接各种外部设备,进行数据传输和通信。
本文将详细介绍在C++中如何使用SerialPort,并且通过实例演示其用法。
二、SerialPort的基本概念1. 串口是一种通过串行通信接口进行数据传输的设备,它通过一根线缆(串口线)进行数据传输。
2. 串口通信有多种标准,如RS-232、RS-485等,不同的标准有不同的电气特性和数据传输速率。
3. 在C++中,可以使用串口库来实现串口通信,常见的串口库有Boost.Asio、Qt SerialPort等。
三、使用Boost.Asio进行串口通信Boost.Asio是一个开源的C++库,用于实现异步I/O操作。
它提供了丰富的网络和串口通信功能,可以方便地进行串口通信开发。
1. 安装Boost库在使用Boost.Asio之前,首先需要安装Boost库。
可以从Boost全球信息站(网络协议sxxx)下载最新版本的Boost库,并按照全球信息站提供的安装说明进行安装。
2. 创建SerialPort对象在C++中使用Boost.Asio库进行串口通信,首先需要创建一个SerialPort对象,并指定串口名称、波特率等参数。
```c++#include <boost/asio.hpp>using namespace boost::asio;// 创建SerialPort对象io_service io;serial_port serial(io, "COM1"); // 指定串口名称serial.set_option(serial_port::baud_rate(9600)); // 设置波特率```3. 读写串口数据创建好SerialPort对象之后,即可通过它进行串口数据的读写操作。
```c++// 向串口写入数据std::string write_data = "Hello, SerialPort!";write(serial, buffer(write_data));// 从串口读取数据char read_data[100];size_t len = read(serial, buffer(read_data, 100));```4. 异步串口通信Boost.Asio库支持异步串口通信,可以通过回调函数处理串口数据的读写操作。
SerialPort类的⽤法与⽰例Microsoft .Net框架SerialPort类的⽤法与⽰例从Microsoft .Net 2.0版本以后,就默认提供了System.IO.Ports.SerialPort类,⽤户可以⾮常简单地编写少量代码就完成串⼝的信息收发程序。
本⽂将介绍如何在PC端⽤C# .Net 来开发串⼝应⽤程序。
1. 串⼝硬件信号定义DB9 Connector 信号定义针脚信号定义作⽤1DCD载波检测Received Line Signal Detector(Data Carrier Detect)2RXD接收数据Received Data3TXD发送数据Transmit Data4DTR数据终端准备好Data Terminal Ready5SGND信号地Signal Ground6DSR数据准备好Data Set Ready7RTS请求发送Request To Send8CTS清除发送Clear To Send9RI振铃提⽰Ring Indicator2. 串⼝端⼝号搜索⼀个最简单的办法:string[] portList = System.IO.Ports.SerialPort.GetPortNames();for (int i = 0; i < portList.Length; i++){string name = portList[i];comboBox.Items.Add(name);}还有⼀种通过调⽤API的⽅法来获取实现,可以获取详细的完整串⼝名称,对于USB-to-COM虚拟串⼝来说特别适⽤。
通过下⾯程序可以获取到与设备管理器中⼀样的名字,例如“Prolific USB-to-Serial Comm Port(COM34)”,⽽上⾯的⽅法只能获取到“COM34”。
/// <summary>/// 枚举win32 api/// </summary>public enum HardwareEnum{// 硬件Win32_Processor, // CPU 处理器Win32_PhysicalMemory, // 物理内存条Win32_Keyboard, // 键盘Win32_PointingDevice, // 点输⼊设备,包括⿏标。
ms-help://MS.VSCC.v80/MS.MSDN.v80/DEVFX.v20.chs/cpref8/html/T_System_IO_P orts_SerialPort_Members.htm//串口控件一.概述在Visual Studio 6.0中编写串口通讯程序,一般都使用Microsoft Communication Control(简称MSComm)的通讯控件,只要通过对此控件的属性和事件进行相应编程操作,就可以轻松地实现串口通讯。
但在技术广泛应用的今天,Visual 没有将此控件加入控件库,所以人们采用了许多方法在Visual 来编写串口通讯程序:第一种方法是通过采用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,不是mPort的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 控件一样的作用。
C# SerialPort运行方式SerialPort中串口数据的读取与写入有较大的不同。
由于串口不知道数据何时到达,因此有两种方法可以实现串口数据的读取。
一、线程实时读串口;二、事件触发方式实现。
由于线程实时读串口的效率不是十分高效,因此比较好的方法是事件触发的方式。
在SerialPort 类中有DataReceived事件,当串口的读缓存有数据到达时则触发DataReceived事件,其中SerialPort.ReceivedBytesThreshold属性决定了当串口读缓存中数据多少个时才触发DataReceived事件,默认为1。
另外,SerialPort.DataReceived事件运行比较特殊,其运行在辅线程,不能与主线程中的显示数据控件直接进行数据传输,必须用间接的方式实现。
如下:SerialPort spSend; //spSend,spReceive用虚拟串口连接,它们之间可以相互传输数据。
spSend 发送数据SerialPort spReceive; //spReceive接受数据TextBox txtSend; //发送区TextBox txtReceive; //接受区Button btnSend; //数据发送按钮delegate void HandleInterfaceUpdateDelegate(string text); //委托,此为重点HandleInterfaceUpdateDelegate interfaceUpdateHandle;public void InitClient() //窗体控件已在初始化{interfaceUpdateHandle = new HandleInterfaceUpdateDelegate(UpdateTextBox); //实例化委托对象spSend.Open(); //SerialPort对象在程序结束前必须关闭,在此说明spReceive.DataReceived += Ports.SerialDataReceivedEventHandler(spReceive_DataReceive d);spReceive.ReceivedBytesThreshold = 1;spReceive.Open();}public void btnSend_Click(object sender,EventArgs e){spSend.WriteLine(txtSend.Text);}public void spReceive_DataReceived(object sender,Ports.SerialDataReceivedEventArgs e) {byte[] readBuffer = new byte[spReceive.ReadBufferSize];spReceive.Read(readBuffer, 0, readBuffer.Length);this.Invoke(interfaceUpdateHandle, new string[] { Encoding.Unicode.GetString(readBuffer) });}private void UpdateTextBox(string text){txtReceive.Text = text;}点评:这个例子包括了这个控件几乎所有的操作,非常有参考价值.serialPort是在.net framework2.0中才有的东西,感觉这个东西和MSCOMM很相似.这里给出的例子是基于和CSHAPE的,相应的可以在Cshape和c++中使用,基本上都是一样的.Imports SystemImports System.IO.PortsImports System.ThreadingPublic Class PortChatShared _continue As BooleanShared _serialPort As SerialPortPublic Shared Sub Main()Dim name As StringDim message As StringDim sComparer As StringComparer =StringComparer.OrdinalIgnoreCaseDim readThread As Thread =New Thread(AddressOf Read)' Create a new SerialPort object with default settings._serialPort =New SerialPort()' Allow the user to set the appropriate properties._serialPort.PortName =SetPortName(_serialPort.PortName)_serialPort.BaudRate =SetPortBaudRate(_serialPort.BaudRate)_serialPort.Parity = SetPortParity(_serialPort.Parity)_serialPort.DataBits =SetPortDataBits(_serialPort.DataBits)_serialPort.StopBits =SetPortStopBits(_serialPort.StopBits)_serialPort.Handshake =SetPortHandshake(_serialPort.Handshake)' Set the read/write timeouts_serialPort.ReadTimeout = 500_serialPort.WriteTimeout = 500_serialPort.Open()_continue =TruereadThread.Start()Console.Write("Name: ")name = Console.ReadLine()Console.WriteLine("Type QUIT to exit")While(_continue)message = Console.ReadLine()If sComparer.Equals("quit", message)Then_continue =FalseElse_serialPort.WriteLine( _String.Format("<{0}>: {1}", name, message)) End Ifend whilereadThread.Join()_serialPort.Close()End SubPublic Shared Sub Read()While(_continue)TryDim message As String= _serialPort.ReadLine() Console.WriteLine(message)Catch ex As TimeoutException' Do nothingEnd TryEnd WhileEnd SubPublic Shared Function SetPortName(ByVal defaultPortName As String)As StringDim newPortName As StringConsole.WriteLine("Available Ports:")Dim s As StringFor Each s In SerialPort.GetPortNames()Console.WriteLine(" {0}", s)Next sConsole.Write("COM port({0}): ", defaultPortName)newPortName = Console.ReadLine()If newPortName =""ThennewPortName = defaultPortNameEnd IfReturn newPortNameEnd FunctionPublic Shared Function SetPortBaudRate(ByVal defaultPortBaudRate As Integer)As IntegerDim newBaudRate As StringConsole.Write("Baud Rate({0}): ", defaultPortBaudRate) newBaudRate = Console.ReadLine()If newBaudRate =""ThennewBaudRate = defaultPortBaudRate.ToString() End IfReturn Integer.Parse(newBaudRate)End FunctionPublic Shared Function SetPortParity(ByVal defaultPortParity As Parity)As ParityDim newParity As StringConsole.WriteLine("Available Parity options:")Dim s As StringFor Each s In[Enum].GetNames(GetType(Parity))Console.WriteLine(" {0}", s)Next sConsole.Write("Parity({0}):",defaultPortParity.ToString())newparity = Console.ReadLine()If newparity =""Thennewparity = defaultPortParity.ToString()End IfReturn CType([Enum].Parse(GetType(Parity), newParity), Parity)End FunctionPublic Shared Function SetPortDataBits(ByVal defaultPortDataBits As Integer)As IntegerDim newDataBits As StringConsole.Write("Data Bits({0}): ", defaultPortDataBits) newDataBits = Console.ReadLine()If newDataBits =""ThennewDataBits = defaultPortDataBits.ToString() End IfReturn Integer.Parse(newDataBits)End FunctionPublic Shared Function SetPortStopBits(ByValdefaultPortStopBits As StopBits)As StopBitsDim newStopBits As StringConsole.WriteLine("Available Stop Bits options:") Dim s As StringFor Each s In[Enum].GetNames(GetType(StopBits)) Console.WriteLine(" {0}", s)Next sConsole.Write("Stop Bits({0}):", defaultPortStopBits.ToString())newStopBits = Console.ReadLine()If newStopBits =""ThennewStopBits = defaultPortStopBits.ToString() End IfReturn CType([Enum].Parse(GetType(StopBits), newStopBits), StopBits)End FunctionPublic Shared Function SetPortHandshake(ByVal defaultPortHandshake As Handshake)As HandshakeDim newHandshake As StringConsole.WriteLine("Available Handshake options:") Dim s As StringFor Each s In[Enum].GetNames(GetType(Handshake)) Console.WriteLine(" {0}", s)Thread readThread =new Thread(Read);// Create a new SerialPort object with default settings. _serialPort =new SerialPort();// Allow the user to set the appropriate properties._serialPort.PortName =SetPortName(_serialPort.PortName);_serialPort.BaudRate =SetPortBaudRate(_serialPort.BaudRate);_serialPort.Parity = SetPortParity(_serialPort.Parity); _serialPort.DataBits =SetPortDataBits(_serialPort.DataBits);_serialPort.StopBits =SetPortStopBits(_serialPort.StopBits);_serialPort.Handshake =SetPortHandshake(_serialPort.Handshake);// Set the read/write timeouts_serialPort.ReadTimeout = 500;_serialPort.WriteTimeout = 500;_serialPort.Open();_continue =true;readThread.Start();Console.Write("Name: ");name =Console.ReadLine();Console.WriteLine("Type QUIT to exit");while(_continue){message=Console.ReadLine();if(stringComparer.Equals("quit",message)){_continue =false;}else{_serialPort.WriteLine(String.Format("<{0}>: {1}",name,message));}}readThread.Join();_serialPort.Close();}public static void Read(){while(_continue){try{string message= _serialPort.ReadLine();Console.WriteLine(message);}catch(TimeoutException){}}}public static string SetPortName(string defaultPortName){string portName;Console.WriteLine("Available Ports:");foreach(string s in SerialPort.GetPortNames()){Console.WriteLine(" {0}", s);}Console.Write("COM port({0}): ", defaultPortName);portName =Console.ReadLine();if(portName ==""){portName = defaultPortName;}return portName;}public static int SetPortBaudRate(int defaultPortBaudRate){string baudRate;Console.Write("Baud Rate({0}): ", defaultPortBaudRate); baudRate =Console.ReadLine();if(baudRate ==""){baudRate = defaultPortBaudRate.ToString();}return int.Parse(baudRate);}public static Parity SetPortParity(Parity defaultPortParity) {string parity;Console.WriteLine("Available Parity options:");foreach(string s in Enum.GetNames(typeof(Parity))){Console.WriteLine(" {0}", s);}Console.Write("Parity({0}):",defaultPortParity.ToString());parity =Console.ReadLine();if(parity =="")parity = defaultPortParity.ToString();}return(Parity)Enum.Parse(typeof(Parity), parity);}public static int SetPortDataBits(int defaultPortDataBits) {string dataBits;Console.Write("Data Bits({0}): ", defaultPortDataBits); dataBits =Console.ReadLine();if(dataBits ==""){dataBits = defaultPortDataBits.ToString();}return int.Parse(dataBits);}public static StopBits SetPortStopBits(StopBits defaultPortStopBits){string stopBits;Console.WriteLine("Available Stop Bits options:");foreach(string s in Enum.GetNames(typeof(StopBits)))Console.WriteLine(" {0}", s);}Console.Write("Stop Bits({0}):", defaultPortStopBits.ToString());stopBits =Console.ReadLine();if(stopBits ==""){stopBits = defaultPortStopBits.ToString();}return(StopBits)Enum.Parse(typeof(StopBits), stopBits);}public static Handshake SetPortHandshake(Handshake defaultPortHandshake){string handshake;Console.WriteLine("Available Handshake options:");foreach(string s in Enum.GetNames(typeof(Handshake))){Console.WriteLine(" {0}", s);}Console.Write("Stop Bits({0}):",SerialPort类的源代码已经放在下面,SerialPort类是由Remon Spekreijse提供的免费串口类。