• ベストアンサー

VB2010で、シリアル通信の方法を教えてください。

VB2010で、シリアル通信の方法を教えてください。 ツールボックスの「Serial Port」を使っています。 送信までは難なくできたのですが、受信が旨くいきません。 参考にしたサイトは、 http://msdn.microsoft.com/ja-jp/library/cc720852.aspx です。 これを実行すると、受信が出来ないだけでなく、フリーズしてしまいます。 どうやったら、受信できるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

受信データが、 STX(&H02)とETX(&H03)には挟まれた形式のテキスト文字になっている。 エラーチェックのBCCは付加されない。 という仕様ならば ポートをOpenした直後に SerialPort1.NewLine = Chr(3) とすれば良い。 受信したデータの先頭1文字がSTXの場合に正常なデータと判断できます。

xcode_15
質問者

お礼

ありがとうございます! 成る程、そのようにすれば良いですね。

その他の回答 (3)

回答No.3

>受信するデータの終端の仕様が、ETX(&h02)でした。 NewLine プロパティにChr(2)を入れたらどうですか?

xcode_15
質問者

お礼

御解答、ありがとうございます。 >NewLine プロパティにChr(2)を入れたらどうですか? 改行コードの代わりになるものを、追加できるということですよね。 何処で、宣言をしたら良いですか? また、参考になりそうなサイトを教えてください。 よろしくお願いします。

回答No.2

どのようなデータを受信しているのでしょうか? ReadLine()メソッドのヘルプを見ると 『入力バッファ内の NewLine 値まで読み取ります。 既定では、ReadLine メソッドは行を受け取るまでブロックします。 この動作が不適切な場合は、ReadTimeout プロパティに 0 以外の値を設定して、ポート上に行が存在しない場合は ReadLine メソッドで強制的に TimeoutException がスローされるようにします。』 となっていて、なおかつ NewLine の既定値はラインフィード(CTRL+J)なので 受信するデータにラインフィード(CTRL+J)が含まれていない場合には戻ってきません。 受信するデータの終端がキャリッジリタン(CTRL+M)なら NewLineプロパティにChar(13)を設定してみてください。

参考URL:
http://www.robotsfx.com/robot/robohow/RoboHow60/RoboHow60.html
xcode_15
質問者

お礼

御解答を戴きまして、ありがとうございます。 >NewLineプロパティにChar(13)を設定してみてください。 これが、原因のようです。 受信するデータの終端の仕様が、ETX(&h02)でした。 こうなると、面倒でも、一文字ずつ受信させるしかなさそうですね。

  • root_16
  • ベストアンサー率32% (674/2096)
回答No.1

・ハイパーターミナルで受信できるかテストしてみる  →できない場合はCOMポートの設定がおかしいか、   パーソナルファイアーウォールの設定を見てみる   ※特定IPアドレスからの送信ならブロックしないようにする ・COMポートの設定を見直す  CPR managerとかでポートを作り、テストしてみる ・Serial Portの通信設定のプロパティを見直す ・SerialPort1.ReadLine  をReadExistingに変えてみる とかでしょうか?

参考URL:
http://social.msdn.microsoft.com/Forums/ja-JP/vbgeneralja/thread/c714c49a-e89f-47ca-bf74-acf64990ff6d
xcode_15
質問者

お礼

御解答を戴きまして、ありがとうございます。 ReadExistingで返事が返ってきました。 ただ、送られた通信プロトコルが分離されて受信しているようです。 (2度の受信イベントで、通信プロトコルが成立する)

関連するQ&A

  • Visual Basicにてシリアル通信

    VB2008でシリアル通信をしたいと思っております。 MSDNにてSerialPortコントロールを使った例が解説されており、 http://msdn.microsoft.com/ja-jp/library/cc720852.aspx それを利用して基本的な送信/受信ができることは確認しました。 次に受信データにより処理を仕分けたい、 例えば、エラーコードが帰ってきたらエラー用の処理、 正常なリターンがあれば正常処理のような動作を実装したい場合は、 どうすれば良いでしょうか。 アドバイスいただけますと助かります。 よろしくお願いいたします。

  • VB.netで、シリアル通信のタイムアウト処理について

    VB.netで、シリアル通信のタイムアウト処理について http://msdn.microsoft.com/ja-jp/library/7ya7y41k.aspx このサイトのコードを、参考にしています。 ------------------------------------ここから Dim com1 As IO.Ports.SerialPort = Nothing Try com1 = My.Computer.Ports.OpenSerialPort("COM1") com1.ReadTimeout = 10000 Catch ex As TimeoutException returnStr = "Error: Serial Port read timed out." Finally If com1 IsNot Nothing Then com1.Close() End Try ------------------------------------ここまで この方法ですと、タイムアウトが発生したらポートを閉じるようですが、これを、送信したシリアルのデータを再度、送信させたいと思います。 そして、何度かリトライを掛けた後に、やっぱり駄目だったときに ポートを閉じたいと思います。 どんな方法がありますか? 参考になりそうなサイトなどがありましたら、教えていただけませんか。 以上、よろしくお願いします。

  • VB2005 シリアル通信のClose処理

    いつもお世話になっております。 表題の件につきまして、ご教示ください。 【処理内容】 メインフォームのボタンからポートをオープンし、 受信データ(1Byte)をテキストボックスに表示し続ける。 ※受信データは定期受信 通信をやめたいときにメインフォームのボタンから ポートをクローズする。 上記、クローズ時に、ほぼフリーズします。 原因はシリアル通信の受信イベントが別スレッドにて処理されているため、 Invoke()にてテキストボックスの更新をしており、 これが悪さをしているみたいです。 BeginInvoke()を使用するとフリーズは回避することができるのですが、 テキストボックスに表示される受信データの内容が激しく欠落してしまいます。 Invoke()を使いつつ、フリーズを回避する方法はないのでしょうか。 無知で大変申し訳ございませんが、よろしくお願いいたします。

  • シリアル通信の方法(VB)

    VisualBasicを使ってシリアル通信(受信のみ)を考えている初心者です。 現在、フォームのデザイナーからSerialportをドラッグしプロパティを設定しました。 コードでは、ポートを開き、受信の命令をしていますが ".readline"の文のところでフリーズしてしまいます。 ---------- SerialPort1.Open() Dim receivedata As String = "" receivedata = SerialPort1.Readline ---------- 原因がつかめず困っています。 何がいけないのでしょうか?詳しい方、是非ご教授お願いします。

  • VB6でのシリアル通信について質問です。

    VB6でのシリアル通信について質問です。 現在、VB6で開発したラベル印刷のシステムを引き受けたのですが、以下のような状況に陥り困っております。 ・プリンタからPCへの接続はシリアル通信のみ。 ・現在使用しようとしているPCにはシリアル通信のポートがなく、USB接続のみしかできない。 ・RS232CからUSBへの変換コネクタを使ってPCとプリンタを接続しようとしているが、印刷実行時に実行時エラー 8015が発生する。 ・VBからプリンタへの通信はMSCommを使用している。 ・プログラム自体は客先にソースのみが残っていたもので、仕様書等はまったくない。 ネットで調べたところ、MicrosoftのサイトではUSBポートからMSCommを使って通信をする事はできないというような事が記載されておりました。 ただ、他のサイトを色々と調べたところ、普通に通信できるとの意見も記載されておりました。 実際のところ、VB6でRS232C-USB変換コネクタを使用してプリンタへのシリアル通信は可能なのでしょうか。 可能な場合、今回発生したエラーの原因になりそうなものとはなんなのでしょうか。 また、通信が不可能な場合、代替策としてどのような方法を取るのが一番ベストなのでしょうか。 どなたか何卒ご教授よろしくお願い致します。

  • VB.netを使ったシリアル通信の入出力について教えてください。

    これまでVB6.0 を使ってシリアル通信していたのですがデータをEXCELで処理したいのでVB.netに移行しました。 しかし、まったく見当が付きません。参考になる具体的なプログラミングも見つかりません。どなたか教えてください。 ツールボックスのカスタマイズによりAxMScommを設定するところまでは分かったのですがその先が検討付きません。 VB.netは初めてなので具体的にプログラミングを教えてほしいのです。 よろしくお願いいたします。

  • VBのMSCommコントロールを使ってシリアル通信をしています。

    VBのMSCommコントロールを使ってシリアル通信をしています。 データ受信時、90byteを超えたあたりで"??"(ASCIIコードで0x3Fが2回)が 挿入されたように受信されてしまいます。 前後のデータ関係をみると、2byteがデータ化けを起こしているわけでは なく、"??"が間に挿入されたような形です。 "??"が挿入される位置も受信の度に違います。 もしこのような現象の理由がわかる方がいらっしゃいましたら 回避策をお教えください。 <詳細設定> 38.4kbps、データ長:7、パリティ:Even、Stop bit :1 の設定。 http://www.compass-lab.com/STK_CAN/USB_Serial/USB_COMi.htm にあるUSB-comiでシリアルポートを追加してRS422変換しています。 データ長129byteのデータが250ms周期で送られてくるのを 読み取ろうとしています。

  • VB2005 で複数チャンネルのシリアル通信処理

    初めて投稿します、VB2005への初心者です。 複数ポートでシリアル通信を同時に送受信を行おうといているのですが 旨く出来ません。 comm1をOPENして受信を行うとcomm2の受信が行えなくなります。 逆にcomm2から行っても最初にOPENしたcomm1側の受信処理が行えなくなってしまいます。 複数のcommを使用しての処理はどのようにしているのかご教授お願いします。

  • Arduino シリアル通信でのバイナリ受信

    詳しい方教えてください。 送信元のPCから、受信側のArduinoへ、シリアル通信によってバイナリデータを送ることで、Arduino側でのサーボモータのシリアル駆動を試みています。 PC側からのバイナリデータ送信はVB.NET側で作成済みで、USB-TTLコンバータ(FTDI Basic Breakout 5V)を使ってのサーボモータのシリアル駆動は問題ありません。 (http://micono.cocolog-nifty.com/blog/2011/04/arduino11-17d5.html と同じ処理と思ってください。) 同様な処理を、PC-Arduinoで駆動させようと思っていますが、 void loop() { int c; if (Serial.available() > 0){ c = Serial.read(); ・・・・ こちらでは、Cの値がint型の為かうまくいきません。(キャストも試しましたが・・) そもそも1バイトデータの受信Serial.read()が、int型(2バイト)なのか判りません。 方法はありますでしょうか。

  • VisualStudioでのシリアル通信について

    現在VisualStudio2008を使用して作品を制作中の短大2年生なのですが、分からないところがあるため質問させていただきます。 状況といたしましては、遠隔地点の温度測定装置を作成しており、無線装置(Xbee)で測定したデータをパソコンで受信してVisualStudioで製作した受信画面に表示させる事を目標にしているのですが、受信画面をうまく動作させることができません。 デバッグ自体は通っているので、「VisualStudioで書き込むプログラムが足りていないのかな」と考えています。 ハイパーターミナルには日本語ではないのですが、文字化けしたような文字が受信されているので送信側からPCが受信する間までには問題は無いと思います。 プログラミングの方は http://msdn.microsoft.com/ja-jp/library/cc720852.aspx 上のサイトを参考に行いました。 上のサイトのように受信側からデータを送ることは考えておらず、接続するポート名と受信データだけが表示できるものを作成したいと考えています。 私自身VisualStudioの使用経験が皆無で、今回が質問初投稿なので分かりずらい文章や説明があるかも知れませんが、皆さんの知識をお貸しください。よろしくお願いします。