質問

VBAからシリアルポートにアクセスする最良の方法は何ですか?

PowerPointのアクションボタンからシリアルポート上に簡単な文字列を送信できる営業担当者の一部が必要です。特にこのようなもののために、私は一般的にVBAを使用していません。通常、私はそれをある種のアプリケーションに変えますが、実際にはアイデアがそれほど悪いとは思いません。プロジェクターを使用している間、他の営業担当者や非技術者と話をするときに、このデバイスをデモするための便利なツールになります。また、この営業担当者は、VBAまたはPowerPointプレゼンテーションをわずかに変更するのに問題はありませんが、.NETアプリケーションの再コンパイルも同様ではありません。

アクションに関するプレゼンテーションから実行されるバッチファイルを使用して実行できることは知っていますが、それは私をあまり幸せにしません。おそらくCOMオブジェクトにアクセスしてそこから実行できると思いますが、VBAで使用する最新の最高のライブラリでは現実的ではありません。接続を送信して閉じます。

これは複数の人のコンピューターで実行する必要があるため、他のマシンに簡単に輸送できる場合は素晴らしいことです。 Office 2007とWindows XPで実行する必要があると言うことができるはずです。しかし、他のものとの互換性は素晴らしいボーナスです。

これを処理するにはどうすればよいですか?良いヒントやコツはありますか?図書館の推奨事項?

役に立ちましたか?

解決

Win32 APIは、シリアルポートをファイルとして処理します。 VBA内からこれらのAPI関数を呼び出すことにより、シリアルポートに直接アクセスできます。私は古い.NETアプリケーションのためにこれをしなければなりませんでしたが、VBAも例外ではありません。

このサイトであなたのためにそれをハッシュするのではなく、ここに私が長年にわたってハングした参照があります。 VBAでシリアルポート通信を実行する方法

他のヒント

Sub Stinky()
Dim COM_Byte As Byte
Dim Received_Lines As Long
Dim Input_Buffer As String
Dim Output_Buffer As String
Dim Chars2Send As Long
Dim CharsRemaining As Long
Dim lfsr As Long
    Open "COM7:9600,N,8,1" For Random As #1 Len = 1
    Input_Buffer = ""
    CharsRemaining = 0
    Do
    Get #1, , COM_Byte
    If COM_Byte Then
        If COM_Byte = 13 Then           ' look for CR line termination
            Debug.Print Input_Buffer, Now   ' print it
            Input_Buffer = ""               ' and clear input buffer
        '   generate some output (9 characters)
            lfsr = &H3FFFFFFF - 2 ^ (Received_Lines And 15)
            Output_Buffer = "?@@@@@@@@"
            Chars2Send = 9
            CharsRemaining = 9
            For j = 0 To 2
                Mid(Output_Buffer, 2 + j, 1) = Chr(Asc(Mid(Output_Buffer, 2 + j, 1)) + (31 And Int(lfsr / 32 ^ (2 - j))))
            Next j
            Debug.Print Output_Buffer
        '   show what I generated
            Received_Lines = Received_Lines + 1 ' keep track of received line count
        Else
            Input_Buffer = Input_Buffer & Chr(COM_Byte) ' assemble output buffer
        '   process any characters to send
            If CharsRemaining Then
                CharsRemaining = CharsRemaining - 1
                COM_Byte = Asc(Mid(Output_Buffer, Chars2Send - CharsRemaining, 1))
                Put #1, , COM_Byte
            End If
        End If
    End If
    DoEvents
    Loop
    Close
End Sub

これは私のために働きます。私が最初にTeratermを使用したので、オープンが実際にボーレートを設定するかどうかはわかりません。私のcomポートは、basys3プロトタイピングキットへのUSB接続です。 CRで終わる36文字の記録である9600でキャラクターを吐き出します。 9文字のコマンドをランダムに送信できます。上記のコードでは、新しいラインを受け取るたびにこれらのコマンド文字列を生成します。どのキャラクターを送信するかを選択した方法は少し不格好です。おそらくより良い方法は、キャラクターポインターと多くのキャラクターを持つことであり、それらが等しくなり、両方をゼロに設定することです。

以下は、PCシリアルポートでメッセージを送信および受信できるVBAコードの簡単なモジュールです。これはそれほどエレガントではありませんが、シンプルであり、ExcelとWindowsの最新のバージョンで動作するはずです。

機能を拡張し、メッセージを保存または解析するために、自分で残されています。これは、シリアルポートを扱う低レベルのものを示しています。

最初の5行では、ミリ秒の「スリープ」ライブラリ関数(Excelバージョンに基づく)を宣言します。

SerialPort()Subroutineは、ポートを開き、データを送信し、データを受信し、データを再試行するための手順の概要を示しています(「ファイルの終了」エラーが実際に実行されないことを示します)。ポート。


#If VBA7 Then ' Excel 2010 or later
    Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal Milliseconds As LongPtr)
#Else ' Excel 2007 or earlier
    Public Declare Sub Sleep Lib "kernel32" (ByVal Milliseconds As Long)
#End If

Public Sub SerialPort()
    ' open a COM port, transmit a message, gather results, close the port.

    ' open the COM port as file #1
    Debug.Print "Open COM port 4"
    Open "COM4:115200,N,8,1" For Binary Access Read Write As #1

    transmit$ = Chr(2) + "Hello, World." + Chr(13)
    receiveDummy$ = "~~~"

    ' transmit a message
    Put #1, , transmit$
    Debug.Print "Message sent."

    ' wait a bit for a response
    Sleep 100

    ' check for received message
    Debug.Print "Look for incoming message."
    On Error Resume Next
    Do While True
        receive$ = receiveDummy$  'dummy value
        Input #1, receive$
        If receive$ = receiveDummy$ Then Exit Do  'the string didn't change, so move on
        Debug.Print receive$
    Loop
    On Error GoTo 0

    ' do it again to show that the empty input queue doesn't stop the flow
    Debug.Print "Look again for incoming message (should not stop on error)."
    On Error Resume Next
    Do While True
        receive$ = receiveDummy$  'dummy value
        Input #1, receive$
        If receive$ = receiveDummy$ Then Exit Do  'the string didn't change, so move on
        Debug.Print receive$
    Loop
    On Error GoTo 0

    ' close the serial port
    Debug.Print "Close COM port."
    Close #1

    Debug.Print "Done."
End Sub
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top