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

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

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

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

Q&A

解決済

1回答

11792閲覧

C# シリアル通信の受信イベントが起きない

tme_ike

総合スコア1

C#

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

0グッド

0クリップ

投稿2020/09/24 04:25

編集2020/09/24 04:55

前提・実現したいこと

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

C#でシリアル通信の簡単なプログラムをネットから引っ張って実行したところ、
受信イベントが発生しません。

該当のソースコード

Form1.cs

C#

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.IO.Ports; 7using System.Linq; 8using System.Text; 9using System.Threading.Tasks; 10using System.Windows.Forms; 11 12namespace _232CTest 13{ 14 public partial class Form1 : Form 15 { 16 string[] ports; 17 string DELIMITER = "\r\n"; 18 public Form1() 19 { 20 InitializeComponent(); 21 } 22 23 private void Form1_Load(object sender, EventArgs e) 24 { 25 ports = SerialPort.GetPortNames(); 26 serialPort1.PortName = "COM4"; 27 serialPort1.BaudRate = 9600; 28 serialPort1.DataBits = 8; 29 serialPort1.StopBits = System.IO.Ports.StopBits.One; 30 serialPort1.Parity = System.IO.Ports.Parity.None; 31 serialPort1.DtrEnable = true; 32 serialPort1.RtsEnable = true; 33 serialPort1.Handshake = Handshake.None; 34 serialPort1.ReceivedBytesThreshold = 1; 35 36 try 37 { 38 if(serialPort1.IsOpen == true) { return; } 39 serialPort1.Open(); 40 } 41 catch(Exception ex) { MessageBox.Show(ex.Message); } 42 43 if(serialPort1.IsOpen == true) 44 { 45 serialPort1.NewLine = DELIMITER; 46 try { serialPort1.WriteLine("sousin"); } 47 catch (Exception ex) { MessageBox.Show(ex.Message); } 48 } 49 } 50 51 private void SerialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) 52 { 53 string strDataReceived = ""; 54 try { strDataReceived = serialPort1.ReadExisting(); } 55 catch (Exception ex) { MessageBox.Show(ex.Message); } 56 57 if(serialPort1.IsOpen == true) 58 { 59 serialPort1.Close(); 60 MessageBox.Show(strDataReceived); 61 } 62 } 63 private void SerialPort1_ErrorReceived(object sender, SerialErrorReceivedEventArgs e) 64 { 65 MessageBox.Show("error"); 66 } 67 68 private void button1_Click(object sender, EventArgs e) 69 { 70 MessageBox.Show(serialPort1.ReadExisting()); 71 } 72 } 73} 74

Form1.Designercs

C#

1namespace _232CTest 2{ 3 partial class Form1 4 { 5 /// <summary> 6 /// 必要なデザイナー変数です。 7 /// </summary> 8 private System.ComponentModel.IContainer components = null; 9 10 /// <summary> 11 /// 使用中のリソースをすべてクリーンアップします。 12 /// </summary> 13 /// <param name="disposing">マネージド リソースを破棄する場合は true を指定し、その他の場合は false を指定します。</param> 14 protected override void Dispose(bool disposing) 15 { 16 if (disposing && (components != null)) 17 { 18 components.Dispose(); 19 } 20 base.Dispose(disposing); 21 } 22 23 #region Windows フォーム デザイナーで生成されたコード 24 25 /// <summary> 26 /// デザイナー サポートに必要なメソッドです。このメソッドの内容を 27 /// コード エディターで変更しないでください。 28 /// </summary> 29 private void InitializeComponent() 30 { 31 this.components = new System.ComponentModel.Container(); 32 this.serialPort1 = new System.IO.Ports.SerialPort(this.components); 33 this.button1 = new System.Windows.Forms.Button(); 34 this.SuspendLayout(); 35 // 36 // button1 37 // 38 this.button1.Location = new System.Drawing.Point(111, 66); 39 this.button1.Name = "button1"; 40 this.button1.Size = new System.Drawing.Size(88, 60); 41 this.button1.TabIndex = 0; 42 this.button1.Text = "button1"; 43 this.button1.UseVisualStyleBackColor = true; 44 this.button1.Click += new System.EventHandler(this.button1_Click); 45 // 46 // Form1 47 // 48 this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F); 49 this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 50 this.ClientSize = new System.Drawing.Size(800, 450); 51 this.Controls.Add(this.button1); 52 this.Name = "Form1"; 53 this.Text = "Form1"; 54 this.Load += new System.EventHandler(this.Form1_Load); 55 this.ResumeLayout(false); 56 57 } 58 59 #endregion 60 61 private System.IO.Ports.SerialPort serialPort1; 62 private System.Windows.Forms.Button button1; 63 } 64} 65 66

試したこと

別のPCのSeristerというソフトとUSBシリアルを使い通信確認。
作成ソフト→Seristerは問題なく送信できる。
Seristerからデータ送信後、FormのボタンクリックからReadExistingを呼び出すと送信したデータが読み出せる。
シリアルポートのフロー設定は[無し]と[ハードウェア]をそれぞれ試したが駄目でした。

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

Microsoft Visual Studio Community 2019
Version 16.6.4
Microsoft .NET Framework
Version 4.8.03752

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/09/24 04:32

ソースコードはインデントが崩れるので、コードの挿入で記入してください。 ちなみに、SerialPortのイベントハンドラはどこで設定されていますか?
tme_ike

2020/09/24 04:44

すみません。修正しました。 FormにSerialPortをドロップしておりますがそれのことでしょうか。
退会済みユーザー

退会済みユーザー

2020/09/24 04:48 編集

ドロップするだけではイベントは発生しなくて、 ・フォームデザイナでSerialPort1のイベントのプロパティを設定する ・ソースコード中のフォームの初期化処理でSerialPort1.DataReceivedのイベントハンドラを設定する どちらかの対応が必要になります。
tme_ike

2020/09/24 04:56

すみません。変に省略するべきではありませんでした。 コード全文を記載しなおしました。
guest

回答1

0

ベストアンサー

フォームデザイナを開き、SerialPortのプロパティで、イベントハンドラを設定してみてください。
(カミナリマークのアイコンのとこです)
イベントハンドラ

ちなみに、フォームデザイナで設定すると Designer.cs 内に次のようなイベントハンドラ設定の記述が追加されます。

csharp

1 // 2 // SerialPort1 3 // 4 this.SerialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.SerialPort1_DataReceived);

投稿2020/09/24 05:03

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

tme_ike

2020/09/24 05:12

解決しました! どう調べていいのかわからず困っていたので大変助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問