- ベストアンサー
VB2008にてRS232C通信をするソフトを作成
- VB2008を使用してRS232C通信をするソフトを作成しました。通信相手はボードで、アスキーコマンドを送信します。
- 通信は問題なく動作しますが、1時間程度経つとソフトがフリーズする現象が発生します。
- フリーズする原因は特定できず、ポートの開閉タイミングやUSB-232C変換ケーブルの問題などが考えられます。何かヒントがあれば教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>初めは、Windwsが立ち上がり砂時計が消えて、ハードディスクのチカチカという初期動作の前に >USBを挿入していたら、アプリが良くフリーズしていました。 >Windwsが完全に立ち上がってからUSBを入れるように使用するようにお願いしました所、 ちょっと待った これは都度変換機を抜き差ししてるってことですか? (つけっぱなしじゃ駄目なのですか?) 今回違うと思いますが少なくても通信中に抜き差しするとアプリがロックします 接触不良で外れかかったため止まったという話も あるかもしれません VBよく知らないんですがオープンとかでエラー起こしても 突き進んでるような(この場合もロックするのではないかという気がします) また別のUSBポートにさした場合ポート番号が変化します PC設定やソフト以前にその変換機が安定して動作してるのか 自体を確認した方がいいような気もします (PC-PC間で1日ぐらい通信し続けてみるとか) なんとなくハード要因の気がします
その他の回答 (2)
- koi1234
- ベストアンサー率53% (1866/3459)
>ソフトが立ち上がっている際は、常に通信ポート(例えばCOM3)は開いたままにして >いる事に問題が有るのでしょうか? いいえ それが普通です その昔自分が通信のデータ送信するときだけポートオープン・クローズ 繰り返してデータが受け取れないとか騒いでいる人間を見ましたが プログラムを見て呆然としたことがあります >ボードよりの返信がPCの何処かのバッファに溜まってしまうのでしょうか? これはありますがオーバーランでデータが破壊されるだけでアプリが フリーズするとか言うことは無いはずです フリーズってどんな状況なんでしょうかね? 通信が止まるだけ?それともアプリがうんともすんとも言わなくなる? 通信でフロー制御してる場合バッファが一杯になると通信が止まりますが これはアプリのハングとは違います 状況が良く分かりませんが可能性という意味では 受信データ読み捨てて様子見ては?
補足
経緯を補足します。アプリがフリーズします。 初めは、Windwsが立ち上がり砂時計が消えて、ハードディスクのチカチカという初期動作の前に USBを挿入していたら、アプリが良くフリーズしていました。 (ユーザーがせっかちだったので) Windwsが完全に立ち上がってからUSBを入れるように使用するようにお願いしました所、 フリーズしなくなったとの事でした。 しかし、先日受けた報告で1時間ほどほったらかしにしておいたらフリーズしたとの事でした。 実は、状況を直接見たわけではなく、その使用者にも使い方に問題が有るのかも知れませんが、 私もこの様な通信のソフトは、初めてだった為おかしな所が有るのか??と思い、ご存知の方々に ご教授をお願いしました。 すいません。別の方への補足に簡略化しましたソースを記載しました。 気が付いた所が有りましたら教えて頂ければ幸いです。 ポートをオープンにしたままでもソフトがアプリがフリーズする事は無いんですね。 気になるのは、ポートをオープンしたままの際に、パソコンの電源の管理とかスクリーンセーバなどです。 一応、ざっくりは止めてきたはずなのですが、もしかしたらその設定が止められてないものが有るかもしれません。 こんな設定も、関係はしますでしょうか? 私の考えは、PCの設定が怪しいかと思っていたのですが・・・ アプリにも原因が有るかも・・・と見ていたのですが、見つけられずです。
- 錯雑 っち(@sakuzatchi)
- ベストアンサー率35% (174/492)
この手の質問をなさる場合は、ソースコードをさらすことが鉄則です。 ソースを読まずに、どのようなアドバイスができると思いますか? RS-232C周りのプログラムだとそれほどたいした規模にならないのですから 適当なところにアップロードして取得できるようにしてください。
補足
'この命令はForm1のものですが、Form3のポートのコマンドを使ってます。まずはここでポートをオープンします。 Private Sub Form3_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Form3_Button.Click Dim Settei As String 'シリアルポートを設定。 Form3.SerialPort1.PortName = SerialPortComboBox.Text Form3.SerialPort1.BaudRate = SerialBpsComboBox.Text Form3.SerialPort1.Parity = IO.Ports.Parity.None Form3.SerialPort1.DataBits = SerialDataBitsComboBox.Text Form3.SerialPort1.StopBits= IO.Ports.StopBits.None ' RTSラインを有効にする Form3.SerialPort1.RtsEnable = True '送信タイムアウト Form3.SerialPort1.WriteTimeout = 3000 Try Form3.SerialPort1.Open() End Try 'シリアルポート送信データの文字エンコードをSJISに指定する。 Form3.SerialPort1.Encoding = System.Text.Encoding.GetEncoding(932) Settei = "AAA" 'いざ送信 Form3.SerialPort1.Write(Settei) '送信バッファが空になるまで待って、 While Form3.SerialPort1.BytesToWrite > 0 My.Application.DoEvents() End While Me.Close() 'Form1をクローズ End Sub ------------------------------------------------------------------- 'Form3の命令です。 Private Sub Button_Speed_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_Speed.Click Dim Speed_B As String Speed_B = "S" 'いざ送信 SerialPort1.Write(Speed_B) '送信バッファが空になるまで待って、 While SerialPort1.BytesToWrite > 0 My.Application.DoEvents() End While End Sub ------------------------------------------------------------------- 後はソフトを閉じるときにポートをクローズするだけです。 それまではポートを開きっぱなしです。 命令は他にもあるのですが、すべて同じようにしております。 基本的には送りっぱなしです。 コマンドを送った後には、相手から何かしら返してきているのですが 特にその処理はしていません。 すいません。 下手なソースで。
補足
ご指摘有難うございます。 通信中に抜き差しは、しておりません。 私もUSB-RS232Cのケーブルが、ちょっと疑わしい気もします。 (ちょっと手元に無いので実験出来ないのですが) 確かに、アプリでポートを開いたままUSBを抜き差しするとおかしな事になります。 これは当然の結果でしょうが。 またお気づきの事が有りましたら教えて頂ければ幸いです。