📄 atcommandbase.vb
字号:
'//////////////////////////////////////////////////////////////////////////
'// Use at your own risk //
'// www.hesicong.net //
'// Copyright Dreamworld. You can use this program freely but no in //
'// commerial use without my permission. //
'// Authoer: hesicong //
'// Date: 2007-2-25 //
'//////////////////////////////////////////////////////////////////////////
Imports System.IO
Imports System.Text
Imports System.Text.Encoding
Imports System.Text.RegularExpressions
Imports System.Threading
Namespace Dreamworld.Mobile
Public Class ATCommandBase
Implements IDisposable
Private myPhone As Mutex = New Mutex(False)
Private mSerialStream As Ports.SerialPort
Private mLastError As String
Private mTimeOut As Integer = 20000
Private mCancel As Boolean = False
Private mCancelResponse As String = "ERROR"
''' <summary>
''' Indicate a new message is arrived. Message will be a status report or a new SMS.
''' Some phone will only return the index and some phone will return content.
''' </summary>
''' <param name="index">Index of this message. If not provided, content should be provided.</param>
''' <param name="content">Content of message. If index is not provided, content should provided.</param>
''' <remarks></remarks>
Public Event NewMessageArrived(ByVal index As Integer, ByVal content As String)
''' <summary>
''' Initialize port and enable monitor.
''' </summary>
''' <param name="port">Port of phone connected.</param>
''' <param name="baudrate">Speed of connection.</param>
''' <param name="timeOut">Time out of AT command, in MillionSeconds. Default is 20s. If some AT commands execute longer than 20s, you should provide a more larger value.</param>
''' <remarks></remarks>
Sub New(ByVal port As String, ByVal baudrate As Integer, ByVal timeOut As Integer)
mSerialStream = New Ports.SerialPort(port, baudrate)
mSerialStream.Open()
mSerialStream.RtsEnable = True
mSerialStream.DtrEnable = True
mTimeOut = timeOut
mSerialStream.ReadExisting()
EnableMonitor()
End Sub
''' <summary>
''' Initialize port and enable monitor.
''' </summary>
''' <param name="portStream">Port stream of a operable port.</param>
''' <param name="timeOut">Time out of AT command, in MillionSeconds. Default is 20s. If some AT commands execute longer than 20s, you should provide a more larger value.</param>
''' <remarks></remarks>
Sub New(ByVal portStream As IO.Ports.SerialPort, ByVal timeOut As Integer)
mSerialStream = portStream
If portStream.IsOpen = False Then
mSerialStream.Open()
mSerialStream.RtsEnable = True
mSerialStream.DtrEnable = True
End If
mTimeOut = timeOut
mSerialStream.ReadExisting()
EnableMonitor()
End Sub
''' <summary>
''' Close monitor and port.
''' </summary>
''' <returns></returns>
''' <remarks></remarks>
Public Function Close() As Boolean
DisableMonitor()
mSerialStream.Close()
End Function
''' <summary>
''' Return last error of AT command
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public ReadOnly Property LastError() As String
Get
Return mLastError
End Get
End Property
''' <summary>
''' Set or returns timeout of AT command
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property TimeOut() As Integer
Get
Return mTimeOut
End Get
Set(ByVal value As Integer)
mTimeOut = value
End Set
End Property
#Region "Inputbuffer"
''' <summary>
''' inputbuffer
''' </summary>
Private mInputBuffer As New StringBuilder
''' <summary>
''' Thread to monitor a inputbuffer
''' </summary>
''' <remarks></remarks>
Private mInputBufferMonitorThread As Thread
''' <summary>
''' Indicate monitor should be closed
''' </summary>
''' <remarks></remarks>
Private mExitMonitor As Boolean
''' <summary>
''' Strings to notify
''' </summary>
''' <remarks></remarks>
Private mStringToNotify As String() = {"+CMS ERROR", "+CMTI:", "+CMT:", "+CDS:", "+CDSI:"}
''' <summary>
''' Enum associated with mStringToNotify. Indicating the index of the string
''' </summary>
''' <remarks></remarks>
Private Enum StringToNotifyEnum
CMSERROR
CMTI
CMT
CDS
CDSI
End Enum
''' <summary>
''' Event when a certain string appeared
''' </summary>
''' <param name="strToNotify"></param>
''' <param name="buffer"></param>
''' <remarks></remarks>
Private Event StringNotify(ByVal strToNotify As StringToNotifyEnum, ByVal buffer As String)
''' <summary>
''' Monitor a certain string. Mosted used in monitor a incoming msg and get last error message.
''' Use EnableMonitor function or DisableMonitor function to enable or disable this.
''' </summary>
''' <remarks></remarks>
Private Sub InputBufferMonitorThread()
Do
Thread.Sleep(1)
If mExitMonitor Then Exit Do
mInputBuffer.Append(mSerialStream.ReadExisting)
'Monitor a certain string
Dim bufferString As String = mInputBuffer.ToString
'Dim bufferString As String = mSerialStream.ReadLine()
For i As Integer = 0 To mStringToNotify.Length - 1
If bufferString.IndexOf(mStringToNotify(i)) > 0 Then
RaiseEvent StringNotify(CType(i, StringToNotifyEnum), bufferString)
End If
Next
Loop
End Sub
''' <summary>
''' Enable monitor. This will start a thread to monitor certain strings.
''' </summary>
''' <remarks></remarks>
Public Sub EnableMonitor()
mExitMonitor = False
mInputBufferMonitorThread = New Thread(AddressOf InputBufferMonitorThread)
mInputBufferMonitorThread.Name = "InputBuffer Monitor"
mInputBufferMonitorThread.Start()
End Sub
''' <summary>
''' Disable string monitor. When you want to enter DATA mode like OBEX, you must turn string monitor off.
''' </summary>
''' <remarks></remarks>
Public Sub DisableMonitor()
mExitMonitor = True
End Sub
''' <summary>
''' Clear input buffer
''' </summary>
''' <remarks></remarks>
Private Sub ClearInputBuffer()
mInputBuffer = New StringBuilder
End Sub
''' <summary>
''' Handle string to notify
''' </summary>
''' <param name="strToNotify"></param>
''' <param name="buffer"></param>
''' <remarks></remarks>
Private Sub StringNotifyHandler(ByVal strToNotify As StringToNotifyEnum, ByVal buffer As String) Handles Me.StringNotify
Select Case strToNotify
Case StringToNotifyEnum.CMSERROR
'Get last error
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -