シリアル通信でタイムアウト処理を行うには?


カンキチ  2009-09-10 19:22:51  No: 146307

Windows XP、VB.NET2003でAPI関数によるシリアル通信プログラムを作っています。(コンソールアプリケーションです)
データ受信時にタイムアウトが発生した場合には、エラー処理(「受信失敗」と表示)を行いたいのですが、タイムアウトが発生してもReadFile関数がTrueを返すため、エラー処理を行えません。
タイムアウト発生を捕まえて「受信失敗」と表示できるようにするにはどのようにしたらよいのでしょうか?
初歩的な質問ですいませんが、よろしくお願いします。

<コード(一部)>
  '取得したCOMMTIMEOUTS構造体のプロパティの値を修正する
  MyCommTimeouts.ReadIntervalTimeout = 0
  MyCommTimeouts.ReadTotalTimeoutConstant = 500
  MyCommTimeouts.ReadTotalTimeoutMultiplier = 0
  MyCommTimeouts.WriteTotalTimeoutConstant = 0
  MyCommTimeouts.WriteTotalTimeoutMultiplier = 0

  '修正したCOMMTIMEOUTS構造体のプロパティを基にタイムアウトを設定する
  Success = SetCommTimeouts(hSerialPort, MyCommTimeouts)
  If Success = False Then
      Throw New CommException("タイムアウトの設定に失敗")
  End If

  'データ送信
  Buffer(0) = &H5
  Success = WriteFile(hSerialPort, Buffer, 1, BytesWritten, IntPtr.Zero)
  If Success = False Then
      Throw New CommException("送信失敗")
  Else
      Console.WriteLine("ENQ送信")
  End If

  'データ受信
  Success = ReadFile(hSerialPort, Buffer, 1, BytesRead, IntPtr.Zero)
  If Success = False Then
      Throw New CommException("受信失敗")
  ElseIf Buffer(0) = &H6 Then
      Console.WriteLine("ACK受信")
  End If


オショウ  2009-09-10 19:43:26  No: 146308

ReadFile APIの、Overlapped使わないと、ReadFileで
エラーが返らなかったはずです。

2003時代のシリアル通信コードを見て・・・
そう書いてましたので。

以上。参考まで・・・


オショウ  2009-09-10 19:46:28  No: 146309

http://www.corradocavalli.cjb.net/

ここでダウンロードできるモジュールが参考に
なるかと・・・(そのもの)

以上。


カンキチ  2009-09-10 20:54:54  No: 146310

オショウさん、ご回答ありがとうございます。
教えて頂いたサイトを参考に勉強させていただきます。
(自分の頭の中はVB6.0なので時間がかかるかもしれません)
結果が出れば報告したいと思います。


オショウ  2009-09-10 21:18:19  No: 146311

ダウンロードするリンクが解りにくいかも・・・

http://www.codeworks.it/net/rs232.zip

以上。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加