C# 串口通信 线程关闭问题

问题描述

串口通信大致可分为发送线程、接收线程、数据解析线程,发送和接收线程暂不考虑,以下是我写的一个数据解析线程的程序:DataDealThread=newThread(DataDealMethod);//绑定方法DataDealThread.Start();//线程开始///<summary>///解析接收到的数据///</summary>privatevoidDataDealMethod(){while(true){stringStrRcv=null;try{if(RcvQueue.Count>=1)//从队列中取出数据{byte[]ReceiveDataDeal=RcvQueue.Dequeue();ConvertClass.ConvertByteToHexString(ReceiveDataDeal,refStrRcv);//转换为字符串的方法调用DisplayDataDlg=newDisplayData(DisplayMethod);this.BeginInvoke(DisplayDataDlg,StrRcv);//显示}elseThread.Sleep(1);}catch(Exceptionex){MessageBox.Show(ex.Message,"DataDealWarning");return;}}}

我遇到的问题是:1.当有一次异常抛出后,解析线程不再循环处理数据;2.当我退出界面、关闭该线程时总会抛出“线程正在中止”的异常框;对于第一个问题我想实现的是抛出异常后,点击异常提示框中的“确定”后可以接续处理数据。我将return去掉后也会产生一个问题,即由于数据是不停处理的,要是连续几个数据处理都是异常的,那么就会弹出多个异常框,直至界面卡死。。。我要的就是当抛出异常框后,我点击确认了才接着处理数据,不点击则不处理数据。第二个问题,就是怎么在退出界面,关闭线程的时候,将while循环关闭。另外,请问,可不可以用异步调用的方式处理数据,能的话望给出相关源代码或思路。其实我很不想用这个while循环线程处理数据,但又想不出其他方法来处理......

解决方案

解决方案二:
异常的出现可能导致线程被杀死或者挂起点击确定这个问题可以使用DialogResult来实现将while(true)改成while(flag)等标志位或者if(flag)break;
解决方案三:
线程的实现需要异步实现通知事件.使用BackgroundWorker线程,实现结束,异常通知,我只能说到这里了.
解决方案四:
?我要的就是当抛出异常框后,我点击确认了才接着处理数据,不点击则不处理数据。首先MessageBox.Show(ex.Message,"DataDealWarning");你根本不用return;即可,因为MessageBox是阻塞模式如果你非要加什么那你要用AutoEvenSet这个操作就是异常好手动加阻塞调WaitOne(),点确定后set()就可以了。
解决方案五:
第二点就是把isBackground=true就会自动退出线程了
解决方案六:
引用3楼wyd1520的回复:

?我要的就是当抛出异常框后,我点击确认了才接着处理数据,不点击则不处理数据。首先MessageBox.Show(ex.Message,"DataDealWarning");你根本不用return;即可,因为MessageBox是阻塞模式如果你非要加什么那你要用AutoEvenSet这个操作就是异常好手动加阻塞调WaitOne(),点确定后set()就可以了。

不好意思,这两天比较忙,没及时回复。MessageBox不是阻塞模式的,比如说当我连续发相同错误的命令时,那么就会弹出多个提示框,如果MessageBox是阻塞的话就不会一直弹出提示款了。我加return是为了出现一次错误命令时准备的,当不是连续出现异常时点击提示框后return能返回到while循环。
解决方案七:
引用2楼s8848的回复:

线程的实现需要异步实现通知事件.使用BackgroundWorker线程,实现结束,异常通知,我只能说到这里了.

首先感谢你的回答,但你没看懂我的意思。。。
解决方案八:
引用1楼jinlei59的回复:

异常的出现可能导致线程被杀死或者挂起点击确定这个问题可以使用DialogResult来实现将while(true)改成while(flag)等标志位或者if(flag)break;

我也考虑过这个方法,值得一试。。。

时间: 2024-07-28 20:18:01

C# 串口通信 线程关闭问题的相关文章

c# 串口通信 线程-C# SerialPort 串口通信多线程问题

问题描述 C# SerialPort 串口通信多线程问题 编程新手,想C# SerialPort实现串口通信,写的程序大概这样一个结构.发送一个数据后,要求收到下位机回复,超时发送下一个数据.要加一个发送和接收的线程,是加在主程序里面吗?大体的结构应该是怎么样的?求大神帮助!O(∩_∩)O谢谢! class SendAndReceive { SerialPort sp = new SerialPort(); public void SearchSet()//检测有哪些端口 public void

串口串口通信 线程-C# 串口接收数据处理线程遇到的问题求高手帮助!

问题描述 C# 串口接收数据处理线程遇到的问题求高手帮助! C# 串口接收数据处理时遇到队列有值,但报错InvalidOperationException,队列为空的问题. 代码如下:private void dataProcessing() { byte[] data = new byte[2] {0,0}; float sensor_data = 0f;//用来记录转化后的数据 //float data_high8 = 0f; int timerDraw=0; while (true) {

串口通信-有关线程收发串口数据的问题

问题描述 有关线程收发串口数据的问题 最近写一个项目里面用到的是基于串口通信的. 由于我需要一直处于接收数据状态,并且可以随时发送数据(我的串口是RS232,支持全双工),于是想到了用两个线程去做. 一个处于收状态,一个发包用. 现在的问题是:我只有一个SerialPort对象 ,通过跨类的信号和槽得到这个对象,但是一放在线程的run函数读写就会报错. 我曾想过把串口的设置和连接放在线程类里面做,但是我这边两个线程呢,一个链接的话,端口就会被占用,另外一个线程就没法连接 困了一天了 不知道该怎么

.NET 串口通信

原文:.NET 串口通信 这段时间做了一个和硬件设备通信的小项目,涉及到扫描头.输送线.称重机.贴标机等硬件.和各设备之间通信使用的是串口或网络(Socket)的方式.扫描头和贴标机使用的网络通信,输送线和称重机使用的是串口通信. 串口通信,以前一直觉得神秘,没想到用起来却这么简单.当然,这样简单要归功于 .NET 对其操作的封装. .NET 里提供了专门操作串口的类 System.IO.Ports.SerialPort,可以操作串口收发数据.只需要 new 一个对象,简单配置一下相关属性,就可

Android 串口通信编程及串口协议分析_Android

Android 串口通信编程:嵌入式编程和可穿戴设备及智能设备都会用到串口,这里就带大家分析下, 一,android串口通信 串口通信采用一个第三方开源项目,实现串口数据收发. 1. 使用了http://code.google.com/p/android-serialport-api/的项目的serialport api和jni: 2. 支持4串口同时收发,有定时自动发送功能,收发模式可选Txt或Hex模式: 3.  n,8,1,没得选: 4. 为减轻界面卡顿的情况,接收区的刷新采用单独的线程进

使用Java实现串口通信_java

1.介绍 使用Java实现的串口通信程序,支持十六进制数据的发送与接收. 源码下载地址:http://download.csdn.net/detail/kong_gu_you_lan/9611343 效果图如下: 2.RXTXcomm Java串口通信依赖的jar包RXTXcomm.jar 下载地址:http://download.csdn.net/detail/kong_gu_you_lan/9611334 内含32位与64位版本 使用方法: 拷贝 RXTXcomm.jar 到 JAVA_HO

在php串口通信编程时,出现win_serial is not compiled into PHP

问题描述 在php串口通信编程时,出现win_serial is not compiled into PHP 最近想试试php的串口通信,我装的是phpstudy2014,我看了一下apache2.4和php5xx等系列都装在里面,于是下了个对应php版本的php_ser++.dll,并且放在了ext中,并在php.ini中添加了extension=php_ser++.dll,但用php designer8.0调试时,却出现了win_serial不能被编译成PHP,事关紧急,忘大神指导?????

C#结合串口通信类实现串口通信源代码

mycom是串口通信类.下面是串口通讯测试程序的源代码,将mycom类放在此项目中,可以实现简单的串口通信,希望读者能通过这个程序对串口通信过程有一个初步的了解: using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Threading; namesp

VisualBasic串口通信程序设计

1mscomm.vbx通信控件描述 mscomm.vbx通信控件可直接从vb的toolbox中加入窗体form,即可用其进行通信.若toolbox中无此控件,则用tools的customcontrols将mscomm.vbx从windows的system子目录中加入vb的toolbox中. 1.1通信方式 mscomm.vbx有2种不同的方式来处理和解决各类通信软件的开发和设计问题 1.事件驱动.它与c/c 写windows软件时的窗口回调函数类似,是1种功能强大的处理问题的方法.在实际工作中,