windows串口通信c(4)

来源:互联网 发布:淘宝客服和文员哪个好 编辑:程序博客网 时间:2024/06/03 13:17

overlapped读取

#include <windows.h>#include <cstdio>#include <iostream>#include <string>#include <vector>const char* StopBitsFromInt(int s) {    switch (s) {    case ONESTOPBIT:        return "1 stop bits";    case ONE5STOPBITS:        return "5 stop bits";    case TWOSTOPBITS:        return "2 stop bits";    }    return "Unknown stop bits";}const char* ParityFromInt(int s) {    switch (s) {    case NOPARITY:        return "no-parity";    }    return "other parity";}HANDLE MustOpenCommport() {    HANDLE hComm = CreateFile(L"\\\\.\\COM4",                //port name        GENERIC_READ | GENERIC_WRITE, //Read/Write        0,                            // No Sharing        NULL,                         // No Security        OPEN_EXISTING,                // Open existing port only        FILE_FLAG_OVERLAPPED,         // Non Overlapped I/O        NULL);        // Null for Comm Devices    if (INVALID_HANDLE_VALUE == hComm) {        std::cerr << "Error in opening serial port" << std::endl;        ExitProcess(-1);    } else {        //std::cout << "opening serial port successful" << std::endl;    }    //CloseHandle(hComm);//Closing the Serial Port    return hComm;}void ShowCommStatus(HANDLE hComm) {    DCB dcbParams = { sizeof(DCB) };    BOOL status = GetCommState(hComm, &dcbParams);    std::cout << "Baudrate:" << dcbParams.BaudRate << std::endl;    std::cout << "Parity:" << ParityFromInt(dcbParams.fParity) << std::endl;    std::cout << "ByteSize:" << int(dcbParams.ByteSize) << std::endl;    std::cout << "StopBit:" << StopBitsFromInt(dcbParams.StopBits) << std::endl;}int main() {    int a = sizeof(DWORD);    HANDLE hComm = MustOpenCommport();    DCB dcbParams = { sizeof(DCB) };    //std::cout << "setting ...\n\n" << std::endl;    dcbParams.BaudRate = CBR_128000;// CBR_256000;// CBR_9600;    dcbParams.ByteSize = 8;    dcbParams.StopBits = ONESTOPBIT; // 1    dcbParams.Parity = NOPARITY;    BOOL setOK = SetCommState(hComm, &dcbParams);    if (!setOK) {        std::cerr << "error setting comm-state" << std::endl;        ExitProcess(-1);    }    //ShowCommStatus(hComm);    // The rest are copied from tarm's golang version.    SetupComm(hComm, 64, 64);    if (!SetCommMask(hComm, EV_RXCHAR)) {        std::cerr << "error_category set-comm mask" << std::endl;        ExitProcess(-1);    }    COMMTIMEOUTS timeouts = { 0 };    const DWORD maxWord = (1LL << 32) - 1;    timeouts.ReadIntervalTimeout = 50;    timeouts.ReadTotalTimeoutMultiplier = 10;    timeouts.ReadTotalTimeoutConstant = 50;//in milliseconds    SetCommTimeouts(hComm, &timeouts);    OVERLAPPED osReader = { 0 };    osReader.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);    if (!osReader.hEvent) {        std::cerr << "Cannot create-event" << std::endl;        ExitProcess(-1);    }    BOOL fWaitingOnRead = FALSE;    char buffer[2];    while (1) {        ResetEvent(osReader.hEvent);        buffer[0] = 0;        DWORD dwRead = 0;        if (!fWaitingOnRead) {            dwRead = 0;            if (!ReadFile(hComm, buffer, sizeof(buffer) - 1, &dwRead, &osReader)) {                if (GetLastError() != ERROR_IO_PENDING) {                    std::cerr << "\nerror overlapping read" << std::endl;                } else {                    fWaitingOnRead = TRUE;                }            } else {                buffer[dwRead] = 0;                //std::cout << "<" << buffer << ">";            }        }        if (fWaitingOnRead) {            DWORD dwRes = WaitForSingleObject(osReader.hEvent, 500);            switch (dwRes) {            case WAIT_OBJECT_0:                dwRead = 0;                if (!GetOverlappedResult(hComm, &osReader, &dwRead, FALSE)) {                    std::cerr << "Error getting result" << std::endl;                } else {                    buffer[dwRead] = 0;                }                fWaitingOnRead = FALSE;                break;            case WAIT_TIMEOUT:                break;            default:                std::cerr << "error in switching-case wait-for-single-object" << std::endl;                break;            }        }        if (dwRead > 0) {            std::cout << buffer;            buffer[0] = 0;        }    }    CloseHandle(hComm);}

如果CreateFile时候没有指定FILE_FLAG_OVERLAPPED,那么所有的overlapped都不会发生.

原创粉丝点击