質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

Q&A

解決済

1回答

1301閲覧

C# シリアルポートを用いた データの送受信

miyabin09

総合スコア9

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

0グッド

1クリップ

投稿2020/02/01 09:25

前提・実現したいこと

RS232Cでシリアルポートを用いたデータの送受信のやり取りを行いたい
送信と受信は問題なく動作しているが、そこから次のステップで
送信→受信→データをチェック→送信を繰り替えして行いたい

発生している問題・エラーメッセージ

送信→受信→データチェックの方法が分かりません。

該当のソースコード

//送信部分// private void sendButton_Click(object sender, EventArgs e) { //シリアルポートがオープンしていない場合、処理しない if (serialPort1.IsOpen==false) { return; } try { //データ送信 1回目// string a = "111"; string b = "222"; string c = "333"; serialPort1.WriteLine(a); serialPort1.WriteLine(b); serialPort1.WriteLine(c); } catch (Exception ex) { MessageBox.Show(ex.Message); }
//受信部分// public void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) { try { //受信データの読み込み string data = serialPort1.ReadExisting(); if (!string.IsNullOrEmpty(data)) { Invoke((MethodInvoker)(() => rcvText.AppendText(data))); } } catch (Exception ex) { MessageBox.Show(ex.Message); }

試したこと

以前はserialport.readlineでNewlineのデータを待って、送信をしていたが
データ送信速度に対応していないので、受信データがバッファからあふれた。
そこでreadexisitngを使用したが、データ受信待ちが出来なくなり、苦戦しております。

補足情報(FW/ツールのバージョンなど)

C# visual studio2015

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shinami

2020/02/01 13:14 編集

速度に対応していないとは? 例:serialPort1.BaudRate = 9600; Openメソッドの前に行う設定の事でしょうか? 私はDataReceivedとReadExistingは使いませんので分かりませんが、 DataReceivedは何かデータが受信されたら発生するイベントでReadExistingは読み取れるものをすべて読み取るという事だと思いますがnewlineが読み込まれるまで繰り返し読むことはできないですかね? あとは、DataReceivedイベントの代わり?としてserialport.BytesToRead > 0などで読み取れるものがあるかチェックできます。そのごnewlineが読み込まれるまで繰り返します。 受信データがバッファからあふれたとは? 例:serialPort1.ReadBufferSize = 4096; Open前に行う設定でしょうか?
YAmaGNZ

2020/02/01 16:48

ReadLineで受信を行ってバッファがあふれたというのは正しいのでしょうか? 受信待ちを行っているのであれば、基本的なプロトコルとしては 1.コマンドを送信 2.コマンドの応答を受信 となるはずです。 SerialPort.ReadBufferSizeプロパティのデフォルトは4096なので、バッファがあふれたということは2のコマンドの応答が4096バイト以上になったということになります。 実際に行っている通信でそのようなことがありえるプロトコルなのでしょうか?
guest

回答1

0

ベストアンサー

受信待ちして、送信して、送信待ちして、受信するという流れになりますんで、UIスレッドでやろうとすると無理が出てきます。
まずは別スレッド立てて、これらの処理を行うループを書くようにしましょう

投稿2020/02/01 12:36

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問