前提・実現したいこと
発生している問題・エラーメッセージ
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
ソースコードはインデントが崩れるので、コードの挿入で記入してください。
ちなみに、SerialPortのイベントハンドラはどこで設定されていますか?
すみません。修正しました。
FormにSerialPortをドロップしておりますがそれのことでしょうか。
ドロップするだけではイベントは発生しなくて、
・フォームデザイナでSerialPort1のイベントのプロパティを設定する
・ソースコード中のフォームの初期化処理でSerialPort1.DataReceivedのイベントハンドラを設定する
どちらかの対応が必要になります。
すみません。変に省略するべきではありませんでした。
コード全文を記載しなおしました。
回答1件
あなたの回答
tips
プレビュー