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());
}