void RunSerialConsole()

in BusTools/MinComm/main.cpp [741:885]


void RunSerialConsole (PCWSTR DevicePath, _In_ DCB* DcbPtr, SerialParamMask ParamMask)
{
    wprintf(L"Opening port '%s'\n", DevicePath);

    FileHandle serialHandle(CreateFileW(
        DevicePath,
        GENERIC_READ | GENERIC_WRITE,
        0,
        NULL,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
        NULL));
    if (!serialHandle.IsValid()) {
        throw wexception(
            L"Failed to open handle to serial device. "
            L"(DevicePath = %s, GetLastError() = 0x%x)",
            DevicePath,
            GetLastError());
    }

    if (!SetupComm(serialHandle.Get(), 512, 512)) {
        throw wexception(
            L"SetupComm() failed. (GetLastError() = 0x%x)",
            GetLastError());
    }

    DCB dcb;
    if (!GetCommState(serialHandle.Get(), &dcb)) {
        throw wexception(
                L"GetCommState() failed. Failed to get current device "
                L"configuration. (GetLastError() = 0x%x)",
                GetLastError());
    }

    if (ParamMask.BaudSet) {
        dcb.BaudRate = DcbPtr->BaudRate;
    }

    if (ParamMask.ParitySet) {
        dcb.Parity = DcbPtr->Parity;
        dcb.fParity = DcbPtr->fParity;
    }

    if (ParamMask.DataLengthSet) {
        dcb.ByteSize = DcbPtr->ByteSize;
    }

    if (ParamMask.StopBitsSet) {
        dcb.StopBits = DcbPtr->StopBits;
    }

    if (ParamMask.XonSet) {
        dcb.fInX = DcbPtr->fInX;
        dcb.fOutX = DcbPtr->fOutX;
    }

    if (ParamMask.OdsrSet) {
        dcb.fOutxDsrFlow = DcbPtr->fOutxDsrFlow;
    }

    if (ParamMask.OctsSet) {
        dcb.fOutxCtsFlow = DcbPtr->fOutxCtsFlow;
    }

    if (ParamMask.DtrSet) {
        dcb.fDtrControl = DcbPtr->fDtrControl;
    }

    if (ParamMask.RtsSet) {
        dcb.fRtsControl = DcbPtr->fRtsControl;
    }

    if (ParamMask.IdsrSet) {
        dcb.fDsrSensitivity = DcbPtr->fDsrSensitivity;
    }

    if (!SetCommState(serialHandle.Get(), &dcb)) {
        throw wexception(
            L"SetCommState() failed. Failed to set device to desired "
            L"configuration. (GetLastError() = 0x%x)",
            GetLastError());
    }

    auto commTimeouts = COMMTIMEOUTS();
    {
        commTimeouts.ReadIntervalTimeout = 10;
        commTimeouts.ReadTotalTimeoutConstant = 0;
        commTimeouts.ReadTotalTimeoutMultiplier = 0;
        commTimeouts.WriteTotalTimeoutConstant = 0;
        commTimeouts.WriteTotalTimeoutMultiplier = 0;
    }

    if (!SetCommTimeouts(serialHandle.Get(), &commTimeouts)) {
        throw wexception(
            L"SetCommTimeouts failed. (GetLastError() = 0x%x)",
            GetLastError());
    }

    DCB actualDcb;
    if (!GetCommState(serialHandle.Get(), &actualDcb)) {
        throw wexception(
            L"Failed to get current comm state. (GetLastError() = 0x%x)",
            GetLastError());
    }

    wprintf(
        L"                    baud = %d\n"
        L"                  parity = %s\n"
        L"               data bits = %d\n"
        L"               stop bits = %s\n"
        L"   XON/XOFF flow control = %s\n"
        L" output DSR flow control = %s\n"
        L" output CTS flow control = %s\n"
        L"             DTR control = %s\n"
        L"             RTS control = %s\n"
        L" DSR circuit sensitivity = %s\n",
        actualDcb.BaudRate,
        StringFromSerialParity(SerialParity(actualDcb.Parity)),
        actualDcb.ByteSize,
        StringFromSerialStopBits(SerialStopBits(actualDcb.StopBits)),
        (actualDcb.fInX && actualDcb.fOutX) ? L"on" : L"off",
        actualDcb.fOutxDsrFlow ? L"on" : L"off",
        actualDcb.fOutxCtsFlow ? L"on" : L"off",
        StringFromDtrControl(actualDcb.fDtrControl),
        StringFromRtsControl(actualDcb.fRtsControl),
        actualDcb.fDsrSensitivity ? L"on" : L"off");

    wprintf(L" =====================   Connected - hit ctrl+c to exit   =====================\n");

    ThreadHandle thread(CreateThread(
        NULL,
        0,
        ReadSerialThreadProc,
        serialHandle.Get(),
        0,
        NULL));
    if (!thread.IsValid()) {
        throw wexception(
            L"Failed to create ReadSerialThreadProc thread. "
            L"(GetLastError() = 0x%x)",
            GetLastError());
    }

    ReadConsoleWriteSerial(serialHandle.Get());
}