• C# SerialPort.close() bug解决方法


      最近小了个串口小程序 ,发现在调用 close()方法关闭串口时,程序被挂起.查找了网络资料,网上说这是C#的一个bug.

    摸索了半天,结合前人的程序整理出来一段代码,与大家分享.程序只有接收的部分.

     1 using System;
     2 using System.Collections.Generic;
     3 using System.ComponentModel;
     4 using System.Data;
     5 using System.Drawing;
     6 using System.Linq;
     7 using System.Text;
     8 using System.Windows.Forms;
     9 using System.Threading;
    10 using System.IO.Ports;
    11 
    12 namespace SerialPort_Controls
    13 {
    14     public partial class Form1 : Form
    15     {
    16         //该程序可实现 ,串口数据的获取(读取新的一行)  波特率4800 串口1
    17         string data;
    18         private delegate void SetTextCallback(string text);
    19         Thread threadReceive;
    20         bool TestOff = true;
    21         public Form1()
    22         {
    23             InitializeComponent();
    24         }
    25 
    26         private void SynReceiveData(object serialPortobj)
    27         {          
    28              //   this.Text = "正在通信!";
    29             while (true)
    30             {
    31                 data = serialPort1.ReadLine();
    32                 SetText(data);
    33             }
    34         }
    35         private void button2_Click(object sender, EventArgs e)
    36         {      
    37                 if (serialPort1.IsOpen)
    38                 {
    39                     threadReceive.Abort();
    40                     serialPort1.Close();//关闭端口
    41                     this.Text = "通信关闭";
    42                 }     
    43         }
    44         private void SetText(string text)
    45         {
    46             // InvokeRequired需要比较调用线程ID和创建线程ID
    47             // 如果它们不相同则返回true
    48             if (this.textBox1.InvokeRequired)
    49             {
    50                 SetTextCallback d = new SetTextCallback(SetText);
    51                 this.Invoke(d, new object[] { text });
    52             }
    53             else
    54             {
    55                 this.textBox1.Text += text;
    56             }
    57         }
    58         private void button1_Click(object sender, EventArgs e)
    59         {
    60             try
    61             {
    62                 serialPort1.Open();
    63                 //同步阻塞接收数据线程
    64                 threadReceive = new Thread(new ParameterizedThreadStart(SynReceiveData));
    65                 threadReceive.Start(serialPort1);
    66                 TestOff = false;
    67                 this.Text = "正在通信";            
    68             }
    69             catch (Exception ex)
    70             {
    71                 MessageBox.Show("打开失败"+ex.Message);
    72             }
    73         }            
    74     }
    75 }
  • 相关阅读:
    etcd:从应用场景到实现原理的全方位解读
    open-falcon编写的整个脑洞历程
    开源还是商用?十大云运维监控工具横评
    我的后端开发书架2015 2.0版
    【MDCC 2015】友盟数据平台负责人吴磊:移动大数据平台的架构与实践
    Effective Go
    Airbnb JavaScript Style Guide
    Google HTML/CSS Style Guide
    nservicebus教程-目录
    测试
  • 原文地址:https://www.cnblogs.com/dreamfactory/p/2844219.html
Copyright © 2020-2023  润新知