目前关于GSM的应用已经是很广泛的了,但是在实际项目应用中,我发现很多人都会忽略一个很重要的事情:一张SIM卡的存储次数只有2-10万次,超过这个次数,SIM卡就会损坏,实际上这一点完全可以通过AT参数设置来解决的。就是在设备启动的时候先输入AT+CSMS=1 AT+CNMMI=2,2,0,0,1 接收一条短信后,马上返回AT+CNMA就可以了。
网络上关于GSM的资料代码等等已经很多了,我这里发一个我自己做的短信测试的软件,如果想要整个软件,可以留下邮箱!
Option Explicit
Public inData As String '串口中断时读入的字符串
Dim P As String, D As String, T As String, TXT As String, E As Integer
Private Sub Check1_Click()
If Check1.Value Then
CloseOnComm
Check1.Enabled = False
Dim TxString As String
MSComm1.Output = "at+csms=1" & Chr(10) & Chr(13)
Delay 2
MSComm1.Output = "at+cnmi=2,2,0,0,1" & Chr(10) & Chr(13)
Delay 2
Check1.Enabled = True
OpenOnComm
End If
End Sub
Private Sub Combo1_Click()
If MSComm1.PortOpen = 1 Then
MSComm1.PortOpen = 0
MSComm1.Settings = Combo1.Text + ",n,8,1"
'If Combo1.Text = "1200" Then MSComm1.Settings = "1200,,,"
MSComm1.PortOpen = 1
Else
MSComm1.Settings = Combo1.Text + ",n,8,1"
'If Combo1.Text = "1200" Then MSComm1.Settings = "1200,,,"
End If
End Sub
Private Sub combo1_dropdown()
Combo1.Clear
Combo1.AddItem "1200", 0
Combo1.AddItem "2400", 1
Combo1.AddItem "4800", 2
Combo1.AddItem "9600", 3
Combo1.AddItem "19200", 4
Combo1.AddItem "38400", 5
Combo1.AddItem "57600", 6
Combo1.AddItem "115200", 7
End Sub
Private Sub Command10_Click()
CloseOnComm
Dim TxString As String
Dim i As Integer
MSComm1.Output = "at+cmgf=0" & vbCrLf
Delay 1
MSComm1.Output = "at+cmgl=3" & Chr(13) & Chr(10)
Delay 1
TxString = MSComm1.Input
Dim atext() As String
'Text8.SelText = TxString
atext = Split(TxString, Chr(13) & Chr(10))
'Text8.Text = atext(4)
If Len(atext(4)) < 15 Then
Text4.SelText = "无已发送信息,请检查!" & vbCrLf
Else
For i = 2 To (UBound(atext) - 1) / 2 - 1
Text8.Text = atext(i * 2)
SuperSMS1.ConPDU Text8.Text, P, D, T, TXT, 1, E
'Text4.Text = smsalltext
'获得解析后的数据
Text4.SelText = "电话号码:" & P & vbCrLf _
& "日期:" & D & vbCrLf _
& "时间:" & T & vbCrLf _
& "内容:" & TXT & vbCrLf _
& "错误代码:" & E & vbCrLf
'Text4.SelText = TxString
Next i
End If
OpenOnComm
End Sub
Private Sub Command11_Click()
CloseOnComm
Dim TxString As String
MSComm1.Output = "at+cmgf=0" & vbCrLf
Delay 1
MSComm1.Output = "at+cmgl=4" & Chr(13) & Chr(10)
Delay 1
TxString = MSComm1.Input
Text4.SelText = TxString
OpenOnComm
End Sub
Private Sub Command2_Click()
On Local Error Resume Next
CloseOnComm
Dim SInput As String
Dim a As String
'Dim s
If Text1.Text <> "" Then
MSComm1.Output = "at+csca=""" & Text1.Text & """" & Chr(13) & Chr(10)
Delay 2
SInput = MSComm1.Input
If InStr(SInput, "OK") = 0 Then
MsgBox ("短信中心设置失败,请重新设置!")
OpenOnComm
Exit Sub
End If
End If
'Delay 1
MSComm1.Output = "at+cmgf=0" & Chr(13) & Chr(10)
Delay 2
'If MSComm1.Input = Chr(13) & Chr(13) & Chr(10) & Chr(79) & Chr(75) & Chr(13) & Chr(10) Then
a = MSComm1.Input
If InStr(a, "OK") <> 0 Then
MSComm1.Output = "at+cmgs=" & Text6.Text & Chr(13) & Chr(10)
' Delay 1
' If MSComm1.Input = Chr(13) & Chr(13) & Chr(10) & Chr(62) & Chr(32) Then
Delay 3
MSComm1.Output = Text5.Text & Chr(26)
Delay 4
Dim SInputT
SInputT = MSComm1.Input
If InStr(SInputT, "OK") <> 0 Then
MsgBox ("发送成功!")
Else
MsgBox ("发送失败,请重新发送!")
End If
Else
MsgBox ("短信模式配置错误,请重新配置!")
End If
OpenOnComm
End Sub
Private Sub Command3_Click()
Unload Me
End Sub
Private Sub Command4_Click()
'Dim TxInput(1 To 65534) As Byte
CloseOnComm
Dim TxString As String
Dim i As Integer
MSComm1.Output = "at+cmgf=0" & vbCrLf
Delay 1
MSComm1.Output = "at+cmgl=0" & Chr(13) & Chr(10)
Delay 1
TxString = MSComm1.Input
Dim atext() As String
'Text8.SelText = TxString
atext = Split(TxString, Chr(13) & Chr(10))
'Text8.Text = atext(4)
If Len(atext(4)) < 15 Then
Text4.SelText = "无未读新信息,请等待!" & vbCrLf
Else
For i = 2 To (UBound(atext) - 1) / 2 - 1
Text8.Text = atext(i * 2)
SuperSMS1.ConPDU Text8.Text, P, D, T, TXT, 1, E
'Text4.Text = smsalltext
'获得解析后的数据
Text4.SelText = "电话号码:" & P & vbCrLf _
& "日期:" & D & vbCrLf _
& "时间:" & T & vbCrLf _
& "内容:" & TXT & vbCrLf _
& "错误代码:" & E & vbCrLf
'Text4.SelText = TxString
Next i
End If
OpenOnComm
End Sub
Private Sub Command6_Click()
CloseOnComm
MSComm1.Output = "at+cmgf=0" & Chr(13) & Chr(10)
Delay 1
MSComm1.Output = "at+cmgl=4" & Chr(13) & Chr(10)
Delay 2
Dim smsalltext As String
smsalltext = MSComm1.Input
Dim atext() As String
Dim i As Integer
atext = Split(smsalltext, Chr(13) & Chr(10))
Dim j As Integer
If Len(atext(4)) < 15 Then
Text4.SelText = "内存为空,无短信" & vbCrLf
Else
For j = 2 To (UBound(atext) - 1) / 2 - 1
Text8.Text = atext(j * 2)
SuperSMS1.ConPDU Text8.Text, P, D, T, TXT, 1, E
'Text4.Text = smsalltext
'获得解析后的数据
Text4.SelText = "电话号码:" & P & vbCrLf _
& "日期:" & D & vbCrLf _
& "时间:" & T & vbCrLf _
& "内容:" & TXT & vbCrLf _
& "错误代码:" & E & vbCrLf
Next j
End If
OpenOnComm
End Sub
Sub Conv()
SuperSMS1.SMS_Phone = Text2.Text
SuperSMS1.SMS_CSCA = Text1.Text
SuperSMS1.SMS_STXT = Text3.Text
Text5.Text = SuperSMS1.SMS_SMain
'Text8.Text = SuperSMS1.ANSIText(Text7.Text)
Text6.Text = SuperSMS1.SMS_SLen
End Sub
Private Sub Command5_Click()
Text4.Text = ""
End Sub
Private Sub Command7_Click()
CloseOnComm
MSComm1.Output = "at+cmgd=" & Text7.Text & vbCrLf
Dim deltext As String
Delay 3
deltext = MSComm1.Input
If InStr(deltext, "OK") <> 0 Then
Text4.SelText = "删除短信" & Text7.Text & "成功" & vbCrLf
deltext = ""
Else
Text4.SelText = "删除短信" & Text7.Text & "失败,请重新检查" & vbCrLf
deltext = ""
End If
OpenOnComm
End Sub
Private Sub Command8_Click()
'On Error Resume Next
CloseOnComm
If InStr(Command8.Caption, "关闭串口") <> 0 Then
MSComm1.PortOpen = False
Command8.Caption = "打开串口"
Command7.Enabled = False
Command6.Enabled = False
Command4.Enabled = False
Command1.Enabled = False
Command9.Enabled = False
Command10.Enabled = False
Command2.Enabled = False
Command11.Enabled = False
Label5.Enabled = False
Else
MSComm1.PortOpen = 1
Command8.Caption = "关闭串口"
' If flag2 = True Then
MSComm1.Output = "at" & vbCrLf
Dim attext
Delay 2
attext = MSComm1.Input
If InStr(attext, "OK") <> 0 Then
Command2.Enabled = True
Command7.Enabled = True
Command6.Enabled = True
Command4.Enabled = True
Command1.Enabled = True
Command9.Enabled = True
Command10.Enabled = True
Command11.Enabled = True
Label5.Enabled = True
Text4.SelText = "设备已经连接!" & vbCrLf
Else
Text4.SelText = "串口无反应,请检查!" & vbCrLf
End If
End If
OpenOnComm
End Sub
Private Sub Command9_Click()
CloseOnComm
Dim TxString As String
Dim i As Integer
MSComm1.Output = "at+cmgf=0" & vbCrLf
Delay 1
MSComm1.Output = "at+cmgl=1" & Chr(13) & Chr(10)
Delay 1
TxString = MSComm1.Input
Dim atext() As String
'Text8.SelText = TxString
atext = Split(TxString, Chr(13) & Chr(10))
'Text8.Text = atext(4)
If Len(atext(4)) < 15 Then
Text4.SelText = "无已读信息,请检查!" & vbCrLf
Else
For i = 2 To (UBound(atext) - 1) / 2 - 1
Text8.Text = atext(i * 2)
SuperSMS1.ConPDU Text8.Text, P, D, T, TXT, 1, E
'Text4.Text = smsalltext
'获得解析后的数据
Text4.SelText = "电话号码:" & P & vbCrLf _
& "日期:" & D & vbCrLf _
& "时间:" & T & vbCrLf _
& "内容:" & TXT & vbCrLf _
& "错误代码:" & E & vbCrLf
'Text4.SelText = TxString
Next i
End If
OpenOnComm
End Sub
Private Sub Text4_KeyPress(KeyAscii As Integer)
On Error Resume Next
MSComm1.Output = Chr(KeyAscii)
End Sub
Private Sub Form_Load()
On Error Resume Next
MSComm1.PortOpen = False
MSComm1.CommPort = 1
MSComm1.InputMode = comInputModeText
MSComm1.Settings = "57600,N,8,1"
MSComm1.InputLen = 0 '设置每次从串口缓冲区取的字节为全部
MSComm1.PortOpen = True '打开串口
Command8.Caption = "关闭串口"
'Command8.Value = 0
Combo1.Text = "57600"
'CloseOnComm
MSComm1.Output = "at" & Chr(13) & Chr(10)
Delay 2
'Text4.Text = StrConv (MSComm1.Input, vbUnicode)
Dim aafirst As String
aafirst = MSComm1.Input
If InStr(aafirst, "OK") = 0 Then
MsgBox ("AT不通,请检查mode是否连接成功!")
'Command8.Caption = "打开串口"
Command1.Enabled = 0
Command4.Enabled = 0
Command6.Enabled = 0
Command7.Enabled = 0
Command9.Enabled = 0
Command10.Enabled = 0
Command2.Enabled = 0
Command11.Enabled = 0
Label5.Enabled = 0
Else
aafirst = ""
Text4.SelText = "设备已经连接成功,请测试!" & vbCrLf
' Command8.Caption = "关闭串口"
MSComm1.Output = "at+cnmi=1,1,0,0,1" & vbCrLf
Command1.Enabled = 1
Command4.Enabled = 1
Command6.Enabled = 1
Command7.Enabled = 1
Command2.Enabled = 1
Command9.Enabled = 1
Command10.Enabled = 1
Command11.Enabled = 1
Label5.Enabled = 1
End If
Delay 1
'inData = ""
OpenOnComm
End Sub
Private Sub Command1_Click()
On Local Error Resume Next
CloseOnComm
Dim stt1 'As String
If Text1.Text <> "" Then
MSComm1.Output = "at+csca=""" & Text1.Text & """" & Chr(13)
Delay 3
stt1 = MSComm1.Input
If InStr(stt1, "OK") = 0 Then
MsgBox ("短信中心号码设置不成功,请检查!")
Exit Sub
End If
End If
Delay 1
MSComm1.Output = "at+cmgf=1" & Chr(13)
Delay 2
'If MSComm1.Input = Chr(13) & Chr(13) & Chr(10) & Chr(79) & Chr(75) & Chr(13) & Chr(10) Then
Dim att 'As String
att = MSComm1.Input
' Text4.Text = StrConv(att, vbUnicode)
If InStr(att, "OK") <> 0 Then
MSComm1.Output = "at+cmgs=""" & Text2.Text & """" & Chr(13)
Delay 1
' If MSComm1.Input = Chr(13) & Chr(13) & Chr(10) & Chr(62) & Chr(32) Then
MSComm1.Output = Text3.Text & Chr(26)
Delay 4
Dim stt 'As String
stt = MSComm1.Input
If InStr(stt, "+CMGS") <> 0 Then
MsgBox ("发送成功!")
Else
MsgBox ("发送失败,请检查!")
End If
Else
MsgBox ("短信模式设置不成功,请检查!")
End If
OpenOnComm
End Sub
Public Sub CloseOnComm()
MSComm1.RThreshold = 0
MSComm1.InputMode = comInputModeText
End Sub
Public Sub OpenOnComm()
MSComm1.RThreshold = 1
MSComm1.InputMode = comInputModeBinary
End Sub
Public Sub Delay(HowLong As Date) '延时
Dim temptime As Date
temptime = DateAdd("s", HowLong, Now)
While temptime > Now
DoEvents '让 windows 去处理其他事
Wend
End Sub
Private Sub Text1_Change()
Conv
End Sub
Private Sub Text2_Change()
Conv
End Sub
Private Sub Text3_Change()
Conv
End Sub
Private Sub MSComm1_OnComm() '串口中断
'On Error Resume Next
Static bFlag As Boolean
Static Xbyte As Long
Select Case MSComm1.CommEvent '选择事件
Case comEvReceive '接收到字符
Dim InByte() As Byte '定义一个二进制指针放接收到的数据
InByte = MSComm1.Input '数据转移到指针
Dim temp As Long
Dim temp1 As Long
Dim temp2 As Long
Dim j As Long
Dim counttrue As Integer
counttrue = 1
For j = 0 To UBound(InByte) '循环到指针上标
'' If ifhex = 1 Then '16进制显示处理
' inData = inData & Hex(InByte(j)) & " " '取出一个字节换为16进制显示用
' Else:
If InByte(j) < 128 And bFlag = 0 Then
If InByte(j) = 13 Then
inData = inData & vbCr 'Lf
Else
inData = inData & Chr(InByte(j)) 'ascii码显示处理
End If
Else '此时为一个中文的前半部
If bFlag Then '上次收到半个中文没处理
temp1 = Xbyte
temp2 = InByte(j)
temp = (temp1 * 256 + temp2) - 65536
inData = inData & Chr(temp)
bFlag = 0
Else
If j <> UBound(InByte) Then
temp1 = InByte(j)
temp2 = InByte(j + 1)
temp = (temp1 * 256 + temp2) - 65536
inData = inData & Chr(temp) ' & "(*" & temp & "*) "
j = j + 1 '此次中断收到最后一个字节是前半个中文
Else
Xbyte = InByte(j) '保存该字节
bFlag = 1 '置标志
End If
End If
' End If
End If
' counttrue = 1
Next j
DoEvents
' Delay 1
' flag2 = False
If InStr(inData, "+CMTI:") <> 0 And counttrue = 1 Then
Text4.SelText = "新短信,请接收!" & vbCrLf
' Delay 1
counttrue = counttrue + 1
End If
Text4.SelText = inData '将刚收到的字符串显示出来
inData = ""
Text4.SelStart = Len(Text4.Text) '光标置后
If Check1.Value Then
MSComm1.Output = "at+cnma" & Chr(10) & Chr(13)
End If
Case comEventRxOver '接收缓冲区满的处理
MsgBox "接收缓冲区满了!" '发出警告
End Select
End Sub