- PR -

RS232C通信でエラー

投稿者投稿内容
おしろ
会議室デビュー日: 2007/10/27
投稿数: 14
投稿日時: 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 ]
未記入
大ベテラン
会議室デビュー日: 2006/12/15
投稿数: 157
投稿日時: 2008-02-18 16:06
CreateFileのパラメータ(共有モード、作成方法)は正しいですか?

MSDN−CreateFile

仮に再オープンに成功したとして、通信自体のリカバリ機能はあるんですか?
おしろ
会議室デビュー日: 2007/10/27
投稿数: 14
投稿日時: 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 ]
TAD
ベテラン
会議室デビュー日: 2007/03/20
投稿数: 52
お住まい・勤務地: 海のそば
投稿日時: 2008-02-18 18:08
例えばハイパーターミナルやTeraTermなど他の通信ソフトを使った場合は
どうでしょうか。OSレベルでポートを握っているのなら他のソフトでも
エラーになりそうな気がしますが。

あとは、ミニマルなプログラムで、他の操作をせずにCreateFileだけを行った
ときにもやっぱり同様のエラーになるのか、あたりを調べてみることになるかと
思いますがいかがでしょう。
コード:
#include "Windows.h"
#include "stdio.h"

int main(int argc, char* argv[])
{
	int ret=0;
	HANDLE h=CreateFile("COM1", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 ); 
	if(h==INVALID_HANDLE_VALUE){
		ret=GetLastError();
		printf("ERR=%d\n",ret);
	}else{
		printf("SUCCESS\n");
		CloseHandle(h);
	}
	return ret;
}

みたいな感じで。(合ってるかな?)
おしろ
会議室デビュー日: 2007/10/27
投稿数: 14
投稿日時: 2008-02-18 18:23
TeraTermを使用した場合も、同様にオープン失敗しました。

現状の処理も、main処理の先頭で、CreateFileを実行している
だけなので、記述頂いた処理と同様です。

やはり、OSレベルでポートを握ってしまっているのでしょうか。


[ メッセージ編集済み 編集者: おしろ 編集日時 2008-02-18 18:40 ]
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2008-02-18 19:26
引用:

おしろさんの書き込み (2008-02-18 18:23) より:
やはり、OSレベルでポートを握ってしまっているのでしょうか。


レガシーなPnPではCOMポートを順番にオープンして、特定の通信データを受信できるか否かで判断している場合があります。定周期で送信しているデータがそれらの特徴を見たいしているために語検出することは、十分に考えられるでしょう。

あるいは起動途中の妙なタイミングでデータを受信したためにドライバを正常にロードできないといった不具合かもしれません。USBから232C変換するような製品は制約が多いですが、大丈夫ですか?

まずはCOMポートを開いているプロセスを特定する必要があると思います。
どうやってと言うのは、私も知らないので聞かないでください。
TAD
ベテラン
会議室デビュー日: 2007/03/20
投稿数: 52
お住まい・勤務地: 海のそば
投稿日時: 2008-02-18 19:53
引用:
レガシーなPnPではCOMポートを順番にオープンして、特定の通信データを受信できるか否かで判断している場合があります。定周期で送信しているデータがそれらの特徴を見たいしているために語検出することは、十分に考えられるでしょう。

そういえば昔(9xの時代だったか)、なにかの拍子にシリアルポートにシリアルマウス(死語)が
繋がっているものと誤認識されちゃって苦労したことがあったようななかったような。
デバイスマネージャでシリアルマウスが居たりしません?
#「シリアルマウス」で検索したらこんなのが引っかかったんで追記
Windows XP の起動時にシリアル マウスの検出を抑止する方法http://support.microsoft.com/kb/889045/ja


許されるなら、USB-シリアルアダプタとかLAN-シリアルアダプタ+COMポートエミュレータを
使うといろいろと起動時のタイミングが変わって挙動が変わる可能性もあるとは思いますが、
かなり対症療法的ですね。甕星さんもおっしゃっているようにシリアルアダプタは
そこはかとなく怪しさもありますし。


[ メッセージ編集済み 編集者: TAD 編集日時 2008-02-18 20:02 ]
おしろ
会議室デビュー日: 2007/10/27
投稿数: 14
投稿日時: 2008-02-18 20:05
デバイスマネージャにシリアルマウスはいません。

"COM1"を指定し、ハンドルを強制クローズする関数等は存在しますでしょうか。

スキルアップ/キャリアアップ(JOB@IT)