2009-02-20 15 views
6

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

PowerPointのアクションボタンからシリアルポート経由で簡単な文字列を送信できる営業担当者が必要です。私は通常、VBAを使用しません、特にこのようなもののために。通常、私はそれをある種のアプリケーションに変えますが、実際にはその考えが悪いとは思わないのです。これは、プロジェクターや他の営業担当者や技術者以外の人と話しながら、このデバイスをデモするための便利なツールとなります。また、このセールスマンは、VBAやPowerPointのプレゼンテーションを少し修正するだけでも問題はありませんが、.NETアプリケーションを再コンパイルすることはできません。

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

これは複数のユーザーのコンピュータで実行する必要があるため、他のコンピュータに簡単に転送できるのはいいと思います。私はそれがOffice 2007とWindows XP上で動かなければならないと言えるだろう。しかし、他のものとの互換性は素晴らしいボーナスでしょう。

これはどのように処理する必要がありますか?良いヒントやトリックですか?ライブラリの推奨?

答えて

11

Win32 APIはシリアルポートをファイルとして扱います。 VBA内でこれらのAPI関数を呼び出すことにより、シリアルポートに直接アクセスできます。私は古い.NETアプリケーションでこれを行う必要がありましたが、VBAも変わりません。

私はこのサイトであなたのためにそれをハッシュアウトするのではなく、ここで私が長年にわたって執筆してきたリファレンスです。 How to perform serial port communications in VBA

+0

+1実例があるサイトの場合。 – Oorang

0
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 = "[email protected]@@@@@@@" 
      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を使用したときに、OPENが実際にボーレートを設定するかどうかはわかりません。 私のCOMポートは、BASYS3プロトタイピングキットへのUSB接続です。それは9600に文字を吐き出しています.36文字はCRで終わります。私はランダムに9文字のコマンドを送ることができます。上記のコードでは、新しい行を受け取るたびにこれらのコマンド文字列を生成します。 どのキャラクターを送るか選択する方法はちょっと大変です:もっと良い方法はキャラクターポインターといくつかの文字を持ち、それらが等しくなって両方を0にすることです。

+0

COMポートがランダムとして開かれている場合は、受信する文字があるときにEOFが指示します。つまり、Null文字を受け取ることがあります。 EOFには、待っている文字がないと言われています。 –

+0

OPENのボーレートを設定しても動作しないようです。しかし、シェル "mode.com com7:9600、n、8,1"は、 "COM7:OPEN"を実行する前に1秒待つと動作します。これはすべてExcel 2010です。 –

+0

COMポートでEOFをランダムに更新: EOFのように受信されたキャラクタは変化しませんが、GETのステータスは反映されます。したがって、GET#1 ,, vByteの後、vByteが有効な場合はEOFはFALSEになります。 –

関連する問題