win32 串口 通信 异步 线程方式

该例子是:《Visual C++实践与提高-串口通信与工程应用篇_第2版》书上给出的部分源码,
整理修改之后的演示代码:
借助 TC35模块可以,正常运行:

代码如下:

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

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

HANDLE hCom;
DWORD ThreadProcWrite(LPVOID pParam);
DWORD ThreadProcRead(LPVOID pParam);
OVERLAPPED Wol={0};
OVERLAPPED Rol = {0};
HANDLE hThreadWrite;
HANDLE hThreadRead ;
HWND hWnd;

DWORD ThreadProcRead(LPVOID   pParam)
{
    BYTE    myByte[20];
    DWORD    dwRes;
    DWORD    dwRead;

    DWORD   dwRet ;

    BOOL bResult;

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

    Rol.hEvent = CreateEvent(NULL,          //创建Rol的hEvent成员为无信号状态
                            TRUE,
                            FALSE,
                            NULL);

    if (Rol.hEvent == NULL)
    {
        printf("hEvent is Empty\r\n");
        return -1;
    }


    bResult = ReadFile(hCom, //串口句柄
                &myByte,     //存放读取数据
                9,         //要读取的字节数
                NULL,
                &Rol) ;      //指向创建hCom时的Rol的指针

    if(bResult){
        printf("success read out A\r\n");
        //在这里加入处理读取数据代码,数据存放在myByte数组中          
    }

    dwRet =GetLastError() ;

    if(!bResult &&(dwRet == ERROR_IO_PENDING)){

        dwRes = WaitForSingleObject ( Rol.hEvent , 5000 );   //5秒超时

        switch(dwRes)
        {
            case  WAIT_OBJECT_0:

                if (!GetOverlappedResult (hCom,
                &Rol,
                &dwRead,    //实际读出的字节数
                TRUE) )     //TRUE表示直到操作完成函数才返回
                {
                //操作失败,可以使用GetLastError()获取错误信息
                }
                else
                {
                //操作成功完成,数据读取存入myByte中

                //这里加入处理数据的代码

                    printf("success read out dwRead = %d,%s\r\n",dwRead,myByte);
                }
            break;
            case   WAIT_TIMEOUT:
            //读操作失败,原因是超时
            printf("读操作失败,原因是超时\r\n");
            break;
            default:
            //这里加入默认处理代码
            break;
        }

    }

    CloseHandle(Rol.hEvent);

    return 0;

}

DWORD ThreadProcWrite(LPVOID   pParam)
{
    BYTE    myByte[10] ="AT\r\n";

    DWORD    dwRes;
    DWORD    dwWrite;


    BOOL bResult ;

    Wol.Internal = 0;        //设置OVERLAPPED结构Wol
    Wol.InternalHigh = 0;
    Wol.Offset = 0;
    Wol.OffsetHigh = 0;             
    Wol.hEvent = CreateEvent ( NULL,          //创建Wol的hEvent成员为无信号状态
                                TRUE,
                                FALSE,
                                NULL);

    if (Wol.hEvent == NULL)
    {
        printf("hEvent 空");
        return -1;
    }

    bResult = WriteFile (hCom,         //串口句柄
                        &myByte,     //存放待发送数据
                        4,         //欲发送的字节数
                        NULL,
                        &Wol) ;       //指向创建hCom时的Wol的指针

    if(bResult)
    {

        printf("send success \r\n");

    }

    if(!bResult){

        dwRes = WaitForSingleObject ( Wol.hEvent , 500 );   //5ms超时
        switch(dwRes)
        {
            case   WAIT_OBJECT_0:
                if (!GetOverlappedResult (hCom,
                                          &Wol,
                                          &dwWrite,   
                                          TRUE) )     //TRUE表示直到操作完成函数才返回
                {
                    //操作失败,可以使用GetLastError()获取错误信息
                }
                else
                {
                    //发送数据成功
                    printf("send success dwWrite = %d \r\n",dwWrite);
                    //这里加入发送成功的处理代码
                }
            break;
            case   WAIT_TIMEOUT:
            //读操作失败,原因是超时
            break;
            default:
            //这里加入默认处理代码
            break;
        }

    }

    CloseHandle(Wol.hEvent);

    return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
    hCom = CreateFile(_T("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("Open Serial Fail\r\n");

        return 0 ;
    }


    DWORD dwReadThreadID;
    DWORD dwReadParam;

    hThreadRead = CreateThread(NULL,
                                0,
                                (LPTHREAD_START_ROUTINE)ThreadProcRead,
                                &dwReadParam,
                                0,
                                &dwReadThreadID
                            );

    if(hThreadRead == NULL){

        printf("Create Read Thread Fail \r\n");
    }


    DWORD dwWriteThreadID;
    DWORD dwWriteParam;

    hThreadWrite = CreateThread(NULL,
                                0,
                                (LPTHREAD_START_ROUTINE)ThreadProcWrite,
                                &dwWriteParam,
                                0,
                                &dwWriteThreadID
                            );

    if(hThreadWrite == NULL){

        printf("Create Write Thread Fail \r\n");
    }



    while(1){

            Sleep(1000);
    }



    CloseHandle(hCom);

    return 0;
}

运行结果:

send success dwWrite = 4
success read out dwRead = 9,AT
OK

BUS BOUND 监控:
这里写图片描述

需要进一步的改善。
20180606

猜你喜欢

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