前提・実現したいこと
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
速度に対応していないとは?
例:serialPort1.BaudRate = 9600;
Openメソッドの前に行う設定の事でしょうか?
私はDataReceivedとReadExistingは使いませんので分かりませんが、
DataReceivedは何かデータが受信されたら発生するイベントでReadExistingは読み取れるものをすべて読み取るという事だと思いますがnewlineが読み込まれるまで繰り返し読むことはできないですかね?
あとは、DataReceivedイベントの代わり?としてserialport.BytesToRead > 0などで読み取れるものがあるかチェックできます。そのごnewlineが読み込まれるまで繰り返します。
受信データがバッファからあふれたとは?
例:serialPort1.ReadBufferSize = 4096;
Open前に行う設定でしょうか?
ReadLineで受信を行ってバッファがあふれたというのは正しいのでしょうか?
受信待ちを行っているのであれば、基本的なプロトコルとしては
1.コマンドを送信
2.コマンドの応答を受信
となるはずです。
SerialPort.ReadBufferSizeプロパティのデフォルトは4096なので、バッファがあふれたということは2のコマンドの応答が4096バイト以上になったということになります。
実際に行っている通信でそのようなことがありえるプロトコルなのでしょうか?
回答1件
あなたの回答
tips
プレビュー