win32 串口 通信 异步方式 事件驱动方式

根据
《Visual C++ 实践与提高 — 串口通信与工程应用篇 第2版》 第7章内容整理
仅仅是演示 代码有漏洞

代码如下:

// SerialTG.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <windows.h>

HANDLE hCom;

HANDLE hThreadEvent;
DWORD ThreadProcEvent(LPVOID pParam);
bool bEventRun;
HWND hWnd;
DWORD dwThreadID;
OVERLAPPED Eol={0};
OVERLAPPED Wol={0};
OVERLAPPED Rol={0};
bool fStopMsg;


LONG OnReceiveEvent(void)
{
    BYTE myByte[50];
    DWORD dwRes;
    DWORD dwRead;
    DWORD dwErrors;
    COMSTAT Rcs;
    fStopMsg = true;

    BOOL bResult ;

    memset(myByte,0,sizeof(myByte));

    ClearCommError(hCom,
                    &dwErrors,
                    &Rcs );

    bResult = ReadFile(hCom,
                        &myByte,
                        9,
                        NULL,
                        &Rol);

    if(bResult){

        printf("recv success myByte = %s\r\n",myByte);


    }else{


        Rol.hEvent = CreateEvent(NULL,
                                TRUE,
                                FALSE,
                                NULL );

        dwRes = WaitForSingleObject(Rol.hEvent,
                                    5000 );

        switch(dwRes){

            case WAIT_OBJECT_0:
                bResult = GetOverlappedResult(hCom,
                                              &Rol,
                                              &dwRead,
                                              TRUE  );
                if(!bResult){

                    printf("fail\r\n");

                }else{

                    printf("success dwRead = %d\r\n",dwRead);
                    printf("recv data = %s\r\n",myByte);

                }

                break;

            case WAIT_TIMEOUT:
                break;


            default:
                break ;


        }


    }


    fStopMsg = false ;
    return 0 ;
}

DWORD ThreadProcEvent(LPVOID pParam)
{
    DWORD dwEvtMask;
    DWORD dwRes;

    Eol.hEvent = CreateEvent(NULL,
                            TRUE,
                            FALSE,
                            NULL );

    while(bEventRun){

        WaitCommEvent(hCom,
                       &dwEvtMask,
                       &Eol);

        dwRes = WaitForSingleObject(Eol.hEvent,100);

        switch(dwRes){

            case WAIT_OBJECT_0:

                switch(dwEvtMask){

                    case EV_RXCHAR:
                        OnReceiveEvent();
                        break;

                    case EV_TXEMPTY:

                        break ;
                }

            break;
        }
    }

    return  true;
}

int _tmain(int argc, _TCHAR* argv[])
{

    hCom = CreateFile(TEXT("COM6"),
                      GENERIC_READ|GENERIC_WRITE,
                      0,
                      NULL,
                      OPEN_EXISTING,
                      FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
                      NULL
                    );

    if(hCom != INVALID_HANDLE_VALUE){

        SetupComm(hCom,1024,512);

        DCB myDCB;
        GetCommState(hCom,&myDCB);

        myDCB.BaudRate = CBR_9600;   // 设置波特率9600  
        myDCB.fBinary = TRUE; // 设置二进制模式,此处必须设置TRUE  
        myDCB.fParity = FALSE; // 支持奇偶校验  
        myDCB.fOutxCtsFlow = FALSE;  // No CTS output flow control  
        myDCB.fOutxDsrFlow = FALSE;  // No DSR output flow control  
        myDCB.fDtrControl = DTR_CONTROL_DISABLE; // No DTR flow control  
        myDCB.fDsrSensitivity = FALSE; // DSR sensitivity  
        myDCB.fTXContinueOnXoff = TRUE; // XOFF continues Tx  
        myDCB.fOutX = FALSE;     // No XON/XOFF out flow control  
        myDCB.fInX = FALSE;        // No XON/XOFF in flow control  
        myDCB.fErrorChar = FALSE;    // Disable error replacement  
        myDCB.fNull = FALSE;  // Disable null stripping  
        myDCB.fRtsControl = RTS_CONTROL_DISABLE;   //No RTS flow control  
        myDCB.fAbortOnError = FALSE;  // 当串口发生错误,并不终止串口读写  
        myDCB.ByteSize = 8;   // 数据位,范围:4-8  
        myDCB.Parity = NOPARITY; // 校验模式  
        myDCB.StopBits = 0;   // 1位停止位  

        SetCommState(hCom,&myDCB);

    }else{

        printf("创建串口失败!\r\n");
    }

    DWORD dwParam;

    if(!SetCommMask(hCom,EV_RXCHAR |EV_TXEMPTY)){

        printf("建立事件掩码失败 \r\n");
    }

    hThreadEvent = CreateThread(NULL,
                                0,
                                (LPTHREAD_START_ROUTINE)ThreadProcEvent,
                                &dwParam,
                                0,
                                &dwThreadID );
    if(hThreadEvent == INVALID_HANDLE_VALUE){

        printf("事件线程创建失败!");
    }

    bEventRun = true ;


    BYTE myByte[9]="AT\r\n";

    Wol.hEvent = CreateEvent(NULL,
                            TRUE,
                            FALSE,
                            NULL );

    WriteFile(hCom,
              &myByte,
              4,
              NULL,
              &Wol );

    printf("Running\r\n");

    while(1){

        Sleep(3000);
    }


    return 0;
}

运行结果:

Running
recv success myByte = AT
OK

猜你喜欢

转载自blog.csdn.net/wowocpp/article/details/80609894