最近在使用PJ Naughter的CSerialPort做一个串口程序,底层使用三个线程进行异步发送,接收和处理,程序跑起来的的时候会出现丢失数据,而且还有一个非常严重的问题,就是接上设备以后程序无法正常退出...用TRACE跟踪发现三个子线程都已经结束返回,但是主线程的Wait就是得不到信号,由于工期很紧了, 设备只能白天去测试,而我以前又从来没接触过串口,对其特性了解得少之又少,故先在这里求助各位有经验的高手,如果有碰到过跟小弟类似问题的大侠还望不吝赐教。先提出几点:
1. 刚开始写这个程序的时候我不知道流控制的意思,在设置串口的时候用了XonXoffFlowControl,今天回来以后检查代码发现了这个问题,会不会是这个原因造成了丢失和程序无法退出?
2. 我没有进行命令反馈控制,也就是说我没有等待每条指令的反馈信息,而是把指令一堆一堆往buffer里面写的,会不会是这个原因造成下位机的阻塞,无法响应和丢失数据?另外,跟我的软件通信的下位机貌似是单片机,我调试时用的是USB转RS232串口线,不知道可靠否?
1. 刚开始写这个程序的时候我不知道流控制的意思,在设置串口的时候用了XonXoffFlowControl,今天回来以后检查代码发现了这个问题,会不会是这个原因造成了丢失和程序无法退出?
2. 我没有进行命令反馈控制,也就是说我没有等待每条指令的反馈信息,而是把指令一堆一堆往buffer里面写的,会不会是这个原因造成下位机的阻塞,无法响应和丢失数据?另外,跟我的软件通信的下位机貌似是单片机,我调试时用的是USB转RS232串口线,不知道可靠否?
解决方案 »
- 请教关于工具栏停靠问题!!!
- 调用dll中的CArray问题!
- 用vc写了个界面程序,发现vista系统下,当按下 ALT 键导致对话框窗口上的文字消失,这是什么原因呢?(附上代码)
- 大家帮忙~做主题框
- 自己创建一个静态库,如果这个静态库使用了MFC,如何配置MFC的链接比较好???
- 在两个CPP文件中都包含同样的.h文件时出现错误,是何原因?
- 深入浅出mfc电子版下载,请进!
- help! 关闭对话框的同时关闭程序!
- 为什么??:在一个类函数里启动一个线程,并用另一个成员函数作为线程函数,出错了
- 酷!你能生成Root证书吗?MakeCert.exe能吗?(200分)
- Raw Socket发送自定义IP/TCP包问题
- USRDLL 是什么意思
那等我把问题解决了就散分,楼层高的分就多哦 ;-]
现在最怀疑的就是那根USB转串口的线了
没有人用过USB转串口线做过这方面的应用么...我的线是huge pine USB to Serial Ports的
期待大侠的出现...
----------
很有问题, 我用自己写的mscom 控件来打开串口通讯,结果只会死机。。
后来用串口调试器 发现 只能打开一次,而且关闭不了。。 最后改用
高级串口调试器才可以用,但是仍然碰到数据传送出现问题结论就是,USB转RS232串口线 有问题
~~~~~~~~~~~~~~~~~~`
有时会有问题,这个控件以前也用过但看楼主的问题,好象不是出在串口上,在多线程部分的可能性大一些
首先,我的三个子线程都是在dll中开的To: corrupt(喜欢 睡在床板下 的思考)
不知道你当时用的串口线多少钱一根的?我用的好象3,40一根,难道是便宜没好货..
To: lyl_rabbit(阿牛)
是这样的,我发送的命令全部是从发送队列里取出来发的,所以开SendProc;每读到一整条完整指令就存到存到接收队列,所以开了ReadProc;而对命令的解析和处理另开了一个线程ResolveProc,在里面用回调函数进行处理,我想开三个工作线程的效率会高点吧
To: DentistryDoctor(不在无聊中无奈,就在沉默中变态)
应该没有这方面的问题,需要同步和互斥的地方我都检查过,EnterCriticalSection跟LeaveCriticalSection是配对出现了的,在线程的while循环中没有直接退出线程的可能。要不我把我的代码发给大侠帮我看看?下面是Debug窗口的输出,显示线程是已经退出了的...
读线程准备退出
The thread 0x104 has exited with code 1 (0x1).
发送线程准备退出
The thread 0x794 has exited with code 1 (0x1).
解析线程准备退出
The thread 0x864 has exited with code 1 (0x1).运行的时候如果没有接设备则没问题,但一接上设备主线程就退出不了...这问题真是把我急死了
选择设备5,则为(int i =0;i<5;i++)
DTR= false;
DTR = TRUE;}其他设备类似,
我现在不知道怎么在CSerialPort类中实现这样的功能,EscapeCommFunction (hPort, SETDTR);这个函数中的SETDTR 和CLRDTR是怎么定义的
急急!请帮忙看看啊,快答辩了,很是感谢