读书人

线程读串口的有关问题

发布时间: 2012-08-15 16:57:17 作者: rapoo

线程读串口的问题
我用的API写的串口读写,在读串口的时候用线程实时读取,
然后用虚拟串口工具设置两个串口COM1 COM2,用程序打开COM1,用串口调试工具打开COM2,2者进行串口通信,
发现在程序读数据的时候,每次都要先写一次,这是为什么????

[解决办法]

C/C++ code
//打开串口void OpenComm(){    if(bIfopen)        AfxMessageBox("串口已经打开!");    else    {        hCom = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING, FILE_FLAG_OVERLAPPED,NULL);          //创建串口,异步方式        if (hCom == INVALID_HANDLE_VALUE)            AfxMessageBox("打开串口失败!");        else        {            bIfopen = TRUE;            SetCommMask( hCom, EV_RXCHAR|EV_TXEMPTY );                //设置串口事件            SetupComm( hCom, 4096,4096);                            //设置读写缓冲区大小            PurgeComm( hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR );                        COMMTIMEOUTS comTimeOut;                        //设置超时            comTimeOut.ReadIntervalTimeout = 100;            //两字符之间最大的延时            comTimeOut.ReadTotalTimeoutMultiplier = 50;        //读取每字符间的超时            comTimeOut.ReadTotalTimeoutConstant = 1000;        //一次读取串口数据的固定超时            comTimeOut.WriteTotalTimeoutMultiplier = 50;    //写入每字符间的超时            comTimeOut.WriteTotalTimeoutConstant = 1000;    //一次写入串口数据的固定超时            SetCommTimeouts(hCom,&comTimeOut);                        DCB dcb;            GetCommState(hCom, &dcb );                               //串口设置            dcb.BaudRate = 9600;                                                dcb.ByteSize = 8;             dcb.Parity = NOPARITY;            dcb.StopBits = ONESTOPBIT;            dcb.fBinary = TRUE;            dcb.fParity = FALSE;            SetCommState( hCom, &dcb );        }    }}
[解决办法]
C/C++ code
//读取数据int ReadComm(int inum, BYTE* bdata ){    DWORD dwRes;    DWORD dwDataRead;    Read_OS.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);    if ( NULL == Read_OS.hEvent)         return -1;    if (ReadFile(hCom, bdata, inum, NULL, &Read_OS))         return 0;                    //成功读出    else    {        dwRes = WaitForSingleObject(Read_OS.hEvent, 5000);        //设置5秒超时        switch(dwRes)        {            case WAIT_OBJECT_0:                if (!GetOverlappedResult(hCom, &Read_OS, &dwDataRead, TRUE))                 {                    //操作失败,可用GetLastError()获取失败信息                    return 1;                }                else                {                    //成功                    return 0;                }                break;            case WAIT_TIMEOUT:                //超时                return 2;                break;            default:                return 3;                break;        }    }    CloseHandle(Read_OS.hEvent);    return 0;}
[解决办法]
C/C++ code
//以事件驱动的读线程DWORD TheardEvent(LPVOID pParam){    BOOL bCommState = TRUE;    DWORD deEvtMask, dwRes, dwLength;    DWORD dwErrors;    COMSTAT ComStat;    int i;    CString str;    BOOL bifwan = FALSE;    BYTE bmydata[25];    OS.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);    while (bCommState)     {        WaitCommEvent(hCom, &deEvtMask, &OS);        dwRes = WaitForSingleObject(OS.hEvent, INFINITE);        if(WAIT_OBJECT_0 == dwRes)        {            if(EV_RXCHAR == deEvtMask)            {                ClearCommError(hCom, &dwErrors, &ComStat);                dwLength = ComStat.cbInQue;                if (dwLength > 0)                {                    ReadComm(dwLength, bmydata);                }                memcpy(&Buffer[igbal], bmydata, dwLength);                igbal += dwLength;                for (i=0; i<(int)dwLength; i++)                 {                    if(0x16 == bmydata[i])                        bifwan = TRUE;                }                if(bifwan)                {                    ::PostMessage(HWND(mainhandle), WM_DEBUG, 0, 0);                    bifwan = FALSE;                }            }        }    }    return 0;} 


[解决办法]

探讨

他妈的,我受不了了,原来我程序没问题,是我测试用的虚拟串口工具只能单步通信,浪费了我2天时间

读书人网 >VC/MFC

热点推荐