1、机电系统控制软件设计课程设计指导书串口通讯编程1、串口通讯的原理串口通讯是工业上常用的一种串行通讯方式,PC 机和单片机都支持, PC 机上使用的是标准的 RS232 接口,而单片机上使用的是 UART 接口。RS232 接口如下图所示:其中,针状接口是公端,眼状接口是母端,这是标准的 9 针接口。接口的定义如下表所示:一般情况下串口通讯只需要用到其中的 3 根引线,即 2 号脚 RXD,3 号脚 TXD,5 号脚信号地 SG/GND。针脚编号与端口的对应关系如下图所示:俩个设备之间如何通过串口进行通讯呢?必需使用电缆,将两台设备的串口连接起来。连接方式如下图所示:这样从物理上,这两个设备就可
2、以进行通讯了,真正实现通讯还必须编写通讯软件。2、 VB 串口编程2.1 在工程中使用串口编程控件VB 串口编程首先需要一个控件的支持,即 MSComm 控件。首先新建一个工程,在点击菜单-工程-Component,打开组件对话框,如下图所示,找到 Microsoft Comm Control 这个控件,在前面的框内打钩,然后点击确定,即可实现 MSComm 空间的安装。安装完毕后,在组件工具栏上会出现一个电话模样的图标 ,这就是我们编程中将要用的串口通讯控件。2.2 MSComm 的使用MSComm 控件提供了两种处理通信的方法:(1)事件驱动通信,是一种功能很强的处理串口活动的方法。例如,
3、当在 CD(Carrier Detect)线或 RTS(Request To Send)线上有字符到达或发生了改变,在这种情况下,可以使用 MSComm 控件的 OnComm 事件捕获和处理这些通信事件。OnComm 也可以捕获和处理通信中的错误。可以在每个重要的程序功能之后检查 CommEvent 属性的值来检测事件和通信错误。使用的每个 MSComm 控件都与一个串口对应。如果在应用程序中需要访问多个串口,必须使用多个 MSComm 控件。(2)查询法,即定期的利用 MSComm 的 Input 属性或者查询 CommEvent 的值判断是否读取到数据,并且获取已经读到的数据,注意,采用这
4、种方法有可能读到的数据为空,需要采取一定的方法重复读,或者放弃。2.3 MSComm 控件的属性 (注:必须要熟悉的几个属性CommPort:设置并返回通信端口号;Setting:以字符串的形式设置并返回数据传输速率、奇偶校验、数据比特、停止比特;PortOpen:设置并返回通信端口的状态,也可以打开和关闭端口;Input:从接收缓冲区返回和删除字符;Output:向传输缓冲区定一个字符串,其他属性一般无需理会,看不懂可以留待以后研究。) 1)CommPort 属性 void SetCommPort(short nNewValue); short GetCommPort(); 这一属性设置并返
5、回连接的串行端口号,Windows 将会利用该串口和外界通信。在设计时,nNewValue 可以设置成从 116 的任何数(默认值为 1)。但是如果用 PortOpen 属性打开一个并不存在的端口时,MSComm 控件会产生错误 68(设备无效)。 注意:必须在打开端口之前设置 CommPort 属性。 2)Settings 属性 void Settings(LPCTSTR lpszNewValue); String GetSettings(); 该属性用于设置并返回数据传输速率、奇偶校验、数据比特、停止比特参数。当端口打开时,如果 value 非法,则 MSComm 控件产生错误 380(非
6、法属性值)。其中 lpszNewValue 用字符串表示,由四个设置值组成,有如下的组成格式: “BBBB,P,D,S” BBBB 为数据传输速率,P 为奇偶校验,D 为数据比特,S 为停止比特。Value 的默认值是:“9600,N,8,1”,数据传输速率合法值可以是110、300、600、1200、2400、4800、9600、14400、19200、28800、38400、56000、57600、115200、12800、25600。 奇偶校验值可以是设置为下表的任一值。 设定值 描述 E 偶校验(EVEN) M 标号校验(MARK) N 无校验(NONE) O 奇校验(ODD) S 空
7、格校验(SPACE) 数据比特数可以是 4、5、6、7、8。 停止比特数可以是 1、1.5、2。 注意:只有当通信的双方的 Settings 属性值都一样时,通信连接才能生效。 3)Handshaking 属性 这一属性用于设置或者返回硬件握手协议,也就是 PC 和通信设备之间为了控制流速而设定的内部协议。属性值可以设置为下表中的任一个。设定值 值 描述ComNone 0 默认值,无握手协议comXOnXOff 1 XON/XOFF 握手ComRTS 2 RTS/CTS 握手comRtsXOnXOff3 RTS/CTS 和 XON/XOFF 握手皆可4)RThreshold 属性 void S
8、etRThreshold(short nNewValue); short GetRThreshold(); 在 MSComm 控件设置 CommEvent 属性为 comEvReceive 并产生 OnComm 之前,RThreshold 属性设置并返回的要接收的字符数。这里 nNewValue 是 short 型参数,说明在产生 OnComm 事件之前要接收的字符数。当接收字符后,若 RThreshold 属性设置为 0(默认值)则不会产生 OnComm 事件。否则,该属性为一阈值,当接收缓冲区内字节个数达到或超过该值后就会产生 OnComm 事件,例如,设置 RThreshold 为 1,
9、接收缓冲区收到每一个字符都会使 MSComm 控件产生 OnComm 事件。 5)CTSHolding 属性 void SetCTSHolding(BOOL bNewValue); BOOL GetCTSHolding(); 其属性设定值如下表所示。设定值 功能描述 TRUE CTS 线为高电平 FALSE CTS 线为低电平 该属性确定是否可通过查询 CTS 线的状态发送数据。CTS 是调制解调器发送到相连计算机的信号,指示传输可以进行。该属性在设计时无效,在运行时为只读。 如果 CTS 线为低电平(CTSHolding = FALSE)并且超时时,MSComm 控件设置 CommEvent
10、属性为 comEventCTSTO(Clear To Send imeout)并产生 OnComm 事件。CTS 线用于RTS/CTS 硬件握手。如果需要确定 CTS 线的状态,CTSHolding 属性给出一种手工查询方法。 6)SThreshold 属性 void SetSThreshold(short nNewValue); short GetSThreshold(); MSComm 控件设置 CommEvent 属性为 comEvSend 并产生 OnComm 事件之前,设置并返回传输缓冲区中允许的最小字符数。这里 nNewValue 是 short 型数据,代表在 OnComm 事件
11、产生之前在传输缓冲区中的最小字符数。 若设置 Sthreshold 属性为 0(默认值),数据传输事件不会产生 OnComm 事件。若设置Sthreshold 属性为 0,当传输缓冲区完全空时, MSComm 控件产生 OnComm 事件。如果在传输缓冲区的字符数小于 value,CommEvent 属性设置为 comEvSend,并产生 OnComm 事件。comEvSend 事件仅当字符数与 Sthreshold 交叉时被激活一次。例如,如果 Sthreshold等于 5,仅当在输出队列中字符数从 5 降到 4 时,comEvSend 才发生。如果在输出队列中从没有比 Sthreshold
12、 多的字符, comEvSend 事件将绝不会发生。 7)InputMode 属性 void SetInputMode(long nNewValue); long GetInputMode(); 访属性用于设置或者返回传输数据的类型。其取值和基本含义如下表所示。 设定值 值 描述 ComInputModeText(缺省) 0 通过 Input 属性以文本方式取回数据 ComInputModeBinary 1 通过 Input 属性以二进制方式取回数据 8)InputLen 属性 void SetInputLen(short nNewValue); short GetInputLen (); 该
13、属性用于设置并返回 Input 属性从接收缓冲区读取的字符数。nNewValue 是 short 型数值,说明 Input 属性从接收缓冲区中读取的字符数。 InputLen 属性的默认值是 0。当设置 InputLen 为 0 时,使用 Input 将使 MSComm 控件读取接收缓冲区中全部的内容。若接收缓冲区中 InputLen 字符无效,Input 属性返回一个零长度字符串(“”)。在使用 Input 前,用户可以选择检查 InBufferCount 属性来确定缓冲区中是否已有需要数目的字符。该属性在从输出格式为定长数据的机器读取数据时非常有用。9)InBuffersize 属性 vo
14、id SetBufferSize(short nNewValue); short GetInBufferSize(); InBuffersize 属性用于设置或返回输入缓冲区的大小,默认值为 1024 字节。 10)InBufferCount 属性 void SetInBufferCount(short nNewValue); short GetInBufferCount(); InBufferCount 属性用于返回输入缓冲区内的等待读取的字节个数,可以通过该属性值为0 来清除接收缓冲区。 11)Input 属性 VARIANT GetInput(); Input 属性表示从接收缓冲区移走一
15、串字符,将缓冲区中收到的数据读入变量。属性值为VARIAN 型变量。该属性在端口未打开时不可用,在运行时是只读的。 注意:当 InputMode 属性值 为 0 时(文本模式),变量中含 String 型数据。当 InputMode 属性值为 1(二进制模式),变量中含 Byte 型数组数据。 12)PortOpen 属性 void SetPortOpen(BOOL bNewValue); BOOL GetPortOpen(); PortOpen 属性用于打开或者关闭端口。如果 bNewValue 设为 TRUE,可以打开端口;设为FALSE 时可以关闭端口。一般情况下在程序开始时打开端口,在
16、程序结束时关闭端口。当应用程序终止时,MSComm 控件将自动关闭串口。在打开端口前,确定 CommPort 属性调协为正确的端口号。而且,用户的串口设备必须支持 Settings 属性中的设置。如果硬件设备不支持 Settings 属性中的一些设置,则硬件工作或许不正确。 13)OutBuffersize 属性 void SetOutBufferSize(short nNewValue); OutBuffersize 属性用于设置或者返回发送缓冲区的大小,值为整形表达式,表示传输缓冲区的字节数,默认值为 512 字节。对发送缓冲区设置得越大,应用程序可以使用的内存就越小。然而,如果发送缓冲区
17、太小,缓冲区将会溢出,除非使用握手协议。 14)OutBufferCounter 属性 void SetOutBufferSize(short nNewValue); short GetOutBufferSize(); OutBufferCounter 属性用于返回发送缓冲区内等待发送的字节数,可以通过设置该属性为0 来清空发送缓冲区。 15)Output 属性 void SetOutput(const VARIANT Output 属性用于向发送缓冲区写数据流。属性为 VARIANT 变量。该属性在端口未打开时不可用,在运行时只是写的。 注意:Output 属性可以发送文本数据或二进制数据。
18、传输文本数据时,应该将字符型数据放入 VARIANT 变量中;传输二进制数据(即按字节传送)时,应将字节型数据放入 VARIANT型变量中。如果通常给应用程序发送 ANSI 字符串,可以以文本方式发送。如果数据包含了内嵌控制字符、NULL 字符等,必须将其作为二进制传递过去。 16)CommEvent 属性 short GetCommEvent(); 如果在通信过程中发生错误或事件,将会引发 OnComm 事件并且改变其属性值。CommEvent属性值反映错误或者事件类型,通信的设计中可以根据该属性值执行同的操作。该属性在端口未打开时不可用,在运行时是只读的。通信错误及通信事件的设定值分别如下
19、两表所示。 通信错误设定值 设定值 值 描述 comEventBreak 1001 接收到中断信号comEventCTSTO1002 CTS 超时 comEventDSRTO1003 DSR 超时 comEventFrame1004 帧错误,硬件检测到一个帧出错,双方设置的格式不一致时,就会引发此错误 comEventOverrun1006 端口超速。一个字符没有在下一个字符到达之前被硬件读取,该字符丢失 comEventCDTO 1007 数据检测超时 comEventRxOver1008 接收缓冲区溢出 comEventRxParity1009 奇偶校验错误 comEventTxFull1
20、010 传输缓冲区溢出,表明输出缓冲区已满,不能再将字符输出到缓冲区 comEventDCB1011 检索端口、设备控制块(DCB) 时的意外错误通信事件设定值 设定值 值 描述comEvSend 1 发送事件。发送缓冲区的内容少于 SThreshold 指定的值comEvReceive 2 接收事件。接收缓冲区内字符数达到 RThreshold 值,该事件在缓冲区内数据被移走前将持续产生,利用此事件可编写接收数据的过程comEvCTS 3 CTS 线变化comEvDSR 4 DSR 线变化comEvCD 5 CD 线变化comEvRing 6 振铃检测comEvEOF 7 文件结束。接收数据
21、中出现文件结束(ASCII 码 26)字符17)DTREnable 属性 void SetDTREnable(BOOL bNewValue); BOOL GetDTREnable(); DTREnable 属性确定在通信时是否使用 DTR 线有效,DTR 是计算机发送到调制解调器的信号,表明计算机在等待数据传输。 18)RTSEnable 属性 void SetRTSEnable(BOOL bNewValue); BOOL GetRTSEnable(); RTSEnable 属性确定是否使用 RTS 线有效。一般情况下,由计算机发送 RTS 信号到连接的调制解调器,请求允许发送数据。 19)E
22、OFEnable 属性 void SetEOFEnable(BOOL bNewValue); BOOL GetEOFEnable(); EOFEnable 属性确定在输入过程中 MSComm 控件是否寻找文件结尾(EOF) 字符。如果找到EOF 字符,将停止输入并激活 OnComm 事件,此时 CommEvent 属性设置为 comEvEOF,这里 bNewValue 为布尔表达式,确定当找到 EOF 字符时,OnComm 事件是否被激活。当bNewValue 的设置值 TRUE 时,EOF 字符找到时 OnComm 事件被激活。否则当 VALUE值设为 FALSE(默认)时,EOF 字符找到
23、时 OnComm 事件不被激活。 注意:当 EOFEnable 属性设置为 FALSE 时,OnComm 控件将不在输入流中寻找 EOF 字符。 20)CDHolding 属性 void SetCDHolding(BOOL bNewValue); BOOL GetCDHolding(); 通过查询 CD 线的状态确定当前是否有传输。CD 是从调制解调器发送到相连计算机的一个信号,指示调制解调器正在联机。该属性在设计时无效,在运行时为只读。属性的设置值为:当 bNewValue 为 TRUE 时,CD 线为高电平;当 bNewValue 为 FALSE 时,CD 线为低电平。注意当 CD 线为高
24、电平(CDHolding=TRUE)且超时时,MSComm 控件设置CommEvent 属性为 comEventCDTO(CD 超时错误) ,并产生 OnComm 事件。 注意:在主机应用程序中捕获一个丢失的传输是特别重要的,例如一个公告板,因为呼叫者可以随时挂起(放弃传输)。CD 也被称为 Receive Line Signal Detect(RLSD)。 21)DSRHolding 属性 void SetDSRHolding(BOOL bNewValue); BOOL GetDSRHolding(); 确定 DSR 线的状态。 DSR 信号由调制解调器发送到相连计算机,指示作好操作准备。该
25、属性在设计时无效,在运行时为只读。DSRHolding 属性返回为 TRUE 时,表示 DSR 线高,返回 FALSE 时,表示 DSR 线低。当 DSR 线为高电平时 (DSRHolding=TRUE)超时时,MSComm 控件设置 CommEvent 属性为 comEventDSRTO(数据准备超时)并产生 OnComm事件。当为 DTE(Data Terminal Equipment)机器写 DSR/DTR 握手例程时该属性是分有用的。3、串口通讯的 VB 程序(演示)Private Sub cmdTestClick ( ) 打开串口MSComml.CommPort =2 设定 Com2
26、If MSComml.PortOpen = False ThenMSComm1.Settings = “9600,n,8,1“ 9600 波特率,无校验, 8 位数据位,1 位停止位MSComm1.PortOpen = True 打开串口End ifMSComm1.OutBufferCount = 0 清空发送缓冲区MSComm1.InBufferCount = 0 滑空接收缓冲区发送字符数据时注意必须用回车符(vbcr )结束MSComm1.Output=“This is a qood book ! “ &vbCr泼打电话号码或发送 AT 命令MSComm1.Output = “ATDT 0
27、5778191898 , & vbCr发送字符数组数据时注意 ByteArray 必须事先定义赋值Dim ByteArray as byte( )定义动态数组ReDim ByteArray(1)重定义数组大小ByteArray ( 0 ) =0ByteArray ( 1 ) = 1MSComm1.Output = ByteArrayEnd Subprivate Sub MScommEvent( )Select Case MSComm1.CommEventCase comEvReceiveDim Buffer As VariantMSComm1.InputLen = 0接收二进制数据MSComm
28、1.InputMode= ComInputModeBinaryBuffer=MSComm1.Input接收字符数据MSComm1.InputMode=comInputModeTextBuffer = MSComml.InputCase elseEnd SelectEnd sub 4、设计题目及要求要求设计一个串口通讯演示程序,界面(示例)如下图所示:其中设置菜单完成串口的选择和参数设置(设置对话框自己设计) ,窗口中 2 个文本框,上面显示从串口中接受的数据,下面显示的是自己输入的数据,点击发送将数据从串口发送出去。要求该软件实现基本的功能,即通过串口进行通讯的功能,最好能实现二进制和文本的收
29、发(通过设置功能实现) ,如果能够实现中文的收发那就更好了。注意:允许并鼓励在基本界面的前提下自己添加各种功能!进度安排:时间点 课堂任务 课下任务11 月 24 日 布置任务,讲解题目 完成方案设计,完成界面设计,菜单,配置等功能编码12 月 1 日 讲解串口通讯编程 完成串口通讯的编码12 月 8 日 讲解如何进行串口通讯实验完成串口通讯程序的测试12 月 15 日 集中答疑 设计得到完整的应用程序,完成课程设计报告12 月 22 日 上交报告,答辩 /其他答疑活动,报告上交,软件上交,都在网络课程里进行。显示串口收到的信息输入要发送的数据点击按钮发送网址: http:/ 用自己的学号和密码登陆,在作业里面提交报告和程序,在论坛里发帖问问题。为了得到及时的答复,可在提出问题后,在我的 QQ 或手机短信留言。