• ベストアンサー
※ 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です。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

WinApiの定義は正しいですか。 http://support.microsoft.com/kb/165942/ja 以下にもサンプルがあります。 http://www.winapi-database.com/Network/RS-232C/RS232C.html

noname#230227
質問者

補足

回答ありがとうございます。 最初、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

関連するQ&A