TimeOuts. ReadIntervalTimeout=0 //读间隔超时 TimeOuts.ReadTotalTimeoutMultiplier=10 //读时间系数 TimeOuts.ReadTotalTimeoutConstant=100 //读时间常量 TimeOuts.WriteTotalTimeoutMultiplier=10 //写时间系数 TimeOuts.WriteTotalTimeoutConstant=100 //写时间常数 SetCommTimeouts(hCom, &TimeOuts); // 保存设置值生效 ……………………………… ……………………………… ……………………………… COMMTIMEOUTS结构的成员都以毫秒为单位。总超时的计算公式是: 总超时=时间系数×要求读/写的字符数+ 时间常数 异步方式读写串行口时虽然ReadFile()和WriteFile() 在完成操作以前就可能返回但超时仍然是起作用的。这种情况下,超时规定的是操作的完成时间而不是ReadFile()和WriteFile()的返回时间。 (3)读写串口 初始化工作完成以后便可以根据通信协议合理安排读/写函数ReadFile()和WriteFile()以读写各种握手信息和数据信息等。其中何时读取单片机发送过来的数据信息及应答信息是重要的。此时采取的是事件驱动法,即:设置通信资源上的事件掩码为EV_RXCHAR 。当接收到一个字符并放入缓冲区后即通知应用程序例。 //PC发送一组命令至单片机 WriteFile(mHandle, //串口句柄 pDataBuff, //存放数据缓种区 iLen, //所写数据的长度 pdwWritten, //已写长度操作前应置为0 lpOverlapped) //异步方式 //设置通信事件掩码 DWORD dwMask=EV_RXCHAR; SetCommMask(m_hFile,dwMask)) //设置通信事件掩码 //等待通信事件的发生 OVERLAPPED os ; memset( &os, 0, sizeof( OVERLAPPED ) ) ; os.hEvent=CreateEvent(NULL TRUE FALSE NULL) if(!WaitCommEvent(m_hFile, &dwEvtMask, &os)) // 重叠操作 if(GetLastError()==ERROR_IO_PENDING) { // 无限等待重叠操作结果 GetOverlappedResult(mHandle, &os, &dwTrans, true); //事件已发生安排读操作 ReadFile(mHandle, //串口句柄 pDataBuff, //存放数据缓种区 iLen, //所读数据的长度 pdwRead, //实际所读长度 lpOverlapped) //异步方式 } 在上例中,我们无限等待通信事件的发生。如果通信事件一直没有发生则系统将不会继续执行。在实际程序设计中我们可以设置一时限,超过此时限通信事件未到则执行相应错误处理此时,只需将GetOverlappedResult函数替换为WaitForSingleObject函数此函数的声明形式如下: WaitForSingleObject( HANDLE hEvent, //事件句柄 unsigned long mTimeOuts //超时设置 ) (4) 关闭串口 通信完毕调用CloseHandle() 函数关闭串口例如 CloseHandle(mHandle); //关闭mHandle为打开串口时返回的句柄 6.4 单片机软件设计 我们知道影响数据转输产生错误的因素有:转输线分布参数上下位机间的波特率误差现场干扰等。而针对近程小批量数据的通信,下位机的波特率误差性是影响可靠通信的最主要因素。所以在单片机软件的设计时应重点考虑并设置好波特率。 6.4.1波特率 (1)波特率误差来源分析 ①单片机的振荡电路是由晶体及电容C1 和C2 构成。晶振频率主要由晶体的因有频率决定,同时也与电容C1、C2及外界温度有一定的关系。另外,晶体频率的标称值与实际值也不可能完全一致。 ②波特率最大允许误差分析 在异步串行通信方式1中单片机以16倍波特率的采样速率对接收数据(RXD)不断采样,一旦检测到由1到0的负跳变,16分频计数器立刻复位,使之满度翻转的时刻恰好与输入位的边沿对准。16分频计数器把每个接收位的时间分为16 份,在中间三位即7 ,8 ,9 ,状态时位检测器对RXD 端的值采样,并以3取2的表决方式确定所接收的数据位。由此可见,当波特率的误差使得在接收某位数据位时,采样点离该位的中点半位间隔时将会对该位采样两次。即:欲使接收的第N位为正确位时,须满足下式成立: 所允许的波特率误差N > 0.54 故当所传输的一帧数据为10 位时,所允许的最大的波特率允许误差为5 %对于其它常用的8位,9位,11位,一帧的串行传输,其最大的波特率允许误差分别为6.25%,5.56%, 和4.5%。 ③减小波特率误差的措施 我们知道使用离散度小的晶振是
首页 上一页 3 4 5 6 7 8 9 下一页 尾页 6/11/11
WORD格式全文下载链接(充值:元)