使用SerialPort类设计串口通讯程序.docx
- 文档编号:30182929
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:20
- 大小:23.97KB
使用SerialPort类设计串口通讯程序.docx
《使用SerialPort类设计串口通讯程序.docx》由会员分享,可在线阅读,更多相关《使用SerialPort类设计串口通讯程序.docx(20页珍藏版)》请在冰豆网上搜索。
使用SerialPort类设计串口通讯程序
使用SerialPort类设计串口通讯程序
使用SerialPort类设计串口通讯程序
一.概述
在VisualStudio6.0中编写串口通讯程序,一般都使用MicrosoftCommunicationControl(简称MSComm)的通讯控件,只要通过对此控件的属性和事件进行相应编程操作,就可以轻松地实现串口通讯。
但在Microsoft.Net技术广泛应用的今天,VisualStudio.Net没有将此控件加入控件库,所以人们采用了许多方法在VisualStudio.Net来编写串口通讯程序:
第一种方法是通过采用VisualStudio6.0中原来的MSComm控件这是最简单的,最方便的方法,但需要注册;第二种方法是采用微软在.NET推出了一个串口控件,基于.NET的P/Invoke调用方法实现;第三种方法是自己用API写串口通信,虽然难度高,但可以方便实现自己想要的各种功能。
现在微软推出了最新版本的VisualStudio2005开发工具,可以不再采用第三方控件的方法来设计串口通讯程序。
NETFramework2.0类库包含了SerialPort类,方便地实现了所需要串口通讯的多种功能,为了使MSComm编程方法快速转换到以SerialPort类为核心的串口通讯的设计方法,本文着重讨论了VisualStudio6.0的MSComm控件和SerialPort类设计方法的异同点。
二.SerialPort常用属性、方法和事件
1.命名空间
System.IO.Ports命名空间包含了控制串口重要的SerialPort类,该类提供了同步I/O和事件驱动的I/O、对管脚和中断状态的访问以及对串行驱动程序属性的访问,所以在程序代码起始位置需加入UsingSystem.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类是相当容易上手的。
在进行串口通讯时,一般的流程是设置通讯端口号及波特率、数据位、停止位和校验位,再打开端口连接,发送数据,接收数据,最后关闭端口连接这样几个步骤。
数据接收的设计方法在这里比较重要,采用轮询的方法比较浪费时间,在VisualBasic中的延时方法中一般会调用API并用DOEvents方法来处理,但程序不易控制,建议采用DataReceived事件触发的方法,合理的设置ReceivedBytesThreshold的值,若接收的是定长的数据,则将ReceivedBytesThreshold设为接收数据的长度,若接收数据的结尾是固定的字符或字符串则可采用ReadTo的方法或在DataReceived事件中判断接收的字符是否满足条件。
SerialPort类读取数据的许多方法是同步阻塞调用,尽量避免在主线程中调用,可以使用异步处理或线程间处理调用这些读取数据的方法。
由于DataReceived事件在辅线程被引发,当收到完整的一条数据,返回主线程处理或在窗体上显示时,请注意跨线程的处理,C#可采用控件异步委托的方法Control.BeginInvoke及同步委托的方法Invoke。
四.结束语
在.NET平台下熟练使用SerialPort类,可以很好地开发出串口通讯类程序,对于过去使用MSComm控件设计了一些通讯程序,也可以将MSComm控件替换为SerialPort类,当然为了避免对以前的项目做大的改动,可以使用SerialPort类设计一些与MSComm控件具有相同接口的类,在今后工业控制中,SerialPort类将广泛地应用于串口通讯程序的设计中,发挥着与MSComm控件一样的作用。
相关关键词串口通讯
VB.Net串口通讯的实例
作者:
IVA 来源:
乐博网 更新时间:
2007-12-263:
03:
48
VB.Net串口通讯的实例
枚举本机可用串口的实例:
SubGetSerialPortNames()
'ShowallavailableCOMports.
ForEachspAsStringInMy.Computer.Ports.SerialPortNames
ListBox1.Items.Add(sp)
Next
EndSub
发送一个字符串到指定串口:
SubSendSerialData(ByValdataAsString)
'Sendstringstoaserialport.
Usingcom1AsIO.Ports.SerialPort=_
My.Computer.Ports.OpenSerialPort("COM1")
com1.WriteLine(data)
EndUsing
EndSub
从指定串口获取字符串并返回值:
FunctionReceiveSerialData()AsString
'Receivestringsfromaserialport.
DimreturnStrAsString=""
Usingcom1AsIO.Ports.SerialPort=_
My.Computer.Ports.OpenSerialPort("COM1")
Do
DimIncomingAsString=com1.ReadLine()
IfIncomingIsNothingThen
ExitDo
Else
returnStr&=Incoming&vbCrLf
EndIf
Loop
EndUsing
ReturnreturnStr
EndFunction
标签:
无标签
使用SerialPort类设计串口通讯程序
一.概述
输送带控制模块的核心技术是与PLC的串口通讯,在VisualStudio6.0中编写串口通讯程序,一般都使用MicrosoftCommunicationControl(简称MSComm)的通讯控件,只要通过对此控件的属性和事件进行相应编程操作,就可以轻松地实现串口通讯。
但在Microsoft.Net技术广泛应用的今天,VisualStudio.Net没有将此控件加入控件库,所以人们采用了许多方法在VisualStudio.Net来编写串口通讯程序:
第一种方法是通过采用VisualStudio6.0中原来的MSComm控件这是最简单的,最方便的方法,但需要注册;第二种方法是采用微软在.NET推出了一个串口控件,基于.NET的P/Invoke调用方法实现;第三种方法是自己用API写串口通信,虽然难度高,但可以方便实现自己想要的各种功能。
现在微软推出了最新版本的VisualStudio2005开发工具,可以不再采用第三方控件的方法来设计串口通讯程序。
NETFramework2.0类库包含了SerialPort类,方便地实现了所需要串口通讯的多种功能,为了使MSComm编程方法快速转换到以SerialPort类为核心的串口通讯的设计方法,这里着重讨论了VisualStudio6.0的MSComm控件和SerialPort类设计方法的异同点。
二.SerialPort常用属性、方法和事件
1.命名空间
System.IO.Ports命名空间包含了控制串口重要的SerialPort类,该类提供了同步I/O和事件驱动的I/O、对管脚和中断状态的访问以及对串行驱动程序属性的访问,所以在程序代码起始位置需加入UsingSystem.IO.Ports。
2.串口的通讯参数
串口通讯最常用的参数就是通讯端口号及通讯格式(波特率、数据位、停止位和校验位),在MSComm中相关的属性是CommPort和Settings。
SerialPort类与MSComm有一些区别:
✍ 通讯端口号
[PortName]属性获取或设置通信端口,包括但不限于所有可用的COM端口,请注意该属性返回类型为String,不是Mscomm.CommPort的short类型。
通常情况下,PortName正常返回的值为COM1、COM2……,SerialPort类最大支持的端口数突破了CommPort控件中CommPort属性不能超过16的限止,大大方便了用户串口设备的配置。
✍ 通讯格式
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.数据的发送和读取
SerialPort类调用重载的Write和WriteLine方法发送数据,其中WriteLine可发送字符串并在字符串末尾加入换行符,读取串口缓冲区的方法有许多,其中除了ReadExisting(读取SerialPort对象的流和输入缓冲区中所有立即可用的字节)和ReadTo(一直读取到输入缓冲区中的指定value的字符串),其余的方法都是同步调用,线程被阻塞直到缓冲区有相应的数据或大于ReadTimeOut属性设定的时间值后,引发ReadExisting异常。
5.DataReceived事件
该事件类似于MSComm控件中的OnComm事件,DataReceived事件在接收到了[ReceivedBytesThreshold]设置的字符个数或接收到了文件结束字符并将其放入了输入缓冲区时被触发。
其中[ReceivedBytesThreshold]相当于MSComm控件的[Rthreshold]属性,该事件的用法与MsComm控件的OnComm事件在CommEvent为comEvSend和comEvEof时是一致的。
三.SerialPort的使用
对于熟悉MSComm控件的程序设计者,SerialPort类是相当容易上手的。
在进行串口通讯时,一般的流程是设置通讯端口号及波特率、数据位、停止位和校验位,再打开端口连接,发送数据,接收数据,最后关闭端口连接这样几个步骤。
SerialPort类读取数据的许多方法是同步阻塞调用,尽量避免在主线程中调用,可以使用异步处理或线程间处理调用这些读取数据的方法。
由于DataReceived事件在辅线程被引发,当收到完整的一条数据,返回主线程处理或在窗体上显示时,请注意跨线程的处理,C#可采用控件异步委托的方法Control.BeginInvoke及同步委托的方法Invoke。
1.以添加控件的方式(有用户界面)
VB:
1) 从工具箱选择SerialPort控件添加到窗体上,命名为SpCom。
2) 设置通讯端口号及波特率、数据位、停止位和校验位。
SpCom.PortName="COM1"
SpCom.BaudRate=9600
SpCom.Parity=IO.Ports.Parity.None
SpCom.DataBits=8
SpCom.StopBits=IO.Ports.StopBits.One
3) 发送数据
SpCom.Write(TextSendData.Text)
4) 添加接受事件
PrivateSubSpCom_DataReceived(ByValsenderAsObject,ByValeAs
System.IO.Ports.SerialDataReceivedEventArgs)HandlesSpCom.DataReceived
5) 读取数据
DimstrTAsString
strT=SpCom.ReadExisting()
C#:
1) 从工具箱选择SerialPort控件添加到窗体上,命名为SpCom。
2) 设置通讯端口号及波特率、数据位、停止位和校验位。
SpCom.PortName="COM1";
SpCom.BaudRate=9600;
SpCom.Parity=IO.Ports.Parity.None;
SpCom.DataBits=8;
SpCom.StopBits=IO.Ports.StopBits.One;
3) 发送数据
SpCom.Write(TextSendData.Text);
4) 添加接受事件
privatevoidserialPortCom2_DataReceived(objectsender,
System.IO.Ports.SerialDataReceivedEventArgse)
5) 读取数据
StringstrT;
strT=SpCom.ReadExisting();
2.以类的方式
VB:
1) 定义SerialPort类实例
DimSpComAsNewSystem.IO.Ports.SerialPort()
2) 设置通讯端口号及波特率、数据位、停止位和校验位。
SpCom.PortName="COM1"
SpCom.BaudRate=9600
SpCom.Parity=IO.Ports.Parity.None
SpCom.DataBits=8
SpCom.StopBits=IO.Ports.StopBits.One
或是定义时直接初始化
DimSpComAsNewSystem.IO.Ports.SerialPort("COM1",9600,IO.Ports.Parity.Even,8,
IO.Ports.StopBits.None)
3) 发送数据
SpCom.Write(TextSendData.Text)
4) 添加接受事件
a) 在运行时将事件与事件处理程序相关联
AddHandlerSpCom.DataReceived,AddressOfEventReceiveData
说明:
AddressOf创建引用特定过程的过程委托实例
AddressOf运算符可以用作委托构造函数的操作数,或可以用在编译器能够确定委托类型的上下文中。
b) 添加事件处理程序(签名一定要一致)
SubEventReceiveData(ByValsenderAsObject,ByValeAs
System.IO.Ports.SerialDataReceivedEventArgs)
5) 读取数据
DimstrTAsString
strT=SpCom.ReadExisting()
C#:
1) 添加引用
usingSystem.IO.Ports;
2) 定义SerialPort类实例
privateSerialPortSpCom2=newSpCom("COM2",9600,Parity.None,8,StopBits.One);
3) 设置通讯端口号及波特率、数据位、停止位和校验位。
SpCom.PortName="COM1";
SpCom.BaudRate=9600;
SpCom.Parity=IO.Ports.Parity.None;
SpCom.DataBits=8;
SpCom.StopBits=IO.Ports.StopBits.One;
或是定义时直接初始化
privateSerialPortSpCom2=newSpCom("COM2",9600,Parity.None,8,StopBits.One);
4) 发送数据
SpCom.Write(TextSendData.Text);
5) 添加接受事件
a) 在运行时将事件与事件处理程序相关联(通过委托实现)
SpCom.DataReceived+=newSerialDataReceivedEventHandler(SpCom2_DataReceived);
说明:
SerialDataReceivedEventHandler委托表示将处理SerialPort对象的DataReceived事件的方法
b) 添加事件处理程序(签名一定要一致)
privatevoidSpCom_DataReceived(objectsender,SerialDataReceivedEventArgse)
6) 读取数据
stringdata=SpCom.ReadExisting();
3.委托方法的使用
VB:
1) 声明委托
DelegateSubmyMethodDelegate(ByVal[text]AsString)
任何具有匹配参数类型和返回类型的过程均可用来创建此委托类的实例。
然后就可以通
过委托实例来调用过程。
2) 定义一个委托实例
DimmyD1AsNewmyMethodDelegate(AddressOfmyShowStringMethod)
3) 定义一个实例方法
SubmyShowStringMethod(ByValmyStringAsString)
4) 调用
'myD1(strData)
Invoke(myD1,strData)
Invoke提供对某一对象公开的属性和方法的访问。
C#:
1) 声明委托
delegatevoidHandleInterfaceUpdateDelegate(stringtext);
表示委托,委托是一种数据结构,它引用静态方法或引用类实例及该类的实例方法。
2) 定义一个委托实例并实例化委托对象
HandleInterfaceUpdateDelegateinterfaceUpdateHandle;
interfaceUpdateHandle=newHandleInterfaceUpdateDelegate(UpdateReceiveTextBox);
3) 定义一个实例方法
privatevoidUpdateReceiveTextBox(stringtext)
4) 调用
Invoke(interfaceUpdateHandle,data);
Invoke提供对某一对象公开的属性和方法的访问。
4.ClassLibrary的使用
VB:
1) 建立一个ClassLibrary项目。
在“文件”菜单上,选择“新建项目”,在“新建项目”对话框的“模板”窗格中,单击“类库”。
类库名为Persons,类名改为Player。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 使用 SerialPort 设计 串口 通讯 程序