Private Function OpenThePort(cPort as String,cBaud as String,cParity
as String,cData as String,tStopsasString)As Boolean ’ 打開串口的子過程
Dim lResult as Long
Dim lHandle as Long
Dim DCB_COMM as DCB
Dim cDCBConfig as String
lHandle = CreateFile(cPort,GENERIC_READOr GENERIC_WRITE,
0&,0&,OPEN_EXISTING,0&,0&)
If lHandle = -1 Then ’打開串口失敗
OpenThePort = False
MsgBox “串口可能正被其他應用程序占用!”
lResult = CloseHandle(lHandle) ’先關閉串口后再打開
If lResult = 0 Then
OpenThePort
Exit Function
End If
End If
cDCBConfig.band = 2400 ’設置DCB
cDCBConfig.parity = None
cDCBConfig.data = 8
cDCBConfig.stop = 1
lResult = BuildCommDCB(cDCBConfig,DCB_COMM) ’按用戶設定配置一個DCB結構
If lResult = 0 Then
OpenThePort = False
MsgBox “無法建立DCB設備控制塊”
Exit Function
End If
lResult = SetCommState(lHandle,DCB_Comm)’實際設置一個串口的DCB
If lResult = 0 Then
OpenThePort = False
MsgBox “無法建立DCB設備控制塊”
Exit Function
End If
OpenThePort = True
End Function
Private Sub SendHand ( ) ’發送握手信號的子過程
Dim Nchars As Long
Static Readbuff As String * 1
Static Writebuff As String * 1
Dim lpDCB As DCB
Dim lRet As Long
Dim lHandle As Long
Dim lpOverlapped As OVERLAPPED
Dim RNum As Integer
MsgBox “請把讀卡器插在串口2上!”,
48,“提示窗口”
lHandle = OpenThePort(COMM1,2400,None,8,1)
lRet = PurgeComm( lHandle,1 ) ’清輸出緩沖區
lRet = PurgeComm( lHandle,0 ) ’清輸入緩沖區
lRet = GetCommState ( lHandle,lpDCB ) ’獲得通訊口的狀態
Shand:
Writebuff$= Chr$(&H8F)
lRet = WriteFile (lHandle,Writebuff$,1,Nchars,lpOverlapped)
’送握手信號入串口緩沖區
If lRet <= 0 Then
MsgBox “發送操作出錯,卡握手信號未發送成功”, 16
GoTo Shand ’不成功則重發
Else
GoTo Qtest
End If
GoTo Shand
Qtest:
Readbuff$ =“ ” ’清除緩沖區為空
Do While lHandle ’循環查詢串口
RNum = 0 ’設置讀串口次數的指針為0
ReadAgain:
lRet = ReadFile( lHandle, Readbuff$,1,Nchars,lpOverlapped)
If lRet < 0 Then
MsgBox “讀取應答信號時出錯”, 16
End If
If lRet = 0 Then
If RNum > 1000 Then ’只讀1000次串口,以免陷入死循環
MsgBox
"卡沒有插接好或卡沒有接在串口上!"
GoTo CloseP
End If
RNum = RNum + 1
GoTo ReadAgain
End If
If Hex$(Asc(Readbuff)) <> Hex$(&HFF) Then GoTo Shand
’回送碼不正確則返回繼續發送握手信號
Else
Label1.Caption = “握手信號是:”
+Hex$(Asc(Readbuff$))
Msgbox “握手信號正確,已正確聯機”
GoTo CloseP
End If
Loop
CloseP:lRet = CloseHandle( lHandle )
If lRet = 0 Then
MsgBox “串行通訊口關閉成功”,
48,“提示窗口”
End If
End Sub
這里要注意的是:當PC機與單片機系統通信時,單片機數據存儲區(RAM )內的數據是十六進制,在信號線上傳輸的是十六進制數的ASCII碼的二進制形式;而Windows系統下使用的是ANSI碼,ANSI碼僅在前126個與ASCII碼相同。即在Win95下接收到的是十六進制數的ASCII碼的字符串,可先轉換為ANSI碼后再在Win95下還原為十六進制數。 具體為:Code$=Hex$(Asc ( Readbuff$) ) 另外,由于32位API函數參數的數據類型的變化,所有整形參數都被換為長整型(Long)以支持32位的處理,這一點在設置返回值時尤其如此。