串行不在设计中时的 C# 串行事件

Posted

技术标签:

【中文标题】串行不在设计中时的 C# 串行事件【英文标题】:C# serial events when the serial is not in design 【发布时间】:2019-05-19 20:55:06 【问题描述】:

我在我的代码中添加了这个:

namespace uartToCs_version_2._0

    public partial class formMain : Form
    
    ==> public static SerialPort serial = new SerialPort();

但是我没有使用设计选项卡,那么我应该如何进行事件处理(在当前设置下,我也可以在其他形式中使用它,这仍然可能吗)? My design file

【问题讨论】:

How to Read and Write from the Serial Port的可能重复 【参考方案1】:
  public Form1()
    
        InitializeComponent();
        //add DataReceived event of serial
        Form1.serial.DataReceived += serial_DataReceived;          
     
    private void Form1_FormClosed(object sender, FormClosedEventArgs e)
    
        //remove DataReceived event of serial
        Form1.serial.DataReceived -= serial_DataReceived;  
    
    void serial_DataReceived(object sender, SerialDataReceivedEventArgs e)
    
        //process data here 
    

【讨论】:

因为序列是静态的,所以在 FormColosed 事件中,为 gc 移除 serial_DataReceived 事件 为什么需要这个? 如果serial是静态的,设置为null或者app退出时会被GC收集。当 Form1 实例关闭时,可能没有被 GC 收集到 Form1 实例,因为 Form1.serial 是 live 的,并且 Form1.serial.DataReceived 通过 exec Form1.serial.DataReceived += serial_DataReceived 引用 Form1 实例。【参考方案2】:

您可以在任何方法中注册事件,例如 Load() 或在构造函数中。我使用了下面的构造函数。在设置所有需要的属性之前,您无法注册事件。我没有显示设置代码。

   public partial class Form1 : Form
    
        public static SerialPort serial = new SerialPort();
        public Form1()
        
            InitializeComponent();

            serial.DataReceived += new SerialDataReceivedEventHandler(serial_DataReceived);
        


        private void serial_DataReceived(object sender, SerialDataReceivedEventArgs e)
        
        

    

【讨论】:

感谢您的快速回复

以上是关于串行不在设计中时的 C# 串行事件的主要内容,如果未能解决你的问题,请参考以下文章

C# 串行通信 DLL

如何自动检测串行 COM 端口 c# 的连接

C#串口介绍及串口通信程序设计实现(附程序分享)

通过串行连接从智能卡读卡器接收数据(C#)

路由器串行接口互联地址可以不在同一个网段

C# COM 端口通信 - USB 到串行适配器的错误