解决C# SerialPort类串口写入的阻塞问题

自从用上了C#,那真的叫一个爽,再也不用写函数声明,再也不用去手动释放内存,一个ToString函数,基本所有的类型转换都完成… …

但是爽是有代价的,比如用着用着毫无征兆的退出了,比如,程序里面一堆堆的try catch仍旧抓不到那个错误在哪里… …

如果以上的问题都可以容忍,依旧会有问题你没有办法容忍,比如今天要说的SerialPotr类阻塞问题。

该程序是COBAS8000电化学发光分析仪的接口,一开始就是用c#写的,使用了c#自带的SerailPort类。

先说说程序逻辑:

1、接口程序收到COBAS8000发送的条码请求。

2、接口程序到LIS数据库中找到要做的相应的项目。

3、接口程序发送ENQ.

4、仪器回复ACK后,接口程序将要做的项目发送给仪器。

发送部分的核心代码如下:

 代码如下 复制代码

public void SendOrder(OrderRecord order)
{

    string strSend = "";
    HeaderRecord head = new HeaderRecord();
    strSend+=head.GetString();
    PatientRecord patient = new PatientRecord();
    strSend+=patient.GetString();

    strSend += Encoding.ASCII.GetString(order.GetBytes());
    TerminationRecord termination=new TerminationRecord();
    strSend += termination.GetString();

    byte[] btSend=this.GetFrameBytes(Encoding.ASCII.GetBytes(strSend));

    Log log = new Log();
    log.Write("已准备好发送数据!");   

    this.sendBytes = btSend;

    this.State = ComState.Sending;

    this.IsSended = false;

    log.Write("马上发送ENQ!");
    this.SendENQ();

    dtENQSend = DateTime.Now;
    this.IsSendingENQ = true;

}

现在我们遇到的问题是:当接口程序收到条码请求,并在LIS中找到了项目,然后准备发送ENQ给设备的时候,卡死了!!!!!!

从日志上看,程序就停留在(”马上发送ENQ!”)不动了!

调用的函数是:

 代码如下 复制代码

serialPort.Write(bytes, 0, bytes.Length);

到这里程序就死了。

由于COBAS8000的超时时间是18秒,等到18秒后,仪器就将该条码的标本当做没有项目处理了,之后,它将继续发送下一个条码的请求!然后程序就又活了!!!!

于是乎,我写的那个接口每天就出现这样一种情况:

当大批量的标本上机之后,中间总会有一两个没有项目,将这两个标本挑出来,再上一遍,它又好了!!!

吵吵尝试和排除了以下几种情况:

1、由于UI和界面造成的程序假死,使得serialport没有将信息发送成功,于是我取消了所有的UI,经大规模标本测试,依旧会有一两个扫不上!

2、由于线程造成的锁死,于是乎我重新将读取放到一个独立的线程,使得串口的读写进行了分离,结果呢,还是会出问题。

最大的问题是平常标本不多的时候,一点问题都没有,大规模标本上上去后,就一两个出问题,serialPort的write方法,肯定在某个地方是有问题的,兴许是线程阻塞吧,但是由于看不到源代码,着实没有办法去跟踪解决。而且偶尔出现问题,这个问题本身就很难解决。

最后,祭出我的杀手锏,用串口的API来写吧,考虑到我原来在C++中用的多线程串口类很成熟,于是乎花了四天时间,用c++重新写了接口。调试了两个多月的问题,其实还不如四天重写解决问题快!

最后总结一下,如果要求高的程序,c/c++依旧是主流,c#么?开发之前,一定要考虑好,一定要做好出问题的打算

时间: 2024-11-13 06:49:22

解决C# SerialPort类串口写入的阻塞问题的相关文章

程序-多串口多线程工业控制实现(SerialPort类)实例下载

问题描述 多串口多线程工业控制实现(SerialPort类)实例下载 多串口多线程工业控制实现(SerialPort类)这篇文章下面链接了程序实例,请问有人有下载好的么?我这边一直不能下载 解决方案 08年的时候下载成功过

多串口多线程工业控制实现(SerialPort类)实例下载

问题描述 多串口多线程工业控制实现(SerialPort类)实例下载 http://blog.csdn.net/paobo/article/details/1780582# 文章下面有实例下载,有人下载成功么?我这边一直不能下载 解决方案 我记得08年下载成功过过, 解决方案二: http://blog.csdn.net/liquanhai/article/details/6941574 这里有

C#串口通信 serialport类

问题描述 有个C#的问题想请教,在线等!!我用C#中的serialport类做一个串口通信,遇到个问题,我查看了资料"通过调用一次serialport类中的Read()方法并不能确保所读取的数据就是完整一桢",我现在就遇到这个问题,我用Read()方法只能得到我数据的前9个字节,后面的数据得不到,百思不得其解,望赐教!Byte[]BSendTemp={0x00,0xff,0xff,0xcc,0x01,0x01,0x02,0x40,0x00,0x44};//建立临时字节数组对象seria

代码-【MFC,VS2013中使用Serialport类的问题???急】

问题描述 [MFC,VS2013中使用Serialport类的问题???急] 10C 上位机软件.1.在VC6.0中用SerialPort类,数据的传输完全没有问题.[我代码没有问题]2.使用串口精灵传输命令没有问题.[我机器没有问题]3.但是我现在将代码用在VS2013发送数据就完全没有反应.[同样的代码同样的机器用VS2013就有问题]VS2013中我把数据发送分为2个部分:①初始化串口+②发送数据命令.如果每次发送格式是:①初始化串口+②发送数据命令[没有问题]如果格式是:②发送数据命令[

使用serialport类,如何判断接收的数据已经中断?

问题描述 之前发过一次贴,简单测试以为可以了,实际还是不行.具体要求如下:使用serialport类接收串口数据(串口数据是由与计算机相连的一台仪表以固定格式连续发送的),现在接收数据已正常,但是不知怎样判断串口数据已中断.(此处我所说的串口数据中断,是指由于串口rs232连接线路中断,或与计算机连接的仪表已关闭停止向计算机发送数据).之前发帖求助,得到的用serialPort.BytesToRead=0得到缓冲字节长度,只能在serialPort打开时判断有效,如果起初接收正常,突然中断了串口

求一份VS2005用serialport类发短信的实例!

问题描述 用serialport写个程序发短信,不是很稳定,也不知道什么原因,谁有例子,贴出来我看下!谢了//sp.DataReceived+=newSerialDataReceivedEventHandler(this.ReadSMSData);if(sp.IsOpen){//MessageBox.Show(string.Format("{0}串口已经打开",comboBox1.Text));sp.Close();sp.Open();}try{sp.Open();}catch(Una

【COCOS2DX-LUA 脚本开发之十四】解决自定义CPP类通过TOLUA++ BINDING LUACOCOS2D后编译到ANDROID运行黑屏(没有调用自定义CPP类)的问题!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/lua-game/1388.html 唉,首先说点闲话 – -.Himi搞了不短的时间,这个问题一直没有解决,最后终于在张大(cocos2dx引擎开发者之一 张小明)的指导下解决了此问题. 本章基于上一篇  [COCOS2DX-LUA 脚本开发之十三]  与之前的项目整合 [Cocos2d-X(2.x) 游戏开发系列之二]cocos2dx最新

数据挖掘主要解决的四类问题

数据挖掘非常清晰的界定了它所能解决的几类问题.这是一个高度的归纳,数据挖掘的应用就是把这几类问题演绎的一个过程.下面让我们来看看它所解决的四类问题是如何界定的: 1.分类问题 分类问题属于预测性的问题,但是它跟普通预测问题的区别在于其预测的结果是类别(如A.B.C三类)而不是一个具体的数值(如55.65.75--). 举个例子,你和朋友在路上走着,迎面走来一个人,你对朋友说:我猜这个人是个上海人,那么这个问题就属于分类问题;如果你对朋友说:我猜这个人的年龄在30岁左右,那么这个问题就属于后面要说

如何解决企业产品类网站的SEO排名策略

摘要: 互联网网站何其多,但是要综合规律的话,那就是卖产品.卖服务.整个互联网企业产品类的网站多达80%,然而大多数企业网站的SEO排名却做得很差,那是因为企业网站大多数是单兵作 互联网网站何其多,但是要综合规律的话,那就是卖产品.卖服务.整个互联网企业产品类的网站多达80%,然而大多数企业网站的SEO排名却做得很差,那是因为企业网站大多数是单兵作站,基本都是在菜鸟在优化,今晚笔者就教你如何解决企业产品类网站的SEO排名策略,彻底解决产品类网站SEO排名靠后的问题. 1.正确的定位用户群体 首先