⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 atcommandbase.vb

📁 vc实现串口收发短信
💻 VB
📖 第 1 页 / 共 2 页
字号:
'//////////////////////////////////////////////////////////////////////////
'// 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 + -