お世話になります。
シリアル通信で自分では解決出来ない問題に直面しています。
WIN98(別PC)では通信出来るのですが、XPだと出来ません。
GetLastErrorで調べると「ハンドルが無効」
hComm = CreateFile(comname, GENERIC_READ Or GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0)
hCommの値が毎回変わってしまいます。
他のソフトでは正常に動作するので、物理的な不具合は無いと思います。
確認するのは週明けになると思いますが、宜しくお願いします。
追加
VB 5.0です。
宜しくお願いします。
わざわざWin32 API しなくても、VB5 には、MSCOMM32.ocxあったはず
ですが・・・
http://support.microsoft.com/kb/410769/JA/
尚、CreateFile等で返されるハンドルは、毎回変わるのは当然です。
CreateFileでhCommのハンドルとして何が入って返ってくるかで、与え
ているパラメータに異常がある場合が大抵です。
comnameに何と言う文字列を代入したか・・・ですが。
楽に行うには、MSCOMM32.ocxを使うか、グレープシティー(旧文化オ
リエント)の、PDQ Commを使うか・・・現在は販売されていないので
Active Commでしょうか・・・
因みに、WinXP で、VB5の動作保障は無かったのではないでしょうか?
知っている方、コメントお願いします。
以上。
オショウさん、有難う御座います。
MSCOMM32.ocxが有るのは知っていますが、APIを使いたいだけです。
WIN98では同じハンドルが返っていたので、そこが問題かと思いました。
指摘された部分は以下のとおりです。
Public comname As String
comname = "COM1"
「WinXPでVB5を使う場合・・・」と言うのが
MSにあったような気がするのですが
忘れてしまい、検索したのですが見つかりませんでした。
何方か覚えてる方いませんか?
どの関数の呼び出しの後で、「ハンドルが無効」というエラーが
出てるのでしょうか? 少なくともCreateFileではないですよね。
もし、CreateFileで失敗するのであれば、その戻り値は
INVALID_HANDLE_VALUEで「一定」になるはずですよね。
というわけで、もうちょっと切り分けが必要でしょう。
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は無理でしょうか?
なかお さん こんにちは。
> 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)
大吉末吉さん、有難う御座います。
VB5のXP対応は私の勘違いですね。
他のプログラムだったのかも知れません。
「CreateFile」と「WriteFile」は同一プロジャーです。
一番の疑問はWIN98ではエラーが出ないのです。
やはりWIN98を使ったほうが良いのかも知れませんね。
でも、もう少し四苦八苦してみます。
なかお さん こんにちは。
これまでのやり取りで、気になる点がいくつかありますので、あげておきますね。
> 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でも、(エラーにならなかったとしても)期待どうりの動作にならないのでは?
大吉末吉さん、こんにちは。
「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」は来週でにも
調べて、試してみたいと思います。
ツイート | ![]() |