- - PR -
RS232C通信でエラー
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2008-02-15 20:06
VisualStudio 6.0 SP6 を使っております。(.NETでなくてすみません)
通信相手の装置が400ms周期で永久的に当方のパソコンにデータ送信していた場合に、 当方パソコンを再起動して通信ソフト(CreateFile)を実行するとエラーが発生して接続できません。 戻り値は「-1」です。GetLastError()でエラー内容を調べると「アクセスが拒否されました。」でした。 通信相手を停止した状態でパソコンを再起動して通信ソフトを起動すると正常に接続できます。 OS:WindowsXP OSが先にCOMポートをオープンをして失敗している為とかでしょうか。 何らか(OS等)によりオープンされているCOMポートをクローズする事は可能でしょうか。 どの様にすれば、正常に接続出来ますでしょうか。 [ メッセージ編集済み 編集者: おしろ 編集日時 2008-02-15 20:21 ] | ||||
|
投稿日時: 2008-02-18 16:06
CreateFileのパラメータ(共有モード、作成方法)は正しいですか?
MSDN−CreateFile 仮に再オープンに成功したとして、通信自体のリカバリ機能はあるんですか? | ||||
|
投稿日時: 2008-02-18 16:40
回答ありがとうございます。
下記引数にて、共有モードにしておりますが、失敗してしまいます。 CreateFile( "COM1" , GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 ); ファイルの属性を、下記に変更しても駄目でした。 「FILE_ATTRIBUTE_NORMAL」→「FILE_ATTRIBUTE_READONLY」 オープンにさえ成功すれば、通信は正常に動作する様になっています。 [ メッセージ編集済み 編集者: おしろ 編集日時 2008-02-18 16:43 ] | ||||
|
投稿日時: 2008-02-18 18:08
例えばハイパーターミナルやTeraTermなど他の通信ソフトを使った場合は
どうでしょうか。OSレベルでポートを握っているのなら他のソフトでも エラーになりそうな気がしますが。 あとは、ミニマルなプログラムで、他の操作をせずにCreateFileだけを行った ときにもやっぱり同様のエラーになるのか、あたりを調べてみることになるかと 思いますがいかがでしょう。
| ||||
|
投稿日時: 2008-02-18 18:23
TeraTermを使用した場合も、同様にオープン失敗しました。
現状の処理も、main処理の先頭で、CreateFileを実行している だけなので、記述頂いた処理と同様です。 やはり、OSレベルでポートを握ってしまっているのでしょうか。 [ メッセージ編集済み 編集者: おしろ 編集日時 2008-02-18 18:40 ] | ||||
|
投稿日時: 2008-02-18 19:26
レガシーなPnPではCOMポートを順番にオープンして、特定の通信データを受信できるか否かで判断している場合があります。定周期で送信しているデータがそれらの特徴を見たいしているために語検出することは、十分に考えられるでしょう。 あるいは起動途中の妙なタイミングでデータを受信したためにドライバを正常にロードできないといった不具合かもしれません。USBから232C変換するような製品は制約が多いですが、大丈夫ですか? まずはCOMポートを開いているプロセスを特定する必要があると思います。 どうやってと言うのは、私も知らないので聞かないでください。 | ||||
|
投稿日時: 2008-02-18 19:53
繋がっているものと誤認識されちゃって苦労したことがあったようななかったような。 デバイスマネージャでシリアルマウスが居たりしません? #「シリアルマウス」で検索したらこんなのが引っかかったんで追記 Windows XP の起動時にシリアル マウスの検出を抑止する方法http://support.microsoft.com/kb/889045/ja 許されるなら、USB-シリアルアダプタとかLAN-シリアルアダプタ+COMポートエミュレータを 使うといろいろと起動時のタイミングが変わって挙動が変わる可能性もあるとは思いますが、 かなり対症療法的ですね。甕星さんもおっしゃっているようにシリアルアダプタは そこはかとなく怪しさもありますし。 [ メッセージ編集済み 編集者: TAD 編集日時 2008-02-18 20:02 ] | ||||
|
投稿日時: 2008-02-18 20:05
デバイスマネージャにシリアルマウスはいません。
"COM1"を指定し、ハンドルを強制クローズする関数等は存在しますでしょうか。 |