by あべべ » 2007年1月29日(月) 19:31
ver.3以降ではwim32APIが必要だということでチャレンジしています。
通信設定は今までの投稿を参考にさせてもらっていたので大丈夫だと思います。
実験で3つ(コントローラー1台(A)、測定器2台(B,C))を動かしたいのですが、違う点はハンドルを複数作った点です。それも正しいかよくわかりません。・・すいません。
結果的には、Aを動かし、BとCから電圧を測定のループをさせるプログラムを作りたいです。
うまくいきません。以下の質問についてご教授よろしくお願いします。
・ハンドルを複数作ったのですが正しいでしょうか?
Dim hComm[8] As Long , num as long
hComm[num] = CreateFile(StrComNom, GENERIC_READ OrGENERIC_WRITE, 0, ByVal 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
If hComm[num] = -1 Then
Print StrComNom; "が使えません"
' MsgD = lstrcat(comname , "が使えません") 'ポートのオープン失敗時
' MsgBox 0, MsgD '警告メッセージ アイコンを表示
dummy = CloseHandle(hComm[num]) 'シリアルポートを閉じる
Sleep(7999)
End '強制終了
End If
・
受信側の関係から、通信速度を分けたいのですが、以下のコードのように(hcomm[1])でハンドル名だけ変えるだけでよいですか?
stDCB.BaudRate = 38400 '転送速度の指定 dummy = SetCommState(hComm[1], stDCB)
・
送信は1回は出来るのですが、2回目から読ませるとバグります。以下のコマンドを繰り返すと何がまずいですか?
Dim wSData As BytePtr
Dim wLen As Long '送信されたデータ長の変数宣言
Dim dLen As Long '送信するデータ長の変数宣言
Dim cCrLf As BytePtr
buff1 as string, VOLT as string
VOLT="30" 'ここでは30Vにします。
buff1="setv 1 "+ VOLT 'ボルトの設定
wSData=lstrcat(buff1,Chr$(13))
dLen = lstrle (wSData) 'ANSI+DBCS文字でのバイト数に換算
dummy = WriteFile(hComm[1], wSData, dLen, VarPtr(wLen), ByVal 0) 'データの送信
・
受信もprint文で確認しましたが10と出ます。明らかに測定値のと異なります・・・。
以下は測定コマンドを送信後、受信する為のものです。
Dim rData[300] As Byte ' 受信データの変数宣言(文字変数として定義)
Dim rLen As Long '受信されたデータ長の変数宣言
rData[0] = 0 '100文字分の領域確保
wSData=lstrcat(":meas?",Chr$(13))
dLen = lstrlen (wSData) 'ANSI+DBCS文字でのバイト数に換算
dummy = WriteFile(hComm[7], wSData, dLen, VarPtr(wLen), ByVal 0)
dummy = ReadFile(hComm[7], rData, 100, VarPtr(rLen), ByVal 0) 'データの受信(2番目のパラメータにByvalをつける)
print dummy '表示させてみる。
[/hide]
ver.3以降ではwim32APIが必要だということでチャレンジしています。
通信設定は今までの投稿を参考にさせてもらっていたので大丈夫だと思います。
実験で3つ(コントローラー1台(A)、測定器2台(B,C))を動かしたいのですが、違う点はハンドルを複数作った点です。それも正しいかよくわかりません。・・すいません。
結果的には、Aを動かし、BとCから電圧を測定のループをさせるプログラムを作りたいです。
うまくいきません。以下の質問についてご教授よろしくお願いします。
・ハンドルを複数作ったのですが正しいでしょうか?
Dim hComm[8] As Long , num as long
hComm[num] = CreateFile(StrComNom, GENERIC_READ OrGENERIC_WRITE, 0, ByVal 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
If hComm[num] = -1 Then
Print StrComNom; "が使えません"
' MsgD = lstrcat(comname , "が使えません") 'ポートのオープン失敗時
' MsgBox 0, MsgD '警告メッセージ アイコンを表示
dummy = CloseHandle(hComm[num]) 'シリアルポートを閉じる
Sleep(7999)
End '強制終了
End If
・
受信側の関係から、通信速度を分けたいのですが、以下のコードのように(hcomm[1])でハンドル名だけ変えるだけでよいですか?
stDCB.BaudRate = 38400 '転送速度の指定 dummy = SetCommState(hComm[1], stDCB)
・
送信は1回は出来るのですが、2回目から読ませるとバグります。以下のコマンドを繰り返すと何がまずいですか?
Dim wSData As BytePtr
Dim wLen As Long '送信されたデータ長の変数宣言
Dim dLen As Long '送信するデータ長の変数宣言
Dim cCrLf As BytePtr
buff1 as string, VOLT as string
VOLT="30" 'ここでは30Vにします。
buff1="setv 1 "+ VOLT 'ボルトの設定
wSData=lstrcat(buff1,Chr$(13))
dLen = lstrle (wSData) 'ANSI+DBCS文字でのバイト数に換算
dummy = WriteFile(hComm[1], wSData, dLen, VarPtr(wLen), ByVal 0) 'データの送信
・
受信もprint文で確認しましたが10と出ます。明らかに測定値のと異なります・・・。
以下は測定コマンドを送信後、受信する為のものです。
Dim rData[300] As Byte ' 受信データの変数宣言(文字変数として定義)
Dim rLen As Long '受信されたデータ長の変数宣言
rData[0] = 0 '100文字分の領域確保
wSData=lstrcat(":meas?",Chr$(13))
dLen = lstrlen (wSData) 'ANSI+DBCS文字でのバイト数に換算
dummy = WriteFile(hComm[7], wSData, dLen, VarPtr(wLen), ByVal 0)
dummy = ReadFile(hComm[7], rData, 100, VarPtr(rLen), ByVal 0) 'データの受信(2番目のパラメータにByvalをつける)
print dummy '表示させてみる。
[/hide]