シリアル通信のハンドル


なかお  2006-08-19 04:27:04  No: 96337

お世話になります。
シリアル通信で自分では解決出来ない問題に直面しています。
WIN98(別PC)では通信出来るのですが、XPだと出来ません。
GetLastErrorで調べると「ハンドルが無効」
hComm = CreateFile(comname, GENERIC_READ Or GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0)
hCommの値が毎回変わってしまいます。
他のソフトでは正常に動作するので、物理的な不具合は無いと思います。
確認するのは週明けになると思いますが、宜しくお願いします。


なかお  2006-08-19 04:31:24  No: 96338

追加
VB  5.0です。
宜しくお願いします。


オショウ  2006-08-19 20:31:04  No: 96339

わざわざWin32 API しなくても、VB5 には、MSCOMM32.ocxあったはず
ですが・・・

http://support.microsoft.com/kb/410769/JA/

尚、CreateFile等で返されるハンドルは、毎回変わるのは当然です。
CreateFileでhCommのハンドルとして何が入って返ってくるかで、与え
ているパラメータに異常がある場合が大抵です。
comnameに何と言う文字列を代入したか・・・ですが。

楽に行うには、MSCOMM32.ocxを使うか、グレープシティー(旧文化オ
リエント)の、PDQ Commを使うか・・・現在は販売されていないので
Active Commでしょうか・・・

因みに、WinXP で、VB5の動作保障は無かったのではないでしょうか?
知っている方、コメントお願いします。

以上。


なかお  2006-08-21 18:30:30  No: 96340

オショウさん、有難う御座います。
MSCOMM32.ocxが有るのは知っていますが、APIを使いたいだけです。
WIN98では同じハンドルが返っていたので、そこが問題かと思いました。
指摘された部分は以下のとおりです。
Public comname As String
comname = "COM1"  
「WinXPでVB5を使う場合・・・」と言うのが
MSにあったような気がするのですが
忘れてしまい、検索したのですが見つかりませんでした。
何方か覚えてる方いませんか?


K.J.K.  2006-08-21 21:42:34  No: 96341

どの関数の呼び出しの後で、「ハンドルが無効」というエラーが
出てるのでしょうか? 少なくともCreateFileではないですよね。

もし、CreateFileで失敗するのであれば、その戻り値は
INVALID_HANDLE_VALUEで「一定」になるはずですよね。

というわけで、もうちょっと切り分けが必要でしょう。


なかお  2006-08-22 01:58:55  No: 96342

K.J.Kさん、有難う御座います。

CreateFileの後

通信設定
stDCB.BaudRate = 9600 
stDCB.ByteSize = 8
stDCB.Parity = 0
stDCB.StopBits = 0
Ret = SetCommState(hComm, stDCB)

タイムアウト設定
TimeOut.ReadIntervalTimeout = 500    TimeOut.ReadTotalTimeoutMultiplier = 0    TimeOut.ReadTotalTimeoutConstant = 500    TimeOut.WriteTotalTimeoutMultiplier = 0    TimeOut.WriteTotalTimeoutConstant = 500  
Ret = SetCommTimeouts(hComm, TimeOut)
ここまではエラーが出ません。

その後出力。
Dim MsgData() As Byte
Dim wData() As Byte
Dim wLen As Long
Dim dLen As Long
MsgData(0)=Val("&H0C")
MsgData(1)=Val("&H0D")
wData=MsgData
dLen = UBound(wData)
Ret = WriteFile(hComm, wData(0), dLen, wLen, 0)
この後にエラーが出てしまいます。

それまでは大丈夫なのですが、XPでVB5は無理でしょうか?


大吉末吉  2006-08-22 04:19:27  No: 96343

なかお さん  こんにちは。

> Ret = WriteFile(hComm, wData(0), dLen, wLen, 0)
> この後にエラーが出てしまいます。
という事は、この段階で、ハンドル「hComm」が無効になってしまっているのでは?

例えば、間違ってCloseしているとか、変数のスコープが間違っていて、別の変数を参照しているとかはありませんか?

> その後出力。
> Dim MsgData() As Byte

と言う記述で、
『「CreateFile」と「WriteFile」を別のタイミング(別のプロシージャ)で実行しているのかな?』
と思ったものですから・・・

> 「WinXPでVB5を使う場合・・・」と言うのが
> MSにあったような気がするのですが

私は、一度も見た記憶がありませんね。

> XPでVB5は無理でしょうか

それは、貴方御自身で判断するしかありません。

何故なら、MSの公式見解は、

「『VB5の開発環境』は、XPには『対応していません』」
「お客様の開発されたアプリケーションの動作に関して、弊社では一切の保証はいたしません」

ですから。

参考:
「開発ツール対応 OS 一覧」
http://www.microsoft.com/japan/msdn/vs_previous/vstudio/techinfo/toolos.htm


なかお  2006-08-22 19:44:17  No: 96344

大吉末吉さん、有難う御座います。

VB5のXP対応は私の勘違いですね。
他のプログラムだったのかも知れません。

「CreateFile」と「WriteFile」は同一プロジャーです。

一番の疑問はWIN98ではエラーが出ないのです。

やはりWIN98を使ったほうが良いのかも知れませんね。
でも、もう少し四苦八苦してみます。


大吉末吉  2006-08-22 21:54:01  No: 96345

なかお さん  こんにちは。

これまでのやり取りで、気になる点がいくつかありますので、あげておきますね。

> GetLastErrorで調べると
VBからのDLL呼び出し時には、エラーコードは「GetLastError関数」ではなく、「Errオブジェクト」の「LastDLLError プロパティ」で確認しなければならないのではありませんか?
#VBがDLL呼び出し時に、内部的にAPIを余分に実行する場合があり、「GetLastError関数」が、別の値に置き変わってしまう場合があるそうです。

って事で、念の為確認ですが、
> 「ハンドルが無効」
エラーコードは、具体的に何番なんでしょうか?

> Ret = WriteFile(hComm, wData(0), dLen, wLen, 0)
> この後にエラーが出てしまいます。
って事は、Retが「0」って事なんですよね?
「WriteFile」は正常に動作して、その後で別のエラーが発生・・・って意味じゃないですよね?

> Dim MsgData() As Byte
> Dim wData() As Byte
> Dim wLen As Long
> Dim dLen As Long
> MsgData(0)=Val("&H0C")
> MsgData(1)=Val("&H0D")
> wData=MsgData
> dLen = UBound(wData)
> Ret = WriteFile(hComm, wData(0), dLen, wLen, 0)

この部分のコードって省略されているんでしょうか??
「MsgData()」はReDimされていませんし、
「dLen」は「UBound」の値そのままなので、実際より1小さいのでは?

これではWin98でも、(エラーにならなかったとしても)期待どうりの動作にならないのでは?


なかお  2006-08-23 03:50:51  No: 96346

大吉末吉さん、こんにちは。

「LastDLLError プロパティ」は知りませんでした。
まだまだ、勉強が足りないですね。

GetLastErrorのエラーは「6」です。

Ret = WriteFile(hComm, wData(0), dLen, wLen, 0)
Retは0です。

貼り付けてコメントの書き込みを消した時に「−1」を
一緒に消してしまいました。
dLen = UBound(wData)-1

実際には「CreateFile」の直前に別プロジャーで下記は処理しています。
ReDim  MsgData(0 To Mdada)
MsgData(0)=Val("&H0C")
MsgData(1)=Val("&H0D")
(もっと複雑ですが)

Win98ではエラーも無く、期待どうりの動作をしてくれます。
送信したデータも受信側で正常に認識してくれます。

明日から出張のため「LastDLLError」は来週でにも
調べて、試してみたいと思います。


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

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






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