?? common.bas
字號:
Attribute VB_Name = "mdlCommon"
Option Explicit
Public g_blIsListSMS As Boolean
Public g_blIsSysBusy As Boolean
Public g_blIsWaiting As Boolean
Public g_blIsNewSMSIn As Boolean
Public g_blIsSendingSMS As Boolean
Public g_blIsHexCommData As Boolean
Public g_blMaySaveAllSMS As Boolean
Public g_blwav As Boolean
Public g_strSave As String
Public g_strThisAT As String
Public g_strLastAT As String
Public g_strLatestAT As String
Public n_CountListSMS As Long
Public g_SysInfo As SysStruct
Public TheForm As Form
Public TheMenu As Menu
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 'VB延時API函數
Public Declare Sub winhelp Lib "user32" (ByVal hWnd As Long, ByVal lphelpfile As String, ByVal wcommand As Long, ByVal dwData As Long) '調用幫助API函數
Public Declare Function htmlHelp Lib "hhctrl.ocx" Alias "HtmlHelpA" (ByVal hwndCaller As Long, ByVal pszFile As String, ByVal uCommand As Long, ByVal dwData As Long) As Long
Public Const HH_DISPLAY_INDEX = 2
Public Const HH_DISPLAY_TOC = 1
Public Const HH_DISPLAY_TOPIC = 0
Type SysStruct
CommPort As Integer
Baud As String
ServiceNo As String
DestNo As String
SMSMelody As Integer
Clock As Boolean
ClockSet As String
End Type
Type SMSDef
ListOrRead As Boolean '是否用列舉(List)方法讀取
SmsIndex As Long
SourceNo As String
ReachDate As String
ReachTime As String
SmsMain As String
End Type
'功能:解析串口中AT命令返回的信息
'輸入參數: 串口數據
'輸出參數:
'strATData: 短消息內容(UD)
'iSMSIdx: 短消息序號
'strSMSTime: 短消息接收時間
'strSMSSourceNO:源SIM卡號
'strSMSStatus: 短消息狀態:"READ"—已讀,"UNREAD"—未讀,"SENT"—發送,"UNSENT"—未發送
Public Function GetDataFromCommPort(ByVal strInput As String, strATData As String, Optional CommandStatus As String, Optional TimedOut As Boolean, Optional iSMSIdx As Integer, Optional strSMSTime As String, Optional strSMSSourceNO As String, Optional strSMSStatus As String) As Boolean
On Error GoTo ErrorG
Dim strTmp As String, strTmp1 As String
Dim i As Integer, iTmp1 As Integer, iTmp2 As Integer
Dim iLen As Integer
Dim blHasError As Boolean
Dim blIfInprogress As Boolean
Static iCountMonitor As Integer
strTmp = ""
For i = 1 To Len(strInput)
strTmp1 = Mid(strInput, i, 1)
If strTmp1 <> vbLf Then strTmp = strTmp & strTmp1
Next i
g_strSave = g_strSave & strTmp '"AT+CMGR=1" & vbCrLf & "+CMGR: REC"
If InStr(strTmp, vbCr) > 0 Then ' And (InStr(strTmp, "OK") > 0 Or InStr(strTmp, "ERROR") > 0) Then
g_blIsWaiting = False
iCountMonitor = 0
End If
iCountMonitor = iCountMonitor + 1
'1、看是否是AT命令或者其響應
' a. 如果是AT開頭或者有A/且A/之后是回車換行,則表示ATE1
' b. 如果不是以上或者以以上字符串開頭,回車換行之后以"+"開頭,或者"OK"、"ERROR"
' 則表示是AT命令的響應。
' 另外,還有一種可能是以上所述字符串出現在半道,
' 那么,在這種情況下需要查找符合條件的字符串,從中截取出響應字符串
' 在這里,如果命令一時沒有全部返回,因為串口數據不一定會得到全部數據
' 所以,設置一個靜態的Bool變量blIsWaiting,來指示是否結束了本條AT響應單元
ProcessNextData:
Do
If Left(g_strSave, 1) = vbCr Then
g_strSave = Right(g_strSave, Len(g_strSave) - 1)
Else
Exit Do
End If
Loop
If Not g_blIsWaiting Then
If g_strThisAT = "" Then
g_blIsWaiting = True
If UCase(Left(g_strSave, 3)) = "A/" & vbCr Then
CommandStatus = "重復上次指令"
g_strSave = Right(g_strSave, Len(g_strSave) - 3)
g_strThisAT = ""
g_blIsWaiting = False
ElseIf UCase(Left(g_strSave, 2)) = "AT" Then '命令的回顯
iLen = InStr(g_strSave, vbCr) '查找命令輸入結束符號——回車
If iLen > 0 Then
g_strLastAT = Left(g_strSave, iLen) '保存回顯的命令,作為指示的依據。
g_strSave = Right(g_strSave, Len(g_strSave) - iLen) '只保留命令的執行部分
g_strThisAT = "IsEcho"
Else
g_blIsWaiting = True
End If
ElseIf UCase(Left(g_strSave, 2)) <> "AT" Then '如果開頭字符不是AT+,那么需要搜索一下;
iTmp1 = InStr(g_strSave, "+") '首先查找AT指令響應標志"+"
If iTmp1 > 0 Then '如果找到了"+"
iTmp2 = InStr(g_strSave, ":") '查找響應結束符標志":"
If iTmp2 > 0 And iTmp2 > iTmp1 Then '根據起始符"+",用以確定最近返回的是哪一個指令
g_strThisAT = Mid(g_strSave, iTmp1, iTmp2 - iTmp1 + 1)
g_strSave = Right(g_strSave, Len(g_strSave) - iTmp1 + 1)
blHasError = False
Else
'假如沒有找到成對出現或者任何一個都沒有的返回值,那么要等待后面的內容
If Len(g_strSave) - iTmp1 > 15 Then
blHasError = True
Else
blHasError = False
g_blIsWaiting = True
End If
End If
Else
If InStr(g_strSave, "OK") > 0 Then '是OK嗎?
g_strThisAT = "OK"
ElseIf InStr(g_strSave, "ERROR") > 0 Then '不是OK,是ERROR嗎?
g_strThisAT = "ERROR" '但屬于非正常操作
ElseIf InStr(g_strSave, "RING") > 0 Then
g_strThisAT = "RING"
Else
iLen = InStr(g_strSave, vbCr)
If iLen > 0 Then
g_strSave = Right(g_strSave, Len(g_strSave) - iLen)
g_strThisAT = ""
blHasError = False
Else
blHasError = True
End If
End If
End If
If blHasError Then
g_strSave = ""
g_strThisAT = ""
g_blIsWaiting = True
End If
End If
End If
'If g_strThisAT <> "" Then g_blIsWaiting = Not AnalysisData(g_strSave, g_strThisAT, blIfInprogress, CommandStatus)
End If
If TimedOut = True Then
TimedOut = False
End If
TimedOut = g_blIsWaiting
If g_strSave <> "" And g_strSave <> vbCr Then
If g_strThisAT = "" Then
iCountMonitor = iCountMonitor + 1
If Not g_blIsWaiting Then GoTo ProcessNextData
End If
ElseIf g_strSave = vbCr Or g_strSave = "" Then
g_strSave = ""
g_blIsWaiting = False
g_strThisAT = ""
g_strLastAT = ""
End If
strATData = g_strSave
GetDataFromCommPort = True
Exit Function
ErrorG:
CommandStatus = "獲取串口數據:" & Err.Description
End Function
Public Function PickAllSMS(ByRef InputString As String, RetSMS() As SMSDef) As String
Dim i As Integer, iTmp As Integer, iLen As Integer, iNext As Integer, iCr As Integer
Dim n As Long
Dim strTmp As String, strTmp1 As String, strTmp2 As String
Dim btTmp() As Byte, btTmp2() As Byte
Dim blRet As Boolean
On Error Resume Next
strTmp = ""
btTmp = InputString
'======== 將短消息中的雙引號去除 ========
iTmp = 0
For i = 0 To UBound(btTmp)
strTmp1 = Chr(btTmp(i))
If strTmp1 <> """" And btTmp(i) <> 0 And strTmp1 <> vbLf Then
ReDim Preserve btTmp2(0 To iTmp + 1)
btTmp2(iTmp) = btTmp(i)
btTmp2(iTmp + 1) = 0
iTmp = iTmp + 2
End If
Next i
InputString = btTmp2
n = 0
i = 1
Do
iTmp = InStr(i, InputString, "+CMGL:")
iCr = InStr(iTmp, InputString, vbCr)
If iTmp > 0 Then
If iCr - iTmp + 1 > 0 Then n = n + 1
ElseIf iTmp = 0 Then
Exit Do
End If
i = iTmp + 7
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -