
VB2008にてRS232C通信をするソフトを作ってみました。
通信する相手はボードで、ボードに対してコマンド(アスキー)を送信します。
送信した際に、ボードより回答は有るのですが特に受信の処理はしていません。
ノートPCなのでUSB-232C変換ケーブル(秋月電子の物)にて通信しております。
とりあえず通信は出来て、思った通りに動くのですが、1時間ほど経つとソフトがフリーズ
する現象が起きます。
特に大量の通信をしている訳ではなく、3~4回ほど5文字位を送信しているだけです。
ソフトが立ち上がっている際は、常に通信ポート(例えばCOM3)は開いたままにして
いる事に問題が有るのでしょうか?
USB-232C変換ケーブルが悪いのでしょうか?
それとも、ボードよりの返信がPCの何処かのバッファに溜まってしまうのでしょうか?
フリーズする時は、特にボードに対して送信はしていないタイミングです。
1時間ほど通信したままにしてほったらかしにしている状態です。
これだけでは、解らないかも知れませんが、フリーズしてしまう要因で思い当たる事に
気づいた事が有りましたら何でも良いので、教えて下さい。
当方、この通信は初めてなもので、知らない事が多いかと思います。
ちなみにポートを閉じるタイミングはソフトを落としたときです。
No.3ベストアンサー
- 回答日時:
>初めは、Windwsが立ち上がり砂時計が消えて、ハードディスクのチカチカという初期動作の前に
>USBを挿入していたら、アプリが良くフリーズしていました。
>Windwsが完全に立ち上がってからUSBを入れるように使用するようにお願いしました所、
ちょっと待った
これは都度変換機を抜き差ししてるってことですか?
(つけっぱなしじゃ駄目なのですか?)
今回違うと思いますが少なくても通信中に抜き差しするとアプリがロックします
接触不良で外れかかったため止まったという話も
あるかもしれません
VBよく知らないんですがオープンとかでエラー起こしても
突き進んでるような(この場合もロックするのではないかという気がします)
また別のUSBポートにさした場合ポート番号が変化します
PC設定やソフト以前にその変換機が安定して動作してるのか
自体を確認した方がいいような気もします
(PC-PC間で1日ぐらい通信し続けてみるとか)
なんとなくハード要因の気がします
この回答への補足
ご指摘有難うございます。
通信中に抜き差しは、しておりません。
私もUSB-RS232Cのケーブルが、ちょっと疑わしい気もします。
(ちょっと手元に無いので実験出来ないのですが)
確かに、アプリでポートを開いたままUSBを抜き差しするとおかしな事になります。
これは当然の結果でしょうが。
またお気づきの事が有りましたら教えて頂ければ幸いです。
No.2
- 回答日時:
>ソフトが立ち上がっている際は、常に通信ポート(例えばCOM3)は開いたままにして
>いる事に問題が有るのでしょうか?
いいえ それが普通です
その昔自分が通信のデータ送信するときだけポートオープン・クローズ
繰り返してデータが受け取れないとか騒いでいる人間を見ましたが
プログラムを見て呆然としたことがあります
>ボードよりの返信がPCの何処かのバッファに溜まってしまうのでしょうか?
これはありますがオーバーランでデータが破壊されるだけでアプリが
フリーズするとか言うことは無いはずです
フリーズってどんな状況なんでしょうかね?
通信が止まるだけ?それともアプリがうんともすんとも言わなくなる?
通信でフロー制御してる場合バッファが一杯になると通信が止まりますが
これはアプリのハングとは違います
状況が良く分かりませんが可能性という意味では
受信データ読み捨てて様子見ては?
この回答への補足
経緯を補足します。アプリがフリーズします。
初めは、Windwsが立ち上がり砂時計が消えて、ハードディスクのチカチカという初期動作の前に
USBを挿入していたら、アプリが良くフリーズしていました。
(ユーザーがせっかちだったので)
Windwsが完全に立ち上がってからUSBを入れるように使用するようにお願いしました所、
フリーズしなくなったとの事でした。
しかし、先日受けた報告で1時間ほどほったらかしにしておいたらフリーズしたとの事でした。
実は、状況を直接見たわけではなく、その使用者にも使い方に問題が有るのかも知れませんが、
私もこの様な通信のソフトは、初めてだった為おかしな所が有るのか??と思い、ご存知の方々に
ご教授をお願いしました。
すいません。別の方への補足に簡略化しましたソースを記載しました。
気が付いた所が有りましたら教えて頂ければ幸いです。
ポートをオープンにしたままでもソフトがアプリがフリーズする事は無いんですね。
気になるのは、ポートをオープンしたままの際に、パソコンの電源の管理とかスクリーンセーバなどです。
一応、ざっくりは止めてきたはずなのですが、もしかしたらその設定が止められてないものが有るかもしれません。
こんな設定も、関係はしますでしょうか?
私の考えは、PCの設定が怪しいかと思っていたのですが・・・
アプリにも原因が有るかも・・・と見ていたのですが、見つけられずです。
No.1
- 回答日時:
この手の質問をなさる場合は、ソースコードをさらすことが鉄則です。
ソースを読まずに、どのようなアドバイスができると思いますか?
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
-------------------------------------------------------------------
後はソフトを閉じるときにポートをクローズするだけです。
それまではポートを開きっぱなしです。
命令は他にもあるのですが、すべて同じようにしております。
基本的には送りっぱなしです。
コマンドを送った後には、相手から何かしら返してきているのですが
特にその処理はしていません。
すいません。
下手なソースで。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
エクセル VBA でのCOMポート...
-
WINSOCKのWSACleanupについて
-
CreateFile関数でCOMポートが開...
-
Winsockで接続待ちタイムアウト...
-
ソケットのクローズについて
-
Connectエラーが出てしまう・・...
-
Macターミナルで実行中のプログ...
-
powershell を使いカレントディ...
-
C# シリアル通信でデータ受信...
-
フレームワーク「4.8.1」で、[S...
-
家電製品の電力周波数を変える機械
-
10進数をBCDに変換する方法
-
バックグラウンドのプロセスの...
-
RPG パラメーターについて
-
スティーブ・ジョブズはプログ...
-
【C言語】再帰が時間がかかる...
-
スレッドにて同一メモリの書き...
-
VBSの処理中一旦処理を止めて再...
-
バッチファイルでPINGログ取得
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
UDP通信におけるbind関数について
-
ソケットのクローズについて
-
エクセル VBA でのCOMポート...
-
Winsockで接続待ちタイムアウト...
-
Socket通信の0バイト受信について
-
ソケットのrecvの戻り値が0
-
VB6のwinsockでconnectできない
-
UDP通信する時に、相手にどうや...
-
ソケットでクライアントのipア...
-
Connectエラーが出てしまう・・...
-
UdpClient 送信元のIPアドレ...
-
ソケット通信 同じポート番号...
-
recv関数でフリーズしてしまう
-
ソケットを用いた1対多通信につ...
-
closeされたsocketへの動作につ...
-
VB6‥ソケットについて
-
ソケット通信
-
vbでの232c接続プログラムについて
-
ネットワークプログラミングに...
おすすめ情報