C# Serialport执行close()方法时,程序卡死的解决办法

根据网上搜到的文章,程序中添加两个bool变量,作为状态标记,保证串口关闭时,串口事件已处理完

private volatile bool is_serial_listening = false;//串口正在监听标记
private volatile bool is_serial_closing = false;//串口正在关闭标记

//Program Begins

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports; //使用Serialport需要用到这个namespace

namespace commtest
{
    public partial class Form1 : Form
    {
        private string DispString;   //used to store the values read
        private volatile bool is_serial_listening = false;//串口正在监听标记
        private volatile bool is_serial_closing = false;//串口正在关闭标记
        public Form1()
        {
            InitializeComponent();
        }

private void Form1_Load(object sender, EventArgs e)
        {
            //Port name can be identified by checking the ports
            // section in Device Manager after connecting your device
            serialPort1.PortName = "COM3";
            //Provide the name of port to which device is connected

//default values of hardware[check with device specification document]
            serialPort1.BaudRate = 9600;
            serialPort1.Parity = Parity.None;
            serialPort1.StopBits = StopBits.One;
            serialPort1.Handshake = Handshake.None;

serialPort1.Open(); //opens the port
            serialPort1.ReadTimeout = 200;
            if (serialPort1.IsOpen)
            {
                DispString = "";
                //txtCardKeyDeactivate.Text = "";
            }
            serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
        }

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            if (is_serial_closing)
            {
                is_serial_listening = false; //准备关闭串口时,reset串口侦听标记
                return;
            }
            try
            {
                if (serialPort1.IsOpen)
                {
                    is_serial_listening = true;
                    DispString = serialPort1.ReadExisting();
                    this.Invoke(new EventHandler(DisplayText));
                    Byte[] BSendTemp = new Byte[1];
                    BSendTemp[0] = 0x00;
                    serialPort1.Write(BSendTemp, 0, 1);
                }
            }
            finally
            {
                is_serial_listening = false;//串口调用完毕后,reset串口侦听标记
            }
        }

private void DisplayText(object sender, EventArgs e)
        {
            textBox1.AppendText(DispString);
            textBox2.Text = SubstringCount(textBox1.Text, "ok").ToString();//自己写的测试语句,统计"ok"字符串出现的次数
        }
        private static int SubstringCount(string str, string substring)
        {
            if (str.Contains(substring))
            {
                string strReplaced = str.Replace(substring, "");
                return (str.Length - strReplaced.Length) / substring.Length;
            }

return 0;
        }

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            is_serial_closing = true;//关闭窗口时,置位is_serial_closing标记
            while (is_serial_listening) Application.DoEvents();
            serialPort1.Close();
        }
    }
}

时间: 2024-09-28 19:35:26

C# Serialport执行close()方法时,程序卡死的解决办法的相关文章

使用net.sf.json包提供的JSONObject.toBean方法时,日期转化错误解决办法

解决办法: 需要在toBean之前添加配置 String[] dateFormats = new String[] {"yyyy-MM-dd HH:mm:ss"}; JSONUtils.getMorpherRegistry().registerMorpher(new DateMorpher(dateFormats)); Map<String, Class> classMap = new HashMap<String, Class>(); MemberPlayLo

Runtime.getRuntime.exec()执行linux脚本导致程序卡死有关问题

Runtime.getRuntime.exec()执行linux脚本导致程序卡死问题问题: 在Java程序中,通过Runtime.getRuntime().exec()执行一个Linux脚本导致程序被挂住,而在终端上直接执行这个脚本则没有任何问题.原因: 先来看Java代码: public final static void process1(String[] cmdarray) {        Process p = null;        BufferedReader br = null

在IE浏览器中执行OpenFlashChart的reload方法时无法刷新的解决方法

由于项目需求,需要在网页上利用图表展示相关数据的统计信息,采用了OpenFlashChart技术.OpenFlashChart是一款开源的以Flash和Javascript为技术基础的免费图表,用它能创建一些很有效果的报表分析图表.最重要的是它是开源和免费的,支持多种语言.首先在官网上下载开发包,里面包含了所需的flash文件.js文件以及多种语言的demo,这些demo写的非常详细,可以进行参考开发.由于项目使用.net来开发,所以我学习了一下开发包中对应的dotnet代码,这个.net项目采

python安装markupsafe模块时卡死的解决办法

起因: 升级OS X从10.8到10.9,会发现在安装python的markupsafe模块时一直卡住. 当时的机器环境是: OSX 10.9, XCode 4.6.2, Python 2.7.6, Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn) 界面一直停留在下面的情况 mbp:MarkupSafe-0.23 $ python setup.py install running install running bdis

android viewpager fragment切换时界面卡顿解决办法

目前开发的程序在切换View时界面卡顿现象比较严重,影响用户体验,当前项目共就四个View,每个View也只是按钮,所以可以同时加载,不让其它view销毁. 只需在Adapter中重载destroyItem类即可 @Override public void destroyItem(ViewGroup container, int position, Object object) { //重载该方法,防止其它视图被销毁,防止加载视图卡顿 //super.destroyItem(container,

http中 get方法 传送中文参数乱码解决办法

http传送参数有两种方法:get 和post  当时使用get方法传递中文参数是会有乱码现象 解决办法: 1.在jsp压面url后面的参数使用 encodeURI:"&zxbghy="+ encodeURI(zxbghy) 2.在后台java获取参数时使用字节数组:temphgdmhy = new String(hgdmhy.getBytes("ISO-8859-1"), "UTF-8");  案例,用get方法传递两个中文参数:zxb

1.Maven+SpringMVC+Eclipse软件安装配置,Maven报插件错误,Eclipse总是卡死的解决办法,导入一个maven工程后 一直显示importing maven project

 使用Maven+SpringMVC+Eclipse软件安装配置过程中的问题: 1.Eclipse总是卡死的解决办法: 一:内存不足所以会卡死,配置一下eclipse.ini修改这几个值就好了-XX:MaxPermSize=768m-Xms1024m-Xmx3072m搜索 二:修改window->preferences --- > JAVA->Edittor->Hovers,将右侧所有复选框清空. 2.因为eclipse上一次未正常关闭,导致启动卡死,错误日志为: [plain

Launcher Activity在开机时重启两次解决办法

今天在看log的时候发现,Launcher activity会被onDestroy掉一次,然后再重启. 可能原因猜测: 1.横竖屏切换 2.MCC MNC等Configuration改变引起的 MCC(移动国家码)和 MNC(移动网络码) 由于当时的Launcher设置为强制横屏了,应该是不会引起重启的. 对于Configuration改变系统会发一个android.intent.action.CONFIGURATION_CHANGED的广播 于是就做了一个广播接收器去检测是不是由于Config

MVC 使用ckfinder时提示客户端危险解决办法

MVC 使用ckfinder时提示客户端危险解决办法 在处理接收信息的Controller前面加   [ValidateInput(false)]形如:[HttpPost][ValidateInput(false)] public ActionResult GoodDetail(FormCollection form){return View();} 这种解决方法是把验证去掉了,对应网站安全性要求不高的(比如自己的后台)可以使用,论坛文本编辑器不建议