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

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

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

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

シリアルポート

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

Q&A

解決済

1回答

3255閲覧

[C#/Windows.Form]シリアル通信でのDataReceive中のWrite処理について

entaro12345

総合スコア75

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

シリアルポート

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

0グッド

1クリップ

投稿2020/01/17 00:50

編集2020/01/17 02:20

前提・実現したいこと

USBでデバイスと通信するプログラムを実装しています。
プログラムではSerialPortクラスを使用していて、
DataReceivedメソッド内でWriteメソッドを呼び出して最初に受け取ったデータと
Writeメソッドにて受け取ったデータの両方をDBに格納したいです。
※デバイスのほうがまだないため、手探りで実装中ですので、確認がすぐにはできない状況です。

お力添えをお願い致します。

#####修正、加筆
通信フォーマットは、テキスト形式です。
区切りは、CRLFの改行コードになります。

発生しそうな問題・エラーメッセージ

DataReceivedメソッド内での処理のため、うまくいかないのではと思っています。

該当のソースコード

C#

1/// <summary> 2/// データ受信時イベント 3/// </summary> 4/// <param name="sender"></param> 5/// <param name="e"></param> 6private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) 7{ 8 if (serialPort != null && serialPort.IsOpen) 9 { 10  try 11  { 12   // 受信データを読み込む 13   SerialPort sp = (SerialPort)sender; 14   string sChildData = sp.ReadExisting(); 15   if (データが二つそろっている) { 16    // DBへ格納処理 17   } else { 18    // write処理 19    DataWrite(string buffer); 20   } 21  } 22 } 23} 24 25/// <summary> 26/// データ書き込み処理 27/// </summary> 28/// <param name="command"></param> 29private bool DataWrite(string buff) 30{ 31 int iRetry = 1; 32 33 try 34 { 35 serialPort.Write(buff); 36 return true; 37 } 38 catch (IOException ex) 39 { 40 // リトライは3回まで 41 iRetry += 1; 42 43 if (3 < iRetry) 44 { 45 this.DataWrite(buff); 46 } 47 return false; 48 } 49 catch (Exception ex) 50 { 51 iRetry += 1; 52 53 if (3 < iRetry) 54 { 55 this.DataWrite(buff); 56 } 57 return false; 58 } 59}

試したこと

デバイスがないため試せておりません。

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

Windows 10
Visual Studio 2017

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

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

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

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

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

Wind

2020/01/17 01:00

何がわからないのか全く不明ですが、デバイスが無いのでしたらUSBシリアル変換を2つ用意して、 COMポート2つを使って確認出来ないでしょうか? 一度確認出来れば、不具合発生時にデバイス側とどちらが悪いのかの切り分けにも使えます。
coco_bauer

2020/01/17 01:16

まず、シリアル通信をするための道具(シリアル通信ケーブル、USB-シリアル通信変換器など)を用意しましょう。どんな機器を使うかによってプログラムの修正(例えば、通信速度の設定をする部分で利用可能な通信速度は機器によって異なる)が必要になるかもしれませんから。 どんなデバイスを使おうとしているのですか、Windows 10と書かれているので一方はWindowsのPCだと思うのですが、もう一方は? シリアルポートを備えたPCどうしだと、ケーブルでつなぐだけで簡単です。
entaro12345

2020/01/17 01:16

DataReceivedメソッド処理中にDataWriteメソッドにて処理をした場合に、 DataReceivedイベントでちゃんとひろえるのかがわかっておりませんでしたので、質問いたしました。
shinami

2020/01/17 02:55

実機が無いなら相手を別のパソコンでやってもよいし自分自身パソコンのシリアルポートへ繋いでもよいので 実機相当のアプリを別途作り両方実行して通信してみればよいと思います。
testset

2020/01/17 16:47

※以下は質問者の内容に対する回答ではありません DataWrite内でDataWriteを再起呼び出しています。 場合によってはStackoverflowとなる可能性がありますが問題ないのでしょうか。 (retryが意味を成していないように見えます) ------------ 試験環境がない方のための解決策を提示いたします。 シリアルポートがない場合の試験方法についての提案 https://qiita.com/indication@github/items/4f35813b326b34743cf1
Q71

2020/01/18 07:51 編集

private bool DataWrite() {   int iRetry = 1;  …再呼び出ししたときに1に初期化されるので、   ...   catch (IOException e)   {     iRetry += 1; ・・・必ず2となり、     if (3 < iRetry) ・・・かならずfalseになる…あれ?大小が逆じゃない?
entaro12345

2020/01/19 23:30

testsetさま、Q71さま ありがとうございます。 おっしゃる通りですね。 修正します。
guest

回答1

0

ベストアンサー

おそらく回答にはなってないと思いますが、

まず、通信フォーマットはどういうものかをはっきり規定しましょう
・バイナリ形式かテキストか
・メッセージの区切りはどう判定するか

シリアル通信というのは遅いです
受信イベントにおいては、おそらく、1バイトづつの受信となります
そして、メッセージの区切りが判定できないと処理は不可能です

ここらへんをはっきりさせておいてから、また聞きに来ましょう

投稿2020/01/17 01:44

y_waiwai

総合スコア87774

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

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

entaro12345

2020/01/17 02:03

ありがとうございます。 通信フォーマットは、テキスト形式です。 区切りは、CRLFの改行コードになります。
y_waiwai

2020/01/17 02:11

ならそれを質問文に追記しましょう #修正依頼に書いてる事も含め あまりに説明不足ですぜ で、提示のコードには、改行に対する処理はありませんね
entaro12345

2020/01/17 02:20

大変失礼しました。 アドバイスありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問