首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > WinCE >

请问一下WinCE串口通讯的有关问题,大侠们一看估计就知道原因,但困扰小弟我了

2012-02-29 
请教一下WinCE串口通讯的问题,大侠们一看估计就知道原因,但困扰我了闲话少说,贴出代码来:C/C++ code//串口

请教一下WinCE串口通讯的问题,大侠们一看估计就知道原因,但困扰我了
闲话少说,贴出代码来:


C/C++ code
//串口打开函数BOOL OpenPort(HWND hWnd){    DWORD dwError;    //打开串口    hSerPort=CreateFile(TEXT("COM1:"),                        GENERIC_READ | GENERIC_WRITE,                        0,                        NULL,                        OPEN_EXISTING,                        0,                        NULL);    if(hSerPort == INVALID_HANDLE_VALUE)    {        dwError = GetLastError();        MessageBox(hWnd, _T("Open Port (COM1:) Error!"), _T("ERROR"), 0);        return FALSE;    }        //设置串口输入输出缓冲区大小    //SetupComm(hSerPort, _InQue, _OutQue);    //设置串口事件掩码    //SetCommMask(hSerPort, 0);    //设置串口属性    if(ConfigComm())    {        fContinue = TRUE;        return TRUE;    }    else    {        MessageBox(hWnd, TEXT("Config COM1: error!"), TEXT("ERROR"), 0);        CloseHandle(hSerPort);        return FALSE;    }}//串口设置函数BOOL ConfigComm(){    DCB dcb;    COMMTIMEOUTS tmOuts;    //获取串口原始属性    GetCommState(hSerPort, &dcb);    dcb.BaudRate = 19200;        // 设置波特率    dcb.ByteSize = 8;            // 数据位,范围:4-8     dcb.Parity   = NOPARITY;    // 校验模式:无校验    dcb.StopBits = ONESTOPBIT;    // 停止位: 1位    dcb.fParity  = FALSE;        // 不支持奇偶校验    //dcb.fBinary  = TRUE;        // 设置二进制模式,此处必须设置TRUE    dcb.fNull    = FALSE;        // Disable null stripping     /*以下这些设置了之后有用么???    dcb.fOutxCtsFlow  = FALSE;    // No CTS output flow control     dcb.fOutxDsrFlow  = FALSE;    // No DSR output flow control     dcb.fDtrControl   = DTR_CONTROL_DISABLE;    //启用流量控制    // DTR flow control type    dcb.fDsrSensitivity   = FALSE;    // DSR sensitivity     dcb.fTXContinueOnXoff = TRUE;    // XOFF continues Tx     dcb.fOutX             = FALSE;    // No XON/XOFF out flow control     dcb.fInX              = FALSE;    // No XON/XOFF in flow control     dcb.fErrorChar        = FALSE;    // Disable error replacement     dcb.fRtsControl       = RTS_CONTROL_ENABLE;    // RTS flow control    dcb.fAbortOnError     = FALSE;    // 当串口发生错误,并不终止串口读写    */    if(!SetCommState(hSerPort, &dcb))    {        return FALSE;    }    //设置串口超时时间,[color=#FF0000]这样设置有问题吗?超时的设置是不是跟波特率有关才行?[/color]    GetCommTimeouts(hSerPort, &tmOuts);    tmOuts.ReadIntervalTimeout = 0;    tmOuts.ReadTotalTimeoutConstant = 0;    tmOuts.ReadTotalTimeoutMultiplier = 0;    tmOuts.WriteTotalTimeoutConstant = 0;    tmOuts.WriteTotalTimeoutMultiplier = 0;    if(!SetCommTimeouts(hSerPort, &tmOuts))    {        return FALSE;    }    //指定端口监测的事件集    //SetCommMask (hSerPort, EV_RXCHAR);        //分配设备缓冲区    //SetupComm(hSerPort, 10, 10);    //初始化缓冲区中的信息    PurgeComm(hSerPort, PURGE_TXCLEAR | PURGE_RXCLEAR);    return TRUE;}DWORD SendThread (PVOID pArg){    TCHAR szText[TEXTSIZE];    TCHAR szDlg[128];    DWORD dwLen;    BOOL stat, start;    HWND hWnd = (HWND)pArg;    start = TRUE;    while(1)    {        Sleep(5000);        if(fContinue)        {            if(!fContinue)//这句话是浪费的,大家不用管                break;            if(start)            {                lstrcat(szText, TEXT("ATE0\r"));                start = FALSE;                wsprintf(szDlg, TEXT("Sended ATE0. \r\n"));                UpdateHistory((LPARAM)szDlg);            }            else            {                lstrcat(szText, TEXT("AT\r"));                //显示发送的数据                wsprintf(szDlg, TEXT("Sended AT.\r\n"));                UpdateHistory((LPARAM)szDlg);            }            PurgeComm(hSerPort, PURGE_TXCLEAR | PURGE_RXCLEAR);    //发送之前先清空输入输出缓冲区            stat = WriteFile (hSerPort, szText, lstrlen (szText)*sizeof (TCHAR), &dwLen, 0);            if(!stat)            {                wsprintf(szDlg, TEXT("Send ERROR!!\r\n"));                UpdateHistory((LPARAM)szDlg);                return 0;            }        }        else            break;    }    return 0;}DWORD ReadThread (PVOID pArg){    //BYTE szText[TEXTSIZE];    //COMSTAT comstat;    //SetCommMask (hSerPort, EV_RXCHAR);     while (fContinue)    {        /*        if(ReadFile(hSerPort, szText, 10, &dwLength, NULL))        {            if(dwLength != 0)            {                TCHAR dlg[128];                wsprintf(dlg, TEXT("received %d bytes.\r\n"), dwLength);                UpdateHistory((LPARAM)dlg);                UpdateHistory((LPARAM)szText);            }        }*/        /*************************************************        DWORD dwError, dwLength;        COMSTAT comstat;        ClearCommError(hSerPort, &dwError, &comstat);        if(comstat.cbInQue > 0)        {            ReadFile(hSerPort, &szText, comstat.cbInQue, &dwLength, 0);                        //保存数据            TCHAR *tmp = new TCHAR[iCount + 1];            if(tmp == NULL)                return -1;            TCHAR dlg[128];            wsprintf(dlg, TEXT("received %d bytes.\r\n"), comstat.cbInQue);            UpdateHistory((LPARAM)dlg);            memcpy(tmp, szText, iCount);            lstrcat(tmp, TEXT("\r\n"));            UpdateHistory((LPARAM)tmp);            PurgeComm(hSerPort, PURGE_RXCLEAR);        }                Sleep(1);*/        //**************************************************/        //DWORD dwCommStatus;        //WaitCommEvent(hSerPort, &dwCommStatus, 0);        //SetCommMask (hSerPort, EV_RXCHAR);        //PurgeComm(hSerPort, PURGE_RXCLEAR);        //memset(szText, 0, sizeof(szText));        TCHAR szText[TEXTSIZE];        BYTE rByte;    //接收到的一个字节        DWORD dwLength;    //实际接收的字节数        INT iCount=0;        TCHAR tch;        do        {            ReadFile(hSerPort, &rByte, 1, &dwLength, 0);            if(dwLength == 1)            {                szText[iCount] = rByte;                iCount ++;                tch = (tch << 8) & 0xff00;                if (tch == TEXT ('\n'))                    break;                //if(iCount >= TEXTSIZE)                //{                //    return -1;//缓冲区满                //}            }        }while(dwLength == 1);        //ClearCommError(hSerPort,&dwReadErrors,&cmState);//清除错误标志并得到串口状态        //PurgeComm(hSerPort, PURGE_RXCLEAR);        if(iCount == 0)        {            //Sleep(100);            continue;    //没接收到数据,继续下次循环        }        //保存数据        TCHAR dlg[128];        wsprintf(dlg, TEXT("received %d bytes.\r\n"), iCount);        UpdateHistory((LPARAM)dlg);        TCHAR *tmp = new TCHAR[iCount + 1];        if(tmp == NULL)            return -1;        memcpy(tmp, szText, iCount);        lstrcat(tmp, TEXT("\r\n"));        UpdateHistory((LPARAM)tmp);        //iCount = 0;        //Sleep(100);    }    return 0;} 




问题:
1. ReadThread能够读取数据,但就算我每5秒发送一次AT命令,接收回来的应该只有OK才对,实际上回来的不止一个OK,几乎每次接收到的数据是上次接收到的数据的2倍,这究竟是个啥原因??
2. 虽然读取到了数据,但却是在发送了N个AT命令之后才开始出来数据,这跟网上他们发的那个测试程序完全不一样(那个是发一个AT随即回来一个OK的,而且每次发了AT只回来一个OK,我的发一个能回来N个OK....),我的代码错在哪里呢?

[解决办法]
GetCommTimeouts(hSerPort, &tmOuts);
tmOuts.ReadIntervalTimeout = MAXDWORD;
tmOuts.ReadTotalTimeoutConstant = MAXDWORD;
tmOuts.ReadTotalTimeoutMultiplier = MAXDWORD;
tmOuts.WriteTotalTimeoutConstant = 0;
tmOuts.WriteTotalTimeoutMultiplier = 0;
改成这样看下

热点排行