串口通讯中遇到的几个函数

阿紫 posted @ 2012年4月11日 17:48 in c/c++ , 2154 阅读

串口工具中碰到的几个问题:

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

    其实用第三方类也挺方便的,不过貌似第三方类有个问题,具体的问题记不清了,后续继续研究串口通讯。先写到这,待续。。。^_^

  • 无匹配

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter