我现在在做一个串口编程的程序,在架构上不是很清楚,我可能得用循环查询的方式来检查是否有数据到来(工程的原因),想完成的功能是有数据来时就读出来(每次的数据长度可能不一样,但我也不知道对方到底发多长的数据给我,但以一句话为单位,所以我规定读、写缓冲区都为1024字节,每次读时就在ReadFile()函数中指定读260字节,应该够了,波特率为1200,没有设标志),所以我想问问不要发生死锁、提高效率该怎样设置COMMTIMEOUTS和DCB?

解决方案 »

  1.   

    我的设置为:
    COMMTIMEOUTS struTimeOut;
    struTimeOut.ReadIntervalTimeout = MAXWORD;
    struTimeOut.ReadTotalTimeoutMultiplier = 0;
    struTimeOut.ReadTotalTimeoutConstant = 1500;
    struTimeOut.WriteTotalTimeoutMultiplier = 0;
    struTimeOut.WriteTotalTimeoutConstant = 500;DCB struDcb;
    struDcb.DCBlength=sizeof(DCB);
    struDcb.BaudRate=1200;
    struDcb.ByteSize=7;
    struDcb.Parity=EVENPARITY;
    struDcb.StopBits=ONESTOPBIT;
    struDcb.fOutxDsrFlow=0;
    struDcb.fDtrControl=DTR_CONTROL_ENABLE;
    struDcb.fOutxCtsFlow=0;
    struDcb.fRtsControl=RTS_CONTROL_ENABLE;
    struDcb.fInX=false;
    struDcb.fOutX=false;
    struDcb.fBinary=true;
    struDcb.fParity=true;有什么问题?谢谢!
      

  2.   

    对不起我是一新手,帮不了你什么忙,我想请教您几个问题,我今年刚毕业现在在一家通信设备集团有限公司上班,他们现在在编写天津轻轨通信串口程序,我也要参加编写,可是我以前是学c的,对vc不太了解老师傅们也不教我,因为现在我们正在裁人,如果你愿意教可以我在问大虾!谢谢!
      

  3.   

    还有,我查了许多资料,都各有所云,但有一点讲得比较多,就是在打开串口时必须指定FILE_FLAG_OVERLAPPED属性,这样可以用消息来处理,从而能解决死锁问题,还能提高效率,我想问一下,在NT系统上打开串口时是否一定要指定FILE_FLAG_OVERLAPPED属性,只指定FILE_ATTRIBUTE_NORMAL不行吗?没办法,别人已经把程序设计成这样了,用了循环查询的方式,而且用了多线程,并且还实现了主动向串口发命令的功能。我要同时控制多个串口,请回答,谢谢!
      

  4.   

    周末没来,不好意思,没有及时给你回信。有的地方我也不是很清楚。只能谈一下自己的想法供你参考。
    我觉得原来的程序不管用什么方式,它肯定应该能工作。以文件的方式对串口进行操作,应该是异步进行的方式,指定不指定FILE_FLAG_OVERLAPPED方式看你的处理方式而定。如果你愿意可以改动原来的设计时的结构,否则没有必要改动原来的结构设计。只要能向串口发送数据和从串口接受数据就行。设置参数不正确的时候,应该不能够正确接受或者发送数据,我一般都会采用推荐的默认参数。
    主要是你对接受到的数据如何进行处理,我一般都是自己建立缓冲区,顺序存贮接受到的数据,然后根据协议和一些不同的策略对缓冲区中的数据进行扫描和处理。另:用锁一般是在资源争用的情况下才对资源进行加锁的。如果是一个线程对一个串口或缓冲区进行操作,没有必要进行加锁;如果多个线程对一个串口或缓冲区进行操作,就需要对串口或缓冲区进行加锁。
      

  5.   

    你需要更加深入的对端口编程进行详细的了解,了解需要那些优化模式/
    CreateFile 的一个模式参数值:FILE_FLAG_OVERLAPPED 是异步通讯,非堵塞模式
                                FILE_ATTRIBUTE_NORMAL 同步通讯,堵塞模式。
      

  6.   

    谢谢上面各位的回答,很感谢你们,不过我对COMMTIMEOUTS struTimeOut;
    和DCB struDcb;的各项设置还不是很了解,是否在串口通讯时,在任何工程中都可以用默认值呢?(我认为是否因工程的需要某些选项是应该不同的。)谢谢BigFatBear(笨熊) 和jEditor(jEditor) 。
      

  7.   

    如果不想用重叠读写的话(就是设FILE_FLAG_OVERLAPPED), 一个线程读,一个线程写,注意用CriticalSection保持读写的同步。DCB的设置对于不同的串口设备可能稍有不同,你可以参考MSDN。