1、VB 和 51 单片机串口通信讲解Commport;设置或返回串口号。SettingS:以字符串的形式设置或返回串口通信参数。Portopen:设置或返回串口状态。InputMode:设置或返回接收数据的类型。Inputlen:设置或返回一次从接收缓冲区中读取字节数。InBufferSize:设置或返回接收缓冲区的大小,缺省值为 l 024 字节。InBufferCount:设置或返回接收缓冲区中等待计算机接收的字符数。Input:从接收缓冲区中读取数据并清空该缓冲区,该属性设计时无效,运行时只读。OutBufferSize:设置或返回发送缓冲区的大小,缺省值为 512 字节。OutBuffe
2、rCount:设置或返回发送缓冲区中等待计算机发送的字符数。Output:向发送缓冲区发送数据,该属性设计时无效,运行时只读。设置好这些属性和方法,程序很容易就可以编出来了,其中要注意的是串口的波特串设置,OnComm 事件的程序编写。 程序的设计是这样的,计算机向单片机发送一个S,表示通信开始。然后紧接着又发送 9个字符,其中最后一个字符是前面 9 个字符(包括S)的校验和。单片机正确接收到 10个字符后,把 10 个字符从新又送回来。/-初始化串口设计- Private Sub Form_Load()Comm1.Setting“9600,n,8,1,“ 设置波特率和发送字符格式Comm1.
3、CommPort1 设置通讯串口Comm1.InputLen0 设置或返回一次从接收缓冲区中读取字节数, 0 表示一次读取所有数据Comm1.InBuffersize512Comm1.InBufferCount0Comm1.OutBufferCount=0Comm1.Rthreshold1Comm1.PortOpenTrueEnd Sub 打开串口/-给单片机发送S,开始通信- Private Sub Command1_C1ick()Timer1.EnabledTrueEnd SubPrivate Sub Command2_C1ick()Varbuffet“S” Comm1.Ouputvarb
4、uffeTimer2.EnabledTrueEnd SubPrivate Sub Form_Unload(Cancel As Integer)Comm1.PortOpenFalseEnd Sub/-向单片机发送数据- Private Sub Timer2_ Timer()OutputsignalStr(Text2.text) 向单片机发送数据Temp(1)Cbyte(outputsignal)VarbuffertempComml.OutputvarbufferTimer2.EnabledFalseEnd Sub/-接收单片机发送的数据,并显示-Private Sub Comm1_OnComm(
5、)Select Case Comm1.CommEvent 设置 oncomm 事件,读取片机内存的值Case comEvReceiveInputsignalcomm1.InputText1.TextAsc(Inputsignal) 单片机内存的值用 textbox 显示出Case ElseEnd selectEnd Sub关于 MSCOMM 控件的一些说明VB5.0/6.的 MSComm 通信控件提供了一系列标准通信命令的接口,它允许建立串口连接,可以连接到其他通信设备(如 Modem) 还可以发送命令、进行数据交换以及监视和响应在通信过程中可能发生的各种错误和事件,从而可以用它创建全双工 、
6、事件驱动的、高效实用的通信程序。但在实际通信软件设计过程中,MSComm 控件并非像想像中那样完美和容易控制特别是在中文 Wln9598 下通信时更会出现问题。下面就从基础开始介绍,然后逐步讨沦 MSComm 控件在编程中出现的问题以及编程技巧。一、用 MSComm 控件通信1串口通信基础知识一般悦来,计算机都有一个或多个串行端口,它们依次为 com1、Com2 、,这些串口还提供了外部设备与 pC 进行数据传输和皿信的通道。这些串口在 CPU 和外设之间充当解释器的角色。当字符数据从 CPU 发送给外设时,这些字符数据将被转换成串行比特流数据;当接收数据时,比特流数据被转换为字符数据传递给
7、CPU,再进一步说,在操作系统方面,Windows 用通信驱动程序(COMM.DRV)调用 API 函数发送和接收数据,当用通信控件或声明调用 API 函数时,它门由 COMM. DRV 解释并传递给设备驱动程序,作为一个 vB 程序员,要编写通信程序只需知道通信控件提供给 Windows 通信 AP1 函数的接口即可换句话说,只需设定和监视通信控件的属性和事件即可。2使用 Mscomm 控件在开始使用 MSComm 控件之前。需要先了解其属性、事件或错误属性 描述CommPort 设置或返回通信端口号Settings 以字符串的形式设置或返回波特率、奇偶校验、数据位和停止位PortOpen
8、设置或返回通信端口的状态。也可以打开和关闭端口Input 返回和删除接收缓冲区中的字符Output 将字符串写入发送缓冲区CommEvent 属性为通信事件或错误返回下列值之一。在该控件的对象库中也可以找到这些常量。常量 值 描述ComEventBreak 1001 收到了断开信号ComEventCTSTO 1002 Clear To Send Timeout。在发送字符时,在系统指定的事 1 件内,CTS (Clear To Send)线是低电平ComEventDSRTO 1003 Data Set Ready Timeout。在发送字符时,在系统指定的事件内,DSR(Data Set Re
9、ady)线是低电平ComEventFrame 1004 数据帧错误。硬件检测到一个数据帧错误ComEventOverrun 1006 端口溢出。硬件中的字符尚未读,下一个字符又到达,并且丢失ComEventCDTO 1007 Carrier Detect Time。在发送字符时,在系统指定的事件内,CD(Carrier Detect)线是低电平。CD也称为 RLSD(Receive Line Singal Detect,接收线信号检测)ComEventRxOver 1008 接收缓冲区溢出。在接收缓冲区中没有空间ComEventRxParity 1009 奇偶校验错。硬件检测到奇偶校验错误 7
10、ComEventTxFull 1010 发送缓冲区满。在对发送字符排队时,发送缓冲区满ComEventDCB 1011 检取端口 DCB(Device Control Blick)时发生了没有预料到的错误通信事件包含了下面的设置:常量 值 描述ComEvSend 1 发送缓冲区中的字符数比 Sthreshold 值低ComEvReceive 2 接收到了 Rthreshold 个字符。持续产生该事件,直到使用了 Input 属性删除了接收缓冲区中的数据ComEvCTS 3 CTS(Clear To Send)线改变ComEvDSR 4 DSR(Data Set Ready)线改变。当 DSR
11、从 1 到 0 改变时,该事件发生ComEvCD 5 CD(Carrier Detect)线改变 ComEvRing6 检测到响铃信号。一些URAT(Universal AsynchronousReciver-Transmitters,通用异步收发器)不支持该事件ComEvEOF 7 收到了 EOF 字符(ASCII 字符 26)Error 消息(MSComm 控件)下表列出了 MSComm 控件可捕获的错误消息:常量 值 描述ComInvalidPropertyValue 380 无效的属性值ComSetNotSupported 383 属性只读ComGetNotSupported 394
12、属性只读ComPortOpen 8000 端口打开时该存在无效8001 超时设置必须比 0 值大ComPortInvalid 8002 无效的端口号8003 属性只在运行时有效8004 属性在运行时是只读的ComPortAleadyOpen 8005 端口已经打开8006 设备标识符无效或不支持8007 不支持设备的波特率8008 指定的字节大小无效8009 缺省参数错误8010 硬件不可用(被其他设备锁住)8011 函数不能分配队列ComNoOpen 8012 设备没有打开8013 设备已经打开8014 不能使用通信通知ComSetCommStateFailed 8015 不能设置通信状态8
13、016 不能设置通信事件屏蔽ComPortNotOpen 8018 该存在只在端口打开是有效8019 设备忙ComReadError 8020 通信设备读错误ComDCBError 8021 检取端口设备控制块时出现内部错误搞清楚以上基本属性后,就可以开始编写通信许程序了。在 VB5.0/6.0 中新建一个工程文件。添加 Microsoft Comm Control 5.0 组件,在简体 Form1 中加入 Command 命令按钮并取名为 CmdTest,MSComm 控件取名为MSComm1,加入如下程序代码。Private Sub cmdTestClick ( ) 打开串口MSComml
14、.CommPort =2 设定 Com2If 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 ! “ Next iCase . . . . .3如何发送
15、0 字符(00H,NULL)在 VisuaI C中使用串口控件发送 0 字符有些麻烦,但在 VB5.0/6.0 中只要注意以下两点即可:(1)设置 MSComm 控件的属性 NullDiscard=False;。(2)使用二进制接收,即用 MSComm1.InputMode=ComInputModeBinary 便可以解决问题;4如何发送递中文字符串(DBcS 字符)VB5.0/6.0 的各种参考书上均指明 MSComm 通信控件不能发送或接收双字节字符集系统DBCS)的二进制数据,这对于我国及亚洲一些使用 DBCS 字符集的国家不能不说是一大人遗憾。但是我在实践中发现,用 MSComm 控件
16、也可以发送中文字符,具体方法有以下两种:(1)直接发送直接发送即把中文字符等同于英文字符。如:MSComm1.Intput= “ 这是一行中文数据!“ ,但这种方法发送的中文数据不能太长,发送缓冲区和接收缓冲区的大小需设定为中文字符的两倍以上,而且发送与接收系统所处的操作系统版本最好要一致,否则会出现接收或发送缓冲区溢出之类的错误。这种方法时用于一般要求不太高的场合。(2)间接发送在发送端将汉字或字符转换为机器内码或区位码数据数组,然后将咏转换后的数据发送到串口,在接收端接收到数据后,按照相反的顺序得到的数据转换为相应的汉字或字符,在转换过程中要用到位运算,如取得汉字的内码后需要将高字节和低字
17、节分开,而 VB5.0/6.0 中并没有提供此类函数,以下是求整数高、低字节的函数。Public Function HiByte(a As Integer )Dim bb= a And &HFF00b = b / 256If b 0.01) Then 间隔 10MS 以上就认为是一个新的包text1=“ text1 用于搜集和显示接收 (HEX 格式)N = 0End IfT = TimerFor i = 0 To UBound(S) 一个数据包可能产生若干个 oncomm 事件Text1.Text = Text1.Text & Right(“0“ & Hex(S(i) & “H“, 3) + “ “SS(N+i)=S(i) 接收数据包缓存于 SS()N=N+UBound(S)Next iEnd IfEnd Sub转自 AMOBBS