标记:该篇文章全部搬自如下网址:http://www.crystalradio.cn/thread-321839-1-1.html,谢谢啦 里面关于中文接收的部分,大家可以好好学习下,题主也在研究中...................Commport;设置或返回串口号。SettingS:以字符串的形式设置或返回串口通信参数。 Portopen:设置或返回串口状态。 InputMode:设置或返回接收数据的类型。 Inputlen:设置或返回一次从接收缓冲区中读取字节数。 InBufferSize:设置或返回接收缓冲区的大小,缺省值为l 024字节。 InBufferCount:设置或返回接收缓冲区中等待计算机接收的字符数。 Input:从接收缓冲区中读取数据并清空该缓冲区,该属性设计时无效,运行时只读。 OutBufferSize:设置或返回发送缓冲区的大小,缺省值为512字节。 OutBufferCount:设置或返回发送缓冲区中等待计算机发送的字符数。 Output:向发送缓冲区发送数据,该属性设计时无效,运行时只读。 设置好这些属性和方法,程序很容易就可以编出来了,其中要注意的是串口的波特串设置,OnComm事件的程序编写。 程序的设计是这样的,计算机向单片机发送一个’S’,表示通信开始。然后紧接着又发送9个字符,其中最后一个字符是前面9个字符(包括’S’)的校验和。单片机正确接收到10个字符后,把10个字符从新又送回来。 //---------------------------------------初始化串口设计----------------------------- Private Sub Form_Load() Comm1.Setting="9600,n,8,1," ’设置波特率和发送字符格式 Comm1.CommPort=1 ’设置通讯串口 Comm1.InputLen=0 ’设置或返回一次从接收缓冲区中读取字节数,0表示一次读取所有数据 Comm1.InBuffersize=512 Comm1.InBufferCount=0 Comm1.OutBufferCount=0 Comm1.Rthreshold=1 Comm1.PortOpen=True End Sub ’打开串口 //--------------------------------------给单片机发送’S’,开始通信----------------------------- Private Sub Command1_C1ick() Timer1.Enabled=True End Sub Private Sub Command2_C1ick() Varbuffet=“S” Comm1.Ouput=varbuffe Timer2.Enabled=True End Sub Private Sub Form_Unload(Cancel As Integer) Comm1.PortOpen=False End Sub //---------------------------------------向单片机发送数据----------------------------- Private Sub Timer2_ Timer() Outputsignal=Str(Text2.text) ’向单片机发送数据 Temp(1)=Cbyte(outputsignal) Varbuffer=temp Comml.Output=varbuffer Timer2.Enabled=False End Sub //---------------------------------------接收单片机发送的数据,并显示----------------------------- Private Sub Comm1_OnComm() Select Case Comm1.CommEvent ’设置oncomm事件,读取片机内存的值 Case comEvReceive Inputsignal=comm1.Input Text1.Text=Asc(Inputsignal) ’单片机内存的值用textbox显示出 Case Else End select End Sub
'发送字符数组数据时注意ByteArray必须事先定义赋值 Dim ByteArray as byte( )
'定义动态数组 ReDim ByteArray(1)
'重定义数组大小 ByteArray ( 0 ) =0 ByteArray ( 1 ) = 1 MSComm1.Output = ByteArray End Sub
private Sub MScommEvent( ) Select Case MSComm1.CommEvent Case comEvReceive Dim Buffer As Variant MSComm1.InputLen = 0 '接收二进制数据 MSComm1.InputMode= ComInputModeBinary Buffer=MSComm1.Input '接收字符数据 MSComm1.InputMode=comInputModeText Buffer = MSComml.Input Case else End Select End sub ( 程序1)-----------------------------------------------------------------------------------------------------------------------二、中文Win 95/98下的通信问题与解决方法 1.接收的数据少于发送的数据 如果通过MSComm控件一次性传送较多的二进制数据,那么,很可能收到的数据不足。例如在设置为24oobps传输率的情况下, 一次性可以传输2048个字符数据那么在大多数情况下。一次只能收到1200个字符左右,这址出为新版的MSComm32.OCX中存在一 个影响传输二进制数据的臭虫(bug).注意这不是特性。 32位Windows API函数(以下简称API)使用了几个用COMMTIMEOUTS结构表示的限时变量,WriteTotalTimeOutConstant 即是其 中的一个,它被Windows内部设定为5000(即5秒),这个常量决定了在通信驱动程序停止传输之前花费在发送缓冲区中数据的时间 的长短,5秒钟意味着通信速度为1200bps情况下仅能发送600个字符,24oobps情况下仅能发送1200个左右的字符。事实上,在一个 缓冲区内一次性发送更多的数据是非常可能的。这个bug同样也能引发问题,甚至在高速串口门通信情况下,即使系统在使用流控 制,无论丛软件流(Xon/XofI)还是硬件流(CTS/RTS)。假如数据在发送缓冲区中时,流控制停止了传输,如果停止时间超过5 秒钟.则数据就会丢失。在某些环境下,5秒钟可能相当短.不过也不必担心, VB 5.0/6.0版本的MSComm控件有一个新增的重要的 属性称为CommID, CommID指的是当串口被打开时,被API所调用的串口句柄或称标志,这也意味着能利用API接口函数去修改这个 常量。每次串口关闭后,Windows会自动将之恢复为5000,所以,每次打开串口后需要重斩设定以下API声明,其代码见下程序。 Type COMMTIMEOUTS ReadIntervalTimeout As Long ReadTotalTimeoutMultiplier As Long ReadTotalTimeoutConstant As Long WriteTotalTimeoutMultiplier As Long WriteTotalTimeoutConstant As Long End Type Declare Function SetCommTimeouts Lib "Kernel32" (BYVal hFile As Long, lpComm TimeoutsAs COMMTIMEOUTS) As Long Declare Function GetCommTimeouts Lib "Kernel32" (ByVal hFile As Long, lpCommTimeouts As COMMTIMEOUTS) As Long Dim timeouts As COMMEOUTS Dim Ret As Long If Comm1.PortOpen = False Then Comm1.PortOpen = True End if Ret=GetCommTimeouts ( Comm1.CommID , timeouts ) 'Set some default timeouts timeOuts.ReadIntervalTimeout = 1 timeouts.ReadTotalTimeoutMultiplier =1 timeouts.ReadTotalTimeoutConstant =1 timeouts.WriteTotalTimeoutMultiplier =1 timeouts.WriteTotalTimeoutConstant= ( Comm1.OutBufferSizeVal(Comm1.Settings))*10000+1000 Ret=SetCommTimeouts( Comm1.CommID , timeouts ) ( 程序2)
2.如何发送大于128的字符数据 在通信程序中,以单字符方式逐个发送数据时,每一个数据范围 0-255(即十六进制的00-FF)。在单字符版本的英文Win95或 DOS版的BASIC程序中,只需要将相应的数据转换成相应的字符发送到通信端口即可。但在中文Win95/98下却行不通,假设在中文 Win95/98下运行以下程序: Dim i For i=0 to 255 MSComm1.Output=chr(i) Next i