ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Visual Basic User's ClubコミュのRS232Cでデータを受信したい

  • mixiチェック
  • このエントリーをはてなブックマークに追加
失礼致します。
VB2005でRS232Cで温度計と接続して温度を受信するプログラムを作っているのですが、
こちらからコマンドを送信した後、温度が返ってきません。

以下のようなプログラムで温度を受信したいのですが、
どこを直せば受信できるのかどなたか教えていただけないでしょうか?
(以下には書かれていませんがビットレート等は通信仕様書に沿って設定してあります。
また、パソコン間では以下のプログラムで送信、受信が出来た事も確認してあります)

Try
'ポート名のセット
SerialPort1.PortName = TextBox1.Text
Call SerialPort1.Open()
SerialPort1.DtrEnable = True
SerialPort1.RtsEnable = True
Catch ex As Exception
MessageBox.Show(ex.Message, "Error")
End Try


Dim mes As String
mes = Chr(5) & "01" & Chr(2) & "RPV01" & Chr(3) & "C5"
Debug.Print("データ送信=SerialPort1.WriteLine(" & mes & ")")

SerialPort1.WriteLine(mes)

Try
Debug.Print("受信開始")
Dim Read As String
Debug.Print("SerialPort1.ReadLine")
Read = SerialPort1.ReadLine
MessageBox.Show("Read=" & Read)
Catch ex As Exception
MsgBox("受信エラー")
End Try

個人的には温度計側の不備が原因で受信が出来ないと思っているのですが、
RS232Cで通信するのが初めてなので、このプログラムが本当に正確なのか、イマイチ自信がもてません。

ここにいる皆様から「プログラム的におかしくない」あるいは逆に「ここを直せばあるいは受信できるかもしれない」などの解決に至れるヒントを頂きたいと思います。

コメント(8)

RS-232Cで受信できてるかの確認だけだったら、
ハイパーターミナルが使えると思いますよ〜。
kingpenguinさん、ありがとうございます。
ハイパーターミナルと言う手段はすっかり忘れていました!
早速一度確認してみようと思います!!
1さんも言うとおり、
・プログラムの不具合
・ドライバの不具合
・ハードウェアの障害
のいずれかを判別するために、まずは自作ではない通信ソフト(私はteratermを愛用しています)で、温度計との通信ができるかどうかをチェックするとよいですね。
温度計に何か付属ソフトとかがあったら、それで動作するかも要チェックです。ケーブルの接続に問題があったり、ポート番号の指定を間違えていたり、とか色々とトラブルの種はありますからね。
YUKI_Mさん、ありがとうございます。

teraterm
何やら便利そうなソフトが!!
今後の為にもダウンロードしておこうと思います。

これが温度計が古い&結線も外れかけと言う品物で、中々に問題の切り分けを困難にしてくれます。

りきゅあさん、ありがとうございます。
BaudRate、DataBits、Parityは仕様書に基づいて設定しています。
が、HandshakeはVBのデフォルト設定のままです。
ちょっとこの辺も一度見直してみます。

ReadLineはDataReceivedの中で行うものなのですね。
勝手に、
DataReceived=受動的にデータを受け取る。
ReadLine=こっちから積極的にデータを受け取りに行くと思っていました。

この辺りも後ほど手直ししたいと思います。


いちてつさん、ありがとうございます。
やはり、DataReceivedを設定し、その中でReadLineを行うのが正しいやり方なのですね。

皆様ありがとうございます。
これで一歩解決に近づけたような気がします!!

DtrとRtsラインは有効な設定なのでしょうか?
温度計のシリアルポートがDtr、Rtsの信号に対応していないなら、無効にした方がよいです。

送信時、WriteLineの改行コードは念のため指定しておいた方がよいです。

SerialPort1.NewLine = vbCrLf

改行コードに注意してください。
温度計の改行コードと違っている場合、いつまでたってもデータは取れません。

> ReadLineはDataReceivedの中で行うものなのですね。
> 勝手に、
> DataReceived=受動的にデータを受け取る。
> ReadLine=こっちから積極的にデータを受け取りに行くと思っていました。

ReadLine=こっちから積極的にデータを受け取りに行くであっています。
ただし、肝心のデータが送られていないのにReadLineをし、受信タイムアウト設定されている場合、データを受ける前にタイムアウトしてデータが取れません。
なので、DataReceivedでデータが来たことを確認してから受信する方法がよくとられます。

ReadLine は NewLine データが来るまで受信状態で待機します。
そして、最初の NewLine データを受信した時点でデータを返します。

この場合、注意すべき点は、複数行いっぺんに送られてきたときに、1行分しか読まないことです。
残りのデータは受信バッファの中にたまったままで、これが数回繰り返されると、バッファをオーバーして、データが欠落します。
CatFishさん、ありがとうございます。

>DtrとRtsライン
この辺は温度計の方の設定にも書かれておらず、行き当たりばったりで設定してみました。
(もしかすると昔はこういう設定そのものが存在してなかったのでしょうか?)

>送信時、WriteLineの改行コードは念のため指定しておいた方がよいです。
この設定は知りませんでした。
早速設定してみました。

と言う部分を設定し、更に今まで教えて頂いた部分を見直した所、無事受信する事ができました!
ご協力頂いた皆様、本当にありがとうございます!!

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Visual Basic User's Club 更新情報

Visual Basic User's Clubのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング