最近在使用PJ Naughter的CSerialPort做一个串口程序,底层使用三个线程进行异步发送,接收和处理,程序跑起来的的时候会出现丢失数据,而且还有一个非常严重的问题,就是接上设备以后程序无法正常退出...用TRACE跟踪发现三个子线程都已经结束返回,但是主线程的Wait就是得不到信号,由于工期很紧了, 设备只能白天去测试,而我以前又从来没接触过串口,对其特性了解得少之又少,故先在这里求助各位有经验的高手,如果有碰到过跟小弟类似问题的大侠还望不吝赐教。先提出几点:
1. 刚开始写这个程序的时候我不知道流控制的意思,在设置串口的时候用了XonXoffFlowControl,今天回来以后检查代码发现了这个问题,会不会是这个原因造成了丢失和程序无法退出?
2. 我没有进行命令反馈控制,也就是说我没有等待每条指令的反馈信息,而是把指令一堆一堆往buffer里面写的,会不会是这个原因造成下位机的阻塞,无法响应和丢失数据?另外,跟我的软件通信的下位机貌似是单片机,我调试时用的是USB转RS232串口线,不知道可靠否?

解决方案 »

  1.   

    汗,没人知道么...
    那等我把问题解决了就散分,楼层高的分就多哦 ;-]
    现在最怀疑的就是那根USB转串口的线了
      

  2.   

    我再顶... 
    没有人用过USB转串口线做过这方面的应用么...我的线是huge pine USB to Serial Ports的
    期待大侠的出现...
      

  3.   

    USB转RS232串口线
    ----------
    很有问题, 我用自己写的mscom 控件来打开串口通讯,结果只会死机。。
    后来用串口调试器 发现 只能打开一次,而且关闭不了。。 最后改用
    高级串口调试器才可以用,但是仍然碰到数据传送出现问题结论就是,USB转RS232串口线 有问题
      

  4.   

    USB转RS232串口线
    ~~~~~~~~~~~~~~~~~~`
    有时会有问题,这个控件以前也用过但看楼主的问题,好象不是出在串口上,在多线程部分的可能性大一些
      

  5.   

    CSerialPort本身就可以实现数据的异步或同步接收,楼主再开线程,有点多余
      

  6.   

    哇,突然这么多回复,真有点受宠若惊呢 :P, 一个一个来说
    首先,我的三个子线程都是在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).运行的时候如果没有接设备则没问题,但一接上设备主线程就退出不了...这问题真是把我急死了
      

  7.   

    USB转RS232串口线,没有问题,我一直用的这种线,一般用来连接控制单片机或是其他嵌入式的串口。我现在也在用VC开发上位机和单片机的通信。
      

  8.   

    各位高手,我现在用CSerialPort类进行串口通信,因为下层是用一个1:16硬件从COM1映射了16个虚拟串口,我需要在发送查询命令之前用DTR和RTS来进行虚拟串口的选择,比如在程序开始我设置RTS为真,DTR为真,然后设置DTR为FALSE,想选择设备1,则DTR从FALSE跳变到TRUE需要两次,
     选择设备5,则为(int i =0;i<5;i++)
                      DTR= false;
                      DTR = TRUE;}其他设备类似,
    我现在不知道怎么在CSerialPort类中实现这样的功能,EscapeCommFunction (hPort, SETDTR);这个函数中的SETDTR 和CLRDTR是怎么定义的
     急急!请帮忙看看啊,快答辩了,很是感谢