串口通讯中遇到的几个函数
串口工具中碰到的几个问题:
1、ClearCommError()
用途:清除串口错误或者读取串口现在状态
原型:BOOL ClearCommError(HANDLE hFile,LPDWORD lpErrors,LPCOMATAT lpStat)
参数:hFile:串口句柄
lpErrors:返回错误数值,错误代码:
1-CE_BREAK:检测到中断信号。也就是检测到某个字节数据缺少合法的停止位。
2-CE_FRAME:硬件检测到帧错误。
3-CE_IOE:通信设备发生输入/输出错误。
4-CE_MODE:设置模式错误,或者hFile值错误。
5-CE_OVERRUN:溢出错误,缓冲区容量不足,数据将丢失。
6-CE_RXOVER:溢出错误。
7-CE_RXPARITY:硬件检测到校验位错误。
8-CE_TXFULL:发送缓冲区已满。
lpStat:指向通信端口状态的结构变量,原型:
type struct _COMSTAT{
...
...
DWORD cbInQue;//输入缓冲区中的字节数
DWORD cbOutQue;//输出缓冲区的字节数
}
while (1) { bool bClearOk; bClearOk = ClearCommError( m_hComDev, &dwErrorFlags, &ComStat ); //如果函数调用成功,则返回值为非0;若函数调用失败,则返回值为0 }
if(!bClearOk) { return FALSE; } if (dwErrorFlags!=0)//错误数值 { end_time = clock(); if ((DWORD)((end_time-start_time)*1000/CLOCKS_PER_SEC) >= SERIALREAD_TIMEOUT) { return FALSE; } } else if ( ComStat.cbInQue >=data_size)//ComStat.cbInQue即为串口中当前含有的数据字节个数 { break; } else { end_time = clock(); if ((DWORD)((end_time-start_time)*1000/CLOCKS_PER_SEC) >= SERIALREAD_TIMEOUT) { return FALSE; }
2、clock()
c/c++中的计时函数是clock(),与其相关的数据类型是clock_t。MSDN中对该函数的定义:
clock_t clock(void);
该函数返回自程序开始运行的处理器时间,如果无可用信息,返回-1。转换返回值若以秒计需除以CLOCKS_PER_SEC。(在linux下是1000000,windows下是1000).也可以用clock()函数来计算机器运行一个循环或者处理其他事件到底花了多长时间。在要计时程序前后段分别调用clock函数,用最后一次的返回值减去前一次的返回值就得到运行的处理器时间,然后再转换为秒。如上例。
3、GetLastError()
作用就是取得上一个函数操作时所产生的错误代码。
DWORD GetLastError(void);通过调用,返回一个32位的数值。如:
DWORD dwError = GetLastError();
返回值的意义:
http://hi.baidu.com/_%E2d_%B7%B3_%DE%B2%C2%D2/blog/item/c12e8f3fff6f54c17c1e71c1.html
其实用第三方类也挺方便的,不过貌似第三方类有个问题,具体的问题记不清了,后续继续研究串口通讯。先写到这,待续。。。^_^
- 无匹配