计者,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.WriteTextSendData.Text 4 添加接受事件 Private Sub SpCom_DataReceivedByVal sender As Object ByVal e As System.IO.Ports.SerialDataReceivedEventArgs Handles SpCom.DataReceived 5 读取数据 Dim strT As String 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.WriteTextSendData.Text 4 添加接受事件 private void serialPortCom2_DataReceivedobject sender System.IO.Ports.SerialDataReceivedEventArgs e 5 读取数据 String strT strTSpCom.ReadExisting2.以类的方式
VB: 1 定义 SerialPort 类实例 Dim SpCom As New System.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 或是定义时直接初始化 Dim SpCom As New System.IO.Ports.SerialPortCOM1 9600 IO.Ports.Parity.Even8 IO.Ports.StopBits.None 3 发送数据 SpCom.WriteTextSendData.Text 4 添加接受事件 a 在运行时将事件与事件处理程序相关联 AddHandler SpCom.DataReceived AddressOf EventReceiveData 说明: AddressOf 创建引用特定过程的过程委托实例 AddressOf 运算符可以用作委托构造函数的操作数,或可以用在编译器能够确定委 托 类型的上下文中。
b 添加事件处理程序(签名一定要一致) Sub EventReceiveDataByVal sender As Object ByVal e As System.IO.Ports.SerialDataReceivedEventArgs 5 读取数据 Dim strT As String strT SpCom.ReadExisting C#: 1 添加引用 using System.IO.Ports 2 定义 SerialPort 类实例 private SerialPort SpCom2 new SpCom COM2 9600Parity.None 8 StopBits.On e 3 设置通讯端口号及波特率、数据位、停止位和校验位。
SpCom.PortName COM1 SpCom.BaudRate 9600 SpCom.Parity IO.Ports.Parity.None SpCom.DataBits 8 SpCom.StopBits IO.Ports.StopBits.One 或是定义时直接初始化 private SerialPort SpCom2 new SpCom COM2 9600Parity.None 8 StopBits.One 4 发送数据 SpCom.WriteTextSendData.Text 5 添加接受事件 a 在运行时将事件与事件处理程序相关联(通过委托实现) SpCom.DataReceived new SerialDataReceivedEventHandlerSpCom2_DataReceived 说明: SerialDataReceivedEventHandler 委托 表示将处理 SerialPort 对象的 DataReceived 事件的方法 b 添加事件处理程序(签名一定要一致) private void SpCom_DataReceivedobject sender SerialDataReceivedEventArgs e 6 读取数据 string data SpCom .ReadExisting3.委托方法的使用
VB: 1 声明委托 Delegate Sub myMethodDelegateByVal text As String 任何具有匹配参数类型和返回类型的过程均可用来创建此委托类的实例。
然后就可以通 过委托实例来调用过程。
2 定义一个委托实例 Dim myD1 As New myMethodDelegateAddressOf myShowStringMethod 3 定义一个实例方法 Sub myShowStringMethodByVal myString As String 4 调用 myD1strData InvokemyD1 strData Invoke 提供对某一对象公开的属性和方法的访问。
C#: 1 声明委托 delegate void HandleInterfaceUpdateDelegatestring text 表示委托,委托是一种数据结构,它引用静态方法或引用类实例及该类的实例方法。
2 定义一个委托实例并实例化委托对象 HandleInterfaceUpdateDelegate interfaceUpdateHandle interfaceUpdateHandle new HandleInterfaceUpdateDelegateUpdateReceiveTextBox 3 定义一个实例方法 private void UpdateReceiveTextBoxstring text 4 调用 InvokeinterfaceUpdateHandle data Invoke 提供对某一对象公开的属性和方法的访问。
4.ClassLibrary 的使用
VB:1 建立一个 ClassLibrary 项目。
在“文件”菜单上,选择“新建项目”,在“新建项目” 对话框的“模板”窗格中,单击“类库”。
类库名为 Persons类名改为 Player。
2 添加属性。
a 方法一 Public Alive As Boolean b 方法二 Private nameValue As String Public Property Name As String Get Name nameValue End Get SetByVal value As String nameValue value End Set End Property3 添加方法。
Public Function FullName As String … End Function4 添加事件。
a 声明 Event AnEventByVal EventNumber As Integer b 触发事件 RaiseEvent AnEvent55 类库的使用。
a 声明类库对象。
Dim Player1 As New Persons.Player b 属性使用。
Player1.Alive true Player1.Name Andrew c 方法使用。
Dim strT As String strT player1.FullName d 事件使用。
AddHandler Player1.AnEvent AddressOf person1_AnEvent Private Sub Player1_AnEventByVal p As Integer MsgBoxPlayer1.Name is alive End SubC:1 建立一个 ClassLibrary 项目。
在“文件”菜单上,选择“新建项目”,在“新建项目” 对话框的“模板”窗格中,单击“类库”。
类库名为 ClassLibraryPersons类名改为 Cl assPerson。
2 添加属性。
c 方法一 Public bool Alive d 方法二 private double seconds public double Hours get return seconds / 3600 set seconds value 3600 3 添加方法。
public void ShowYearobject sender EventArgs e seconds 5 4 添加事件。
a 定义委托(与 ClassPerson 平级) public delegate void SampleEventDelegateobject sender EventArgs e b 声明 public event SampleEventDelegate SampleEvent c 触发事件 SampleEventthis e5 类库的使用。
a 声明类库对象。
private ClassLibraryPersons.ClassPerson clPersonsnew ClassLibraryPersons.ClassPerson b 属性使用。
clPersons.Alive true clPersons.Hours 3 c 方法使用。
clPersons.ShowYearsender e d 事件使用。
clPersons.SampleEvent new ClassLibraryPersons.SampleEventDelegate clPersons_SampleEvent private void clPersons_SampleEventobject sender EventArgs e … 5.WindowsControlLibrary 的使用
VB: 1 建立一个 WindowsClassLibrary 项目。
在“文件”菜单上,选择“新建项目”,在“新建 项目”对话框的“模板”窗格中,单击“Windows 控件库”。
控件库名为 NamesControl 类名改为 NamesUserControl。
2 添加属性。
a 方法一 Public Alive As Boolean b 方法二 Private nameValue As String Public Property Name As String Get Name nameValue End Get SetByVal value As String nameValue value End Set End Property 3 添加方法。
( Public Function FullName As String … End Function 4 添加事件。
a 声明 Event AnEventByVal EventNumber As Integer b 触发事件 RaiseEvent AnEvent5 5 控件的使用。
a 添加控件。
工具箱鼠标右键-选择项-.NetFrameWork 组件-浏览-选择要添加的控件-确定 -在工具箱上选择控件-添加到窗体上 b 属性使用。
Player1.Alive true Player1.Name Andrew c 方法使用。
Dim strT As String strT player1.FullName d 事件使用(属性中选择事件直接添加事件)。
Private Sub NamesUserControl1_AnEventByVal EventNumber As System.Int32 Handl es NamesUserControl1.AnEvent End SubC:1 建立一个 WindowsClassLibrary 项目。
在“文件”菜单上,选择“新建项目”,在“新建 项目”对话框的“模板”窗格中,单击“Windows 控件库”。
控件库名为 WindowsContr olLibraryPersons类名改为 UserControl1。
2 添加属性。
Public bool Alive (无效) private double seconds public double Hours get return seconds / 3600 set seconds value 3600 3 添加方法。
public void ShowYearobject sender EventArgs e seconds 5 4 添加事件。
a 定义委托(与 ClassPerson 平级) public delegate void SampleEventDelegateobject sender EventArgs e b 声明 public event SampleEventDelegate SampleEvent c 触发事件 SampleEventthis e5 类库的使用。
a 添加控件。
工具箱鼠标右键-选择项-.NetFrameWork 组件-浏览-选择要添加的控件-确定 -在工具箱上选择控件-添加到窗体上 b 属性使用。
userControl11.Hours 8 c 方法使用。
userControl11.ShowYear d 事件使用(属性中选择事件直接添加事件)。
private void userControl11_SampleEventobject sender EventArgs e … 四、 几种方法试验测试1. 中文以及中文特殊字符不能识别2. 在同一台计算机上以 1ms 速度向 Com1 发送字符串(包括英文字母,数字和特殊符号),在 Com2 串口接受(Com1 和 Com2 通过 WF19 相连),测试时间为 30 分钟,接受字符串无丢失无乱码。
(c pu 1.8 内存 512)3. 采用全局变量实现在当收到完整的一条数据,返回主线程在窗体上显示,发送字符串速度大于 100 ms 时,测试时间为 30 分钟,显示接受的字符串没有问题;当发送速度时 50ms,80ms 时,显示接受 字符串有丢失现象。
(cpu 1.8 内存 512)4. 通过 SerialPort 传输数据时处理 ErrorReceived 事件以检测和响应错误。