我现在在做一个串口编程的程序,在架构上不是很清楚,我可能得用循环查询的方式来检查是否有数据到来(工程的原因),想完成的功能是有数据来时就读出来(每次的数据长度可能不一样,但我也不知道对方到底发多长的数据给我,但以一句话为单位,所以我规定读、写缓冲区都为1024字节,每次读时就在ReadFile()函数中指定读260字节,应该够了,波特率为1200,没有设标志),所以我想问问不要发生死锁、提高效率该怎样设置COMMTIMEOUTS和DCB?
调试欢乐多
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;有什么问题?谢谢!
我觉得原来的程序不管用什么方式,它肯定应该能工作。以文件的方式对串口进行操作,应该是异步进行的方式,指定不指定FILE_FLAG_OVERLAPPED方式看你的处理方式而定。如果你愿意可以改动原来的设计时的结构,否则没有必要改动原来的结构设计。只要能向串口发送数据和从串口接受数据就行。设置参数不正确的时候,应该不能够正确接受或者发送数据,我一般都会采用推荐的默认参数。
主要是你对接受到的数据如何进行处理,我一般都是自己建立缓冲区,顺序存贮接受到的数据,然后根据协议和一些不同的策略对缓冲区中的数据进行扫描和处理。另:用锁一般是在资源争用的情况下才对资源进行加锁的。如果是一个线程对一个串口或缓冲区进行操作,没有必要进行加锁;如果多个线程对一个串口或缓冲区进行操作,就需要对串口或缓冲区进行加锁。
CreateFile 的一个模式参数值:FILE_FLAG_OVERLAPPED 是异步通讯,非堵塞模式
FILE_ATTRIBUTE_NORMAL 同步通讯,堵塞模式。
和DCB struDcb;的各项设置还不是很了解,是否在串口通讯时,在任何工程中都可以用默认值呢?(我认为是否因工程的需要某些选项是应该不同的。)谢谢BigFatBear(笨熊) 和jEditor(jEditor) 。