From b7f637a2bd685b41f42d2e3bf62bcbf7f0cd97ba Mon Sep 17 00:00:00 2001 From: drowe67 Date: Sat, 12 May 2018 20:30:54 +0000 Subject: [PATCH] added windows serial port debug code git-svn-id: https://svn.code.sf.net/p/freetel/code@3600 01035d8c-6547-0410-b346-abe4f91aad63 --- freedv-dev/src/dlg_ptt.cpp | 2 +- freedv-dev/src/serialport.cpp | 154 +++++++++++++++++++++++----------- 2 files changed, 105 insertions(+), 51 deletions(-) diff --git a/freedv-dev/src/dlg_ptt.cpp b/freedv-dev/src/dlg_ptt.cpp index 5dd74196..69177ebd 100644 --- a/freedv-dev/src/dlg_ptt.cpp +++ b/freedv-dev/src/dlg_ptt.cpp @@ -514,7 +514,7 @@ void ComPortsDlg::OnTest(wxCommandEvent& event) { #if defined(__WXGTK__) || defined(__WXOSX__) ctrlport = m_cbCtlDevicePath->GetValue(); #endif - fprintf(stderr, "opening serial port\n"); + fprintf(stderr, "opening serial port %s\n", ctrlport.c_str()); bool success = serialport->openport(ctrlport.c_str(), m_rbUseRTS->GetValue(), diff --git a/freedv-dev/src/serialport.cpp b/freedv-dev/src/serialport.cpp index 59dd0c93..ba4d2e5a 100644 --- a/freedv-dev/src/serialport.cpp +++ b/freedv-dev/src/serialport.cpp @@ -17,8 +17,12 @@ Serialport::~Serialport() { bool Serialport::openport(const char name[], bool useRTS, bool RTSPos, bool useDTR, bool DTRPos) { + fprintf(stderr, "starting openport(), name: %s useRTS: %d RTSPos: %d useDTR: %d DTRPos: %d\n", + name, useRTS, RTSPos, useDTR, DTRPos); + if (com_handle != COM_HANDLE_INVALID) { closeport(); + fprintf(stderr, "comm_handle invalid, closing\n"); } m_useRTS = useRTS; @@ -26,60 +30,110 @@ bool Serialport::openport(const char name[], bool useRTS, bool RTSPos, bool useD m_useDTR = useDTR; m_DTRPos = DTRPos; + #ifdef _WIN32 - { - COMMCONFIG CC; - DWORD CCsize=sizeof(CC); - COMMTIMEOUTS timeouts; - DCB dcb; - - if(GetDefaultCommConfigA(name, &CC, &CCsize)) { - CC.dcb.fOutxCtsFlow = FALSE; - CC.dcb.fOutxDsrFlow = FALSE; - CC.dcb.fDtrControl = DTR_CONTROL_DISABLE; - CC.dcb.fDsrSensitivity = FALSE; - CC.dcb.fRtsControl = RTS_CONTROL_DISABLE; - SetDefaultCommConfigA(name, &CC, CCsize); - } + { + COMMCONFIG CC; + DWORD CCsize=sizeof(CC); + COMMTIMEOUTS timeouts; + DCB dcb; - if((com_handle=CreateFileA(name - ,GENERIC_READ|GENERIC_WRITE /* Access */ - ,0 /* Share mode */ - ,NULL /* Security attributes */ - ,OPEN_EXISTING /* Create access */ - ,FILE_ATTRIBUTE_NORMAL /* File attributes */ - ,NULL /* Template */ - ))==INVALID_HANDLE_VALUE) - return false; + if(GetDefaultCommConfigA(name, &CC, &CCsize)) { + + CC.dcb.fOutxCtsFlow = FALSE; + CC.dcb.fOutxDsrFlow = FALSE; + CC.dcb.fDtrControl = DTR_CONTROL_DISABLE; + CC.dcb.fDsrSensitivity = FALSE; + CC.dcb.fRtsControl = RTS_CONTROL_DISABLE; + if (!SetDefaultCommConfigA(name, &CC, CCsize)) { + fprintf(stderr, "SetDefaultCommConfigA() failed\n"); + goto error; + } + + } else { + fprintf(stderr, "GetDefaultCommConfigA() failed\n"); + goto error; + } - if(GetCommTimeouts(com_handle, &timeouts)) { - timeouts.ReadIntervalTimeout=MAXDWORD; - timeouts.ReadTotalTimeoutMultiplier=0; - timeouts.ReadTotalTimeoutConstant=0; // No-wait read timeout - timeouts.WriteTotalTimeoutMultiplier=0; - timeouts.WriteTotalTimeoutConstant=5000; // 5 seconds - SetCommTimeouts(com_handle,&timeouts); - } + if((com_handle=CreateFileA(name + ,GENERIC_READ|GENERIC_WRITE /* Access */ + ,0 /* Share mode */ + ,NULL /* Security attributes */ + ,OPEN_EXISTING /* Create access */ + ,FILE_ATTRIBUTE_NORMAL /* File attributes */ + ,NULL /* Template */ + ))==INVALID_HANDLE_VALUE) { + fprintf(stderr, "CreateFileA() failed\n"); + goto error; + } - /* Force N-8-1 mode: */ - if(GetCommState(com_handle, &dcb)==TRUE) { - dcb.ByteSize = 8; - dcb.Parity = NOPARITY; - dcb.StopBits = ONESTOPBIT; - dcb.DCBlength = sizeof(DCB); - dcb.fBinary = TRUE; - dcb.fOutxCtsFlow = FALSE; - dcb.fOutxDsrFlow = FALSE; - dcb.fDtrControl = DTR_CONTROL_DISABLE; - dcb.fDsrSensitivity = FALSE; - dcb.fTXContinueOnXoff= TRUE; - dcb.fOutX = FALSE; - dcb.fInX = FALSE; - dcb.fRtsControl = RTS_CONTROL_DISABLE; - dcb.fAbortOnError = FALSE; - SetCommState(com_handle, &dcb); - } - } + if(GetCommTimeouts(com_handle, &timeouts)) { + timeouts.ReadIntervalTimeout=MAXDWORD; + timeouts.ReadTotalTimeoutMultiplier=0; + timeouts.ReadTotalTimeoutConstant=0; // No-wait read timeout + timeouts.WriteTotalTimeoutMultiplier=0; + timeouts.WriteTotalTimeoutConstant=5000; // 5 seconds + SetCommTimeouts(com_handle,&timeouts); + } else { + fprintf(stderr, "GetCommTimeouts()failed\n"); + goto error; + } + + /* Force N-8-1 mode: */ + if(GetCommState(com_handle, &dcb)==TRUE) { + dcb.ByteSize = 8; + dcb.Parity = NOPARITY; + dcb.StopBits = ONESTOPBIT; + dcb.DCBlength = sizeof(DCB); + dcb.fBinary = TRUE; + dcb.fOutxCtsFlow = FALSE; + dcb.fOutxDsrFlow = FALSE; + dcb.fDtrControl = DTR_CONTROL_DISABLE; + dcb.fDsrSensitivity = FALSE; + dcb.fTXContinueOnXoff= TRUE; + dcb.fOutX = FALSE; + dcb.fInX = FALSE; + dcb.fRtsControl = RTS_CONTROL_DISABLE; + dcb.fAbortOnError = FALSE; + if (!SetCommState(com_handle, &dcb)) { + fprintf(stderr, "SetCommState() failed\n"); + goto error; + } + } else { + fprintf(stderr, "GetCommState() failed\n"); + goto error; + } + + error: + // Retrieve the system error message for the last-error code + + LPVOID lpMsgBuf; + LPVOID lpDisplayBuf; + DWORD dw = GetLastError(); + + FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + dw, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR) &lpMsgBuf, + 0, NULL ); + + // Display the error message + + lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, + (lstrlen((LPCTSTR)lpMsgBuf) + lstrlen((LPCTSTR)lpszFunction) + 40) * sizeof(TCHAR)); + StringCchPrintf((LPTSTR)lpDisplayBuf, + LocalSize(lpDisplayBuf) / sizeof(TCHAR), + TEXT("%s failed with error %d: %s"), + lpszFunction, dw, lpMsgBuf); + MessageBox(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_OK); + + LocalFree(lpMsgBuf); + LocalFree(lpDisplayBuf); + } #else { struct termios t; -- 2.25.1