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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

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

シリアルポート

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

Q&A

解決済

3回答

8637閲覧

シリアル通信の受信データの処理

Taka_Taka

総合スコア12

C#

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

シリアルポート

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

0グッド

0クリップ

投稿2018/11/27 08:44

前提・実現したいこと

現在C#で、会社の装置とパソコン間でシリアル通信を行うプログラミングを作成中です。
ネットで調べてみたところ、データ受信は別スレッドで行われるとのことですが、
その受信したデータを別メソッドで処理する場合は、やはりそれも別スレッドで行うべきなのでしょうか?

それともう1つ質問なのですが、VB6のMSCommのOnCommイベントも、同様に別スレッドなのでしょうか?
たしかVB6は出来ないというのをどこかで見た記憶があるのですが・・・

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

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

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

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

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

guest

回答3

0

ベストアンサー

まず、C#でのシリアルの受信ですが、どのようにしてデータを取得するかによるかと思います。
こちらにあるように、SerialPort.DataReceivedイベントをトリガーとしてデータを取得する場合ですと、セカンダリ スレッドでイベントが発生しますので、コントロールなどを触りたい場合はInvokeする必要があるかと思います。
ですが、UIスレッドでタイマーなどで、ポーリングしReadなどを行う場合、UIスレッドで動作します。
ただ、通信なので、受信待ちなど時間がかかる場合がでてきます。ですので別スレッドを作成し、そのスレッドで送受信を行いましょうという解説ページが多いと思います。

VB6のMSCommのOnCommイベントですが、メインスレッドでの動作となります。
コントロール自体はVB6で作成されているわけではないので、内部で別スレッドにて処理を行っている可能性もあるかと思いますが、VB6はマルチスレッドに正式に対応していないので、コントロール外部に出る場合はメインスレッドの動作となります。

投稿2018/11/27 09:58

YAmaGNZ

総合スコア10222

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

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

Taka_Taka

2018/11/28 01:10

データの受信はDataReceivedで行っています。 実を言うと元々VB6で作成されたソフトをC#で作り直しているのですが、通信部分が時々思ったように動いてくれないのでなんでなのかと思い、このような質問をしました。
guest

0

ネットで調べてみたところ、データ受信は別スレッドで行われるとのことですが、

処理に時間が掛かる事が多く、その間、メイン(画面更新も)の処理が止まるためです。
もし、メインの処理が止まって問題無ければ、別スレッドにする必要はありません。
まあ、実用プログラムだと、操作性の問題から、NGとされる事が多いとは思いますが。

投稿2018/11/27 13:28

pepperleaf

総合スコア6383

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

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

Taka_Taka

2018/11/28 01:06

なるほど、メインが止まってしまうのは困りますね・・・
guest

0

テキストの送受信を前提にするなら、受信動作自体は内部でやってくれるためなにもしなくていいです。
行単位の受信文字列をReadLineで読むだけでいけますね

投稿2018/11/27 09:17

y_waiwai

総合スコア87719

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

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

Taka_Taka

2018/11/28 01:24

受信データを読み込むだけならReadLineでいけるのですね。 もしかしたらそちらのほうが良いのかもしれませんね
y_waiwai

2018/11/28 01:28

まあ、メインスレッドで処理するなら、受信待ちにならないように工夫する必要がありますが
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問