- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Win32APIのWriteFile()でRS-232Cポートにデータ)
Win32APIのWriteFile()でRS-232Cポートにデータ送信エラーが発生
このQ&Aのポイント
- RS-232Cポートへのデータ送信で、WriteFile()関数を使用する際にエラーが発生しています。指定したハンドル番号が無効だからエラーが出るようですが、CreateFile()で取得したハンドル番号を指定していますので、何が原因か分かりません。
- エラーコードは6(ERROR_INVALID_HANDLE)であり、ハンドルが無効であることを示しています。これがなぜ起こるのかについてのヒントが欲しいです。
- 環境はVMWare 5.5とWindows 2000で、使用言語はVisual Basic 6.0です。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
WinApiの定義は正しいですか。 http://support.microsoft.com/kb/165942/ja 以下にもサンプルがあります。 http://www.winapi-database.com/Network/RS-232C/RS232C.html
補足
回答ありがとうございます。 最初、MSCommコントロールと同じように使えるようなクラスを作っていたのですが、原因を調べるために、Win32APIをそのまま呼び出して使っています。 現在は、Form_Load()で通信ポートをオープンし、TimerコントロールのTimerイベントで1秒ごとにデータを送信しています。 現時点で分かったことは、 1. WriteFile()で送信するためのバイト配列変数をローカル変数で、配列の大きさを指定して宣言 → データを送信しています(別のシリアルポートから、ハイパーターミナルで受信できました) 2. 1のバイト配列変数の配列の大きさを指定せず、ReDimで後から指定 →VB6が異常終了します 3. バイト配列変数をモジュール変数で、配列の大きさを指定して宣言 → データ送信せず。GetLastError()は0(ERROR_SUCCESS)を返します。 4. 3のモジュール変数の配列の大きさを指定せず、ReDimで後から指定 → データ送信せず。GetLastError()は0(ERROR_SUCCESS)を返します。 以下プログラムです: Option Explicit Dim mPortHandle As Long 'Dim lOutData(4) As Byte Private Sub Form_Load() mPortHandle = CreateFile("COM1", GENERIC_READ Or GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0) ' lOutData(0) = Asc("A") ' lOutData(1) = Asc("B") ' lOutData(2) = Asc("C") ' lOutData(3) = Asc("D") ' lOutData(4) = Asc("F") Debug.Print "Handle: " & mPortHandle End Sub Private Sub Form_Terminate() Dim lResult As Long lResult = CloseHandle(mPortHandle) End Sub Private Sub Form_Unload(Cancel As Integer) Dim lResult As Long lResult = CloseHandle(mPortHandle) If lResult > 0 Then Debug.Print vbCrLf & "Close: " & mPortHandle End If End Sub Private Sub Timer1_Timer() Dim lResult As Long Dim lWritten As Long Dim lOutData(4) As Byte ' Dim lOutData() As Byte ' ReDim lOutData(4) lOutData(0) = Asc("A") lOutData(1) = Asc("B") lOutData(2) = Asc("C") lOutData(3) = Asc("D") lOutData(4) = Asc("F") lResult = WriteFile(mPortHandle, lOutData(0), 5, lWritten, 0) Debug.Print "Written: " & lWritten & vbTab; If lResult = 0 Then Dim lEr As Long lEr = GetLastError() Debug.Print "Error: " & lEr & vbTab; End If End Sub