SerialPort控件的使用
VisualStudio2005中serialPort控件访问串口实例

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。
SerialPort发送与接收16进制数据

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。
SearialPort上位机实战经验

上位机实战经验 '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 如何接收数据接收数据比发送数据要复杂一些。
1C# SERIALPORT串口控件的使用

BaudRate
获取或设置串行波特率
BreakState
获取或设置中断信号状态
BytesToRead
获取接收缓冲区中数据的字节数
BytesToWrite
获取发送缓冲区中数据的字节数
CDHolding
获取端口的载波检测行的状态
CtsHolding
获取“可以发送”行的状态
DataBits
获取或设置每个字节的标准数据位长度
注意:用跳线使串口的第2、3针连接,可以在本地计算机上实现串口通信,所以,通过 串口的第2、3针的连接可以对程序进行检测。串口截面图如图13.2所示。
图13.2 串口截面图
实现过程
(1)新建一个项目,命名为 Ex13_01,默认窗体为 Form1。 (2)在 Form1窗体中,主要添加两个 Button 控件,分别用于执行发送数据和接受数据,添加 两个 TextBox 控件,用于输入发送数据和显示接收数据。 (3)主要程序代码。
DiscardNull
获取或设置一个值,该值指示 Null 字节在端口和接收缓冲区之 间传输时是否被忽略
DsrHolding
获取数据设置就绪 (DSR) 信号的状态
DtrEnable
获取或设置一个值,该值在串行通信过程中启用数据终端就绪 (DTR) 信号
Encoding
获取或设置传输前后文本转换的字节编码
的解决方式。
来源地:/jackeyrain/blog/item/f4e3ef1fa3272fcea68669c6.html
C# SerialPort 串口控件的使用 2010-10-27 11:07
现在大多数硬件设备均采用串口技术与计算机相连,因此串口的应用程序开发越来越 普遍。例如,在计算机没有安装网卡的情况下,将本机上的一些信息数据 传输到另一台计算 机上,那么利用串口通信就可以实现。运行本程序,在“发送数据”文本框中输入要传送的数 据,单击【发送】按钮,将传送的数据发送到所选择 的端口号中;单击【接收】按钮,传递 的数据被接收到“接收数据”文本框中。如图13.1所示。
qserialport用法

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官方文档。
SerialPort控件的使用

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。
winform serialport.readbyte用法

在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应用程序中,您可以将相同的代码放在事件处理程序中,例如在按钮点击事件中读取串行端口数据,并在界面上显示。
您还需要确保在使用串行端口时处理异常和资源释放,以确保程序的稳定性和可靠性。
SerialPort与MSComm 详解

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(串口)是一种常用的通信方式。
它可以用于连接各种外部设备,进行数据传输和通信。
本文将详细介绍在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类的用法与示例

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, // 点输⼊设备,包括⿏标。
serial_port 用法

一、什么是串口串口是计算机与外部设备进行数据通信的一种接口,通过串口可以实现计算机与外部设备之间的数据传输。
通常情况下,串口包括一个发送线路和一个接收线路,用于传输数据。
串口通信可以通过物理连接或虚拟连接进行,常见的物理连接方式包括RS232,RS422和RS485等,而虚拟连接方式则包括USB转串口、蓝牙串口等。
二、串口的使用场景1. 工业控制领域在工业控制领域,串口被广泛应用于PLC(可编程逻辑控制器)、传感器、仪器仪表等设备的数据通信中。
通过串口,这些设备可以向主控计算机发送数据,或者接收主控计算机发送的控制指令,实现自动化控制。
2. 嵌入式系统开发在嵌入式系统开发中,串口通信也扮演了重要的角色。
开发人员可以通过串口与嵌入式设备进行通信,进行程序烧录、调试、数据传输等操作,方便对嵌入式设备进行控制和管理。
3. 通信设备通信设备如调制解调器、路由器等网络设备,也常使用串口进行数据传输和控制,例如通过串口进行配置、升级、诊断等操作。
4. 数据采集与监控在数据采集与监控系统中,串口可以连接各种传感器和监控设备,实现实时数据的采集和监控。
气象站、环境监测站的数据采集设备,通过串口与上位机进行数据传输。
三、串口的基本使用方法1. 串口的配置在使用串口进行通信之前,首先需要对串口进行配置,如波特率、数据位、停止位、奇偶校验等。
这些配置需要与通信的外部设备保持一致,才能够确保正常的数据传输。
2. 串口的打开和关闭在进行串口通信时,需要打开串口以建立通信连接,并在通信结束后关闭串口以释放资源,避免资源的浪费和冲突。
3. 串口的数据收发在串口通信中,数据的发送和接收是必不可少的部分。
通过串口发送数据时,需要将待发送的数据写入串口缓冲区,然后通过串口发送功能将数据发送出去;而在接收数据时,则需要通过串口接收功能从串口缓冲区中读取数据。
4. 串口的事件处理除了常规的数据收发操作,串口通信还需要处理一些事件,如串口接收到数据的事件、串口发送完成的事件等。
serialport 使用方法

serialport 使用方法(原创版3篇)目录(篇1)1.引言2.serialport 的定义和作用3.serialport 的使用方法4.serialport 的常见问题及解决方法5.结论正文(篇1)一、引言在电子设备和计算机之间的通信中,串行通信是一种常见的通信方式。
而在 Python 中,我们可以使用 pyserial 库中的 serialport 模块来实现串行通信。
本文将为大家介绍 serialport 的使用方法。
二、serialport 的定义和作用serialport,即串行端口,是计算机上的一个硬件设备,负责实现串行通信。
在 Python 中,我们可以通过 pyserial 库来操作 serialport,从而实现与外部设备的通信。
三、serialport 的使用方法1.导入库首先,我们需要导入 pyserial 库。
在命令行中输入以下命令:```pip install pyserial```然后在 Python 代码中加入以下导入语句:```pythonimport serial```2.创建串行对象使用`serial.Serial()`方法创建一个串行对象,其中参数`port`表示串行端口号,`baudrate`表示波特率,`parity`表示校验方式,`stopbits`表示停止位,`bytesize`表示数据位。
```pythonser = serial.Serial(port="COM3", baudrate=9600,parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS)```3.打开串行端口使用`ser.open()`方法打开串行端口。
如果端口打开成功,`ser.isOpen()`方法将返回 True。
```pythonif ser.isOpen():print("串行端口已打开")else:ser.open()```4.读写数据使用`ser.read()`方法从串行端口读取数据,使用`ser.write()`方法向串行端口发送数据。
C#SerialPort使用方法

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_DataReceived);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_datareceived用法

serialport_datareceived用法使用串口数据接收是在开发中经常遇到的一种情况。
无论是使用串口与外部设备进行通信,还是与其他设备进行数据交换,SerialPort类都是非常常用的工具之一。
在这篇文章中,我们将会一步一步地回答关于串口数据接收的问题,帮助读者全面了解这个主题。
第一步:了解SerialPort类在开始之前,我们首先需要对SerialPort类进行一个简单的介绍。
SerialPort 类是.NET框架提供的一个用于串行通信的类库,主要用于直接通过串口与外设进行数据交换。
通过SerialPort类,我们可以方便地发送和接收数据,监测串口的状态,并对串口进行各种设置。
第二步:初始化SerialPort对象在开始接收数据之前,我们需要首先初始化一个SerialPort对象。
我们可以通过以下步骤来完成初始化:1. 引入命名空间:在代码文件的开头,我们需要引入命名空间System.IO.Ports,这个命名空间提供了SerialPort类的定义。
2. 创建SerialPort对象:我们可以使用关键字new来实例化一个SerialPort对象,并指定串口号和波特率等参数。
3. 配置串口参数:通过SerialPort对象的属性,我们可以对串口进行各种设置,如波特率、数据位、停止位、奇偶校验等。
第三步:设置数据接收事件接下来,我们需要设置一个数据接收事件,以便在接收到数据时进行相应的操作。
在SerialPort类中,有一个名为DataReceived的事件,它会在接收到数据时触发。
通过订阅这个事件,我们就可以在数据到达时执行自定义的处理函数。
1. 创建事件处理函数:首先,我们需要创建一个事件处理函数,用于处理接收到的数据。
这个函数可以是一个无返回值的方法,接受两个参数:一个是触发事件的对象,另一个是包含事件数据的EventArgs对象。
2. 订阅DataReceived事件:通过将事件处理函数与DataReceived事件进行绑定,我们可以在数据接收到时自动触发事件处理函数。
flutter_libserialport用法

7-30-14-flutter_libserialport用法flutter_libserialport 是一个Flutter插件,用于在Flutter 应用程序中与串口通信。
该插件提供了一种与串口设备进行交互的方法,可以用于读取和写入串口数据。
以下是使用flutter_libserialport 插件的基本用法:添加插件依赖:首先,在你的Flutter项目中,需要将 flutter_libserialport 插件添加为依赖项。
你可以在项目的 pubspec.yaml 文件中进行如下配置:dependencies:flutter:sdk: flutterflutter_libserialport: ^latest_version然后,在终端中运行 flutter pub get 来安装插件。
导入插件:在你的Flutter Dart 代码中导入插件:import'package:flutter_libserialport/flutter_libserialport.dart';列出可用的串口设备:使用SerialPort.listPortNames() 函数来列出可用的串口设备:List<String> portNames = await SerialPort.listPortNames();print('Available Serial Ports: $portNames');打开串口设备:使用 SerialPort.open() 函数来打开串口设备,指定串口设备名称和波特率:String portName = '/dev/ttyUSB0'; // 串口设备名称int baudRate = 9600; // 波特率SerialPort serialPort = SerialPort(portName, baudRate);await serialPort.open();读取和写入数据:你可以使用 serialPort.read() 函数来读取从串口设备接收的数据,并使用 serialPort.write() 函数将数据写入串口设备:// 读取数据String data = await serialPort.read();// 写入数据String dataToSend = 'Hello, Serial Port!';await serialPort.write(dataToSend);关闭串口设备:使用 serialPort.close() 函数来关闭串口设备连接:await serialPort.close();以上是使用 flutter_libserialport 插件的基本用法。
VisualStudio2005中serialPort控件访问串口实例

VisualStudio2005中serialPort控件访问串口实例点评:这个例子包括了这个控件几乎所有的操作,非常有参考价值.serialPort 是在.net framework2.0中才有的东西,感觉这个东西和MSCOMM很相似.这里给出的例子是基于和C-SHAPE的,相应的可以在Cshape和c++中使用,基本上都是一样的.VisualStudio2005中serialPort控件访问串口实例[转载]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.OrdinalI gnoreCaseDim 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.BaudRat e)_serialPort.Parity=SetPortParity(_serialPort.Parity)_serialPort.DataBits=SetPortDataBits(_serialPort.DataBit s)_serialPort.StopBits=SetPortStopBits(_serialPort.StopBit s)_serialPort.Handshake=SetPortHandshake(_serialPort.Hands hake)'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 A s 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 defaultPortBau dRate 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 defaultPortParit y 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),newParit y),Parity)End FunctionPublic Shared Function SetPortDataBits(ByVal defaultPortDat aBits 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(ByVal defaultPortSto pBits 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.ToSt ring())newStopBits=Console.ReadLine()If newStopBits=""ThennewStopBits=defaultPortStopBits.ToString()End IfReturn CType([Enum].Parse(GetType(StopBits),newStopBit s),StopBits)End FunctionPublic Shared Function SetPortHandshake(ByVal defaultPortHa ndshake 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)Next sConsole.Write("Stop Bits({0}):",defaultPortHandshake.ToS tring())newHandshake=Console.ReadLine()If newHandshake=""ThennewHandshake=defaultPortHandshake.ToString()End IfReturn CType([Enum].Parse(GetType(Handshake),newHandsh ake),Handshake)End FunctionEnd Class。
C#SerialPort串口的简单使用

C#SerialPort串⼝的简单使⽤注:只要扫码枪设备都连接成功这段代码才可以使⽤如果不使⽤SerialPort控件可以这样写最后获取扫码的结果放在textbox控件上有扫码枪的可以试⼀下using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.IO.Ports;using System.Linq;using System.Text;using System.Threading;using System.Windows.Forms;namespace串⼝Dome{public partial class Form1 : Form{public Form1(){InitializeComponent();}//声明⼀个串⼝public static SerialPort _serialPort;public void setPort(string portName, int baudRate){//实例化⼀下串⼝_serialPort = new SerialPort();this.RegisterSerialPort(portName, baudRate);if (_serialPort.IsOpen == false){_serialPort.Open();} //不⽤太关注这个我也不是很懂,只要知道他是个回调函数就可以_serialPort.DataReceived += new SerialDataReceivedEventHandler(_serialPort_DataReceived);}///<summary>///注册串⼝///</summary>///<param name="portName"></param>///<param name="baudRate"></param>public void RegisterSerialPort(string portName, int baudRate){// 串⼝名_serialPort.PortName = portName;// 波特率_serialPort.BaudRate = baudRate;// 数据位_serialPort.DataBits = 8;// 停⽌位_serialPort.StopBits = StopBits.One;// ⽆奇偶校验位_serialPort.Parity = Parity.None;}private void _serialPort_DataReceived(object senderd, SerialDataReceivedEventArgs e){//等待100ms 防⽌读取不全的情况Thread.Sleep(100);byte[] m_recvBytes = new byte[_serialPort.BytesToRead]; //获取接受缓冲区的字节数定义缓冲区的⼤⼩int result = _serialPort.Read(m_recvBytes, 0, m_recvBytes.Length);//从串⼝读取数据返回读取的字节数if (result <= 0){return;}//将字节转换成字符串//string strResult = Encoding.ASCII.GetString(m_recvBytes);string strResult = Encoding.ASCII.GetString(m_recvBytes, 0, m_recvBytes.Length);//string strResult = Encoding.UTF8..GetString();_serialPort.DiscardInBuffer();this.Invoke((EventHandler)(delegate{txtCK.Text = strResult;}));}private void Form1_Load(object sender, EventArgs e){ //参数1:串⼝(端⼝)号名称参数2:波特率setPort("COM14", 9600);}}}下⾯这个是使⽤SerialPort控件写的省略了注册串⼝的那个⽅法using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.IO.Ports;using System.Linq;using System.Text;using System.Threading;using System.Windows.Forms;namespace串⼝Dome{public partial class Form2 : Form{public Form2(){InitializeComponent();}public static SerialPort serialPort = new SerialPort();public void setPort(){if (serialPort.IsOpen==false){serialPort.Open();}serialPort.DataReceived += new SerialDataReceivedEventHandler(_serialPort_DataReceived);}private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e){//防⽌读取不全的情况等待100msThread.Sleep(100);byte[] m_recvBytes = new byte[serialPort.BytesToRead];//获取缓冲区的的字节数int reslut = serialPort.Read(m_recvBytes, 0, m_recvBytes.Length);if (reslut <= 0){return;}string strResult = Encoding.ASCII.GetString(m_recvBytes, 0, m_recvBytes.Length);//转换成字符串格式的 serialPort.DiscardInBuffer();this.Invoke((EventHandler)(delegate{TxtCode.Text = strResult;}));}private void Form2_Load(object sender, EventArgs e){var str = BarCode.PortName;int num = BarCode.BaudRate; setPort()MessageBox.Show("Name:" + str + "" + "波特率" + num);}}}后期有更好的理解和写法在补充上去增加⼀个使⽤正则表达来转换条码代码量少同第⼆个⽅法⼀样使⽤SerialPort控件在控件属性中修改对应的COM名称和波特率接下来就是代码部分public void OpenSbar(){if (serialPort1.IsOpen == false){serialPort1.Open();}serialPort1.DataReceived += new SerialDataReceivedEventHandler(SBar_DataReceived); }private void SBar_DataReceived(object sender, SerialDataReceivedEventArgs e){belCode.Text = "等待中...";Thread.Sleep(150);string str_Buff = serialPort1.ReadExisting();str_Buff = System.Text.RegularExpressions.Regex.Replace(str_Buff, @"[^0-9a-zA-Z]+", ""); //Code获取到的条码string Code = str_Buff.Trim();}。
System.IO.Ports.SerialPort串口通信接收完整数据

System.IO.Ports.SerialPort串⼝通信接收完整数据
C#中使⽤System.IO.Ports.SerialPort进⾏串⼝通信⽹上资料也很多,但都没有提及⼀些细节;
⽐如串⼝有时候并不会⼀次性把你想要的数据全部传输给你,可能会分为1次,2次,3次分别传送⼀部分数据给你,这时候⼀般会设置字符串的结束符来判定是否传输完毕(⼀般设置为\n ,\r)
传输过程中字符串的后⾯都会跟着⽆数个\0\0\0;经过同事测试,每次都从串⼝缓存中取出所有的传输数据,然后再进⾏判断,可以获取完整的字符串;代码如下:
//读取完整字符串硬件扫描枪设置传输结束符为\r
byte[] readBuffer = new byte[serialPortScan.BytesToRead];
tempCode += serialPortScan.ReadExisting().Trim( '\0' );
if ( tempCode.IndexOf( '\r' ) > 0 )
{
singleCode = tempCode.Replace( REPLACE_URL, "" ).Trim( '\r' );
serialPortScan.DiscardInBuffer();
tempCode = string.Empty;
}
else
{
return;
}
View Code。
C和串口通信方法SerialPort控件图文稿

C和串口通信方法S e r i a l P o r t控件文件管理序列号:[K8UY-K9IO69-O6M243-OL889-F88688]本例程主要讲解使用C#,实现与232串口通信。
达到采集串口数据,监控,可视化处理等。
一.概述在VisualStudio6.0中编写串口通讯程序,一般都使用MicrosoftCommunicationControl(简称MSComm)的通讯控件,只要通过对此控件的属性和事件进行相应编程操作,就可以轻松地实现串口通讯。
但在技术广泛应用的今天,没有将此控件加入控件库,所以人们采用了许多方法在来编写串口通讯程序:第一种方法是通过采用VisualStudio6.0中原来的MSComm控件这是最简单的,最方便的方法,但需要注册;第二种方法是采用微软在.NET推出了一个串口控件,基于.NET的P/Invoke调用方法实现;第三种方法是自己用API写串口通信,虽然难度高,但可以方便实现自己想要的各种功能。
现在微软推出了最新版本的VisualStudio2005开发工具,可以不再采用第三方控件的方法来设计串口通讯程序。
NETFramework2.0类库包含了SerialPort类,方便地实现了所需要串口通讯的多种功能,为了使MSComm编程方法快速转换到以SerialPort类为核心的串口通讯的设计方法,本文着重讨论了VisualStudio6.0的MSComm控件和SerialPort类设计方法的异同点。
二.SerialPort常用属性、方法和事件1.命名空间同步I/O和事件驱动的I/O、对管脚和中断状态的访问以及对串行驱动程序属性的访问,所以在程序代码起始位置需加入Using 2.串口的通讯参数串口通讯最常用的参数就是通讯端口号及通讯格式(波特率、数据位、停止位和校验位),在MSComm中相关的属性是CommPort和Settings。
SerialPort类与MSComm有一些区别:a.通讯端口号[PortName]属性获取或设置通信端口,包括但不限于所有可用的COM 端口,请注意该属性返回类型为String,不是mPort的short类型。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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提供的免费串口类。