📄 mscomm.htm
字号:
OpenThePort(cPort as String,cBaud as String,cParity as String,cData
as String,tStops as String)As Boolean<BR>Dim lResult as Long<BR>Dim
lHandle as Long<BR>Dim DCB_COMM as DCB<BR>Dim cDCBConfig as
String<BR>lHandle = CreateFile(cPort,GENERIC_READ Or
GENERIC_WRITE,0&,0&,OPEN_EXISTING,0&,0&)<BR>If
lHandle = -1 Then ’打开串口失败<BR>OpenThePort = False<BR>MsgBox
“串口可能正被其他应用程序占用!”<BR>lResult = CloseHandle(lHandle)
’先关闭串口后再打开<BR>If lResult = 0 Then<BR>OpenThePort<BR>Exit
Function<BR>End If<BR>End If<BR>cDCBConfig.band = 2400
’设置DCB<BR>cDCBConfig.parity = None<BR>cDCBConfig.data =
8<BR>cDCBConfig.stop = 1<BR>lResult =
BuildCommDCB(cDCBConfig,DCB_COMM) ’按用户设定配置一个DCB结构<BR>If
lResult = 0 Then<BR>OpenThePort = False<BR>MsgBox
“无法建立DCB设备控制块”<BR>Exit Function<BR>End If<BR>lResult =
SetCommState(lHandle,DCB_Comm) ’实际设置一个串口的DCB<BR>If lResult = 0
Then<BR>OpenThePort = False<BR>MsgBox
“无法建立DCB设备控制块”<BR>Exit Function<BR>End If<BR>OpenThePort
= True<BR>End Function<BR><BR>Private Sub SendHand ( )
’发送握手信号的子过程<BR>Dim Nchars As Long<BR>Static Readbuff As String
* 1<BR>Static Writebuff As String * 1<BR>Dim lpDCB As DCB<BR>Dim
lRet As Long<BR>Dim lHandle As Long<BR>Dim lpOverlapped As
OVERLAPPED<BR>Dim RNum As Integer<BR><BR>MsgBox
“请把电卡读卡器插在串口2上!”,48,“提示窗口”<BR>lHandle =
OpenThePort(COMM1,2400,None,8,1)<BR>lRet = PurgeComm( lHandle,1 )
’清输出缓冲区<BR>lRet = PurgeComm( lHandle,0 ) ’清输入缓冲区<BR>lRet
= GetCommState ( lHandle,lpDCB )
’获得通讯口的状态<BR>Shand:<BR>Writebuff$ = Chr$(&H8F)<BR>lRet =
WriteFile ( lHandle,Writebuff$,1,Nchars,lpOverlapped )
’送握手信号入串口缓冲区<BR>If lRet <= 0 Then<BR>MsgBox
“发送操作出错,电卡握手信号未发送成功”, 16<BR>GoTo Shand
’不成功则重发<BR>Else<BR>GoTo Qtest<BR>End If<BR>GoTo
Shand<BR>Qtest:<BR>Readbuff$ =“ ” ’清除缓冲区为空<BR>Do
While lHandle ’循环查询串口<BR>RNum = 0
’设置读串口次数的指针为0<BR>ReadAgain:<BR>lRet = ReadFile(
lHandle,Readbuff$,1,Nchars,lpOverlapped )<BR>If lRet < 0
Then<BR>MsgBox “读取应答信号时出错”, 16<BR>End If<BR>If lRet = 0
Then<BR>If RNum > 1000 Then ’只读1000次串口,以免陷入死循环<BR>MsgBox
"电卡没有插接好或电卡没有接在串口上!"<BR>GoTo CloseP<BR>End If<BR>RNum =
RNum + 1<BR>GoTo ReadAgain<BR>End If<BR>If Hex$(Asc(Readbuff))
<> Hex$(&HFF) Then<BR>GoTo Shand
’回送码不正确则返回继续发送握手信号<BR>Else<BR>Label1.Caption =
“握手信号是:”+Hex$(Asc(Readbuff$))<BR>Msgbox
“握手信号正确,已正确联机”<BR>GoTo CloseP<BR>End
If<BR>Loop<BR>CloseP: lRet = CloseHandle( lHandle )<BR>If lRet = 0
Then<BR>MsgBox “串行通讯口关闭成功”,48,“提示窗口”<BR>End
If<BR>End Sub<BR><BR>这里,要注意的是:当PC机与单片机系统通信时,单片机数据存储区( RAM
)内的数据是十六进制,在信号线上传输的是十六进制数的ASCII码的二进制形式;而Windows系统下使用的是ANSI码,ANSI码仅在前126个与ASCII码相同。即在Win95下接收到的是十六进制数的ASCII码的字符串,可先转换为ANSI码后再在Win95下还原为十六进制数。<BR><BR>具体如下:Code$
= Hex$( Asc ( Readbuff$ )
)<BR><BR>另外,由于32位API函数参数的数据类型的变化,所有整形参数都被换为长整型(Long)以支持32位的处理,这一点在设置返回值尤其如此。<BR><BR>同时,这些API函数、类型及常量在调用之前,必须先声明再使用。<BR><BR>五、结束语<BR><BR>由上可见,调用API接口的VB串口查询法具有实现简便、难度低、代码精简的突出优点。很适合一般VB程序员在编写通信程序时使用。<BR><BR>参考文献<BR>1
美 Darwin Boyle等 《 Visual Basic 4 Developer's Guide 》<BR>北京:机械工业出版社
1997.1<BR>2 美 Stefano Maruzzi 《The Microsoft Windows 95 Developer's
Guide》<BR>北京:机械工业出版社 1997.1<BR></TD></TR>
<TR>
<TD></TD></TR>
<TR>
<TD align=middle>| <A href="file:///H:/备份/OLD/98-y5-yyz.htm"
target=right>返回目录</A>
|</TD></TR></TBODY></TABLE></CENTER></DIV></FONT></DIV></BODY></HTML>
</x-html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -