From 5c7673c875cd5283dde9f26a8220269942cd8e74 Mon Sep 17 00:00:00 2001 From: hedgecrw85 Date: Thu, 7 Nov 2019 17:20:04 -0600 Subject: [PATCH] Check for closed port before trying to read from port --- src/main/c/Windows/SerialPort_Windows.c | 129 +++++++++++------- src/main/c/Windows/WindowsHelperFunctions.c | 3 +- .../resources/Windows/x86/jSerialComm.dll | Bin 122880 -> 123904 bytes .../resources/Windows/x86_64/jSerialComm.dll | Bin 146432 -> 146432 bytes 4 files changed, 85 insertions(+), 47 deletions(-) diff --git a/src/main/c/Windows/SerialPort_Windows.c b/src/main/c/Windows/SerialPort_Windows.c index c5e061a..2f5fdd5 100644 --- a/src/main/c/Windows/SerialPort_Windows.c +++ b/src/main/c/Windows/SerialPort_Windows.c @@ -2,7 +2,7 @@ * SerialPort_Windows.c * * Created on: Feb 25, 2012 - * Last Updated on: Oct 29, 2019 + * Last Updated on: Nov 07, 2019 * Author: Will Hedgecock * * Copyright (C) 2012-2019 Fazecast, Inc. @@ -638,7 +638,16 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_bytesAvailable(J COMSTAT commInfo; if (!ClearCommError(serialPortHandle, NULL, &commInfo)) + { + // Problem detected, close port + int numRetries = 10; + PurgeComm(serialPortHandle, PURGE_RXABORT | PURGE_RXCLEAR | PURGE_TXABORT | PURGE_TXCLEAR); + while (env->GetBooleanField(obj, isOpenedField) && !CloseHandle(serialPortHandle) && (numRetries-- > 0)); + serialPortHandle = INVALID_HANDLE_VALUE; + env->SetLongField(obj, serialPortHandleField, -1l); + env->SetBooleanField(obj, isOpenedField, JNI_FALSE); return -1; + } DWORD numBytesAvailable = commInfo.cbInQue; return (jint)numBytesAvailable; @@ -660,9 +669,26 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_bytesAwaitingWri JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_readBytes(JNIEnv *env, jobject obj, jlong serialPortFD, jbyteArray buffer, jlong bytesToRead, jlong offset) { + // Retrieve the serial port handle HANDLE serialPortHandle = (HANDLE)serialPortFD; if (serialPortHandle == INVALID_HANDLE_VALUE) return -1; + + // Check for a disconnected serial port + COMSTAT commInfo; + if (!ClearCommError(serialPortHandle, NULL, &commInfo)) + { + // Problem detected, close port + int numRetries = 10; + PurgeComm(serialPortHandle, PURGE_RXABORT | PURGE_RXCLEAR | PURGE_TXABORT | PURGE_TXCLEAR); + while (env->GetBooleanField(obj, isOpenedField) && !CloseHandle(serialPortHandle) && (numRetries-- > 0)); + serialPortHandle = INVALID_HANDLE_VALUE; + env->SetLongField(obj, serialPortHandleField, -1l); + env->SetBooleanField(obj, isOpenedField, JNI_FALSE); + return -1; + } + + // Create an asynchronous result structure OVERLAPPED overlappedStruct = {0}; overlappedStruct.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); if (overlappedStruct.hEvent == NULL) @@ -672,32 +698,29 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_readBytes(JNIEnv } char *readBuffer = (char*)malloc(bytesToRead); DWORD numBytesRead = 0; - BOOL result; // Read from serial port - if ((result = ReadFile(serialPortHandle, readBuffer, bytesToRead, &numBytesRead, &overlappedStruct)) == FALSE) - { - if (GetLastError() != ERROR_IO_PENDING) // Problem occurred - { - // Problem reading, close port - int numRetries = 10; - PurgeComm(serialPortHandle, PURGE_RXABORT | PURGE_RXCLEAR | PURGE_TXABORT | PURGE_TXCLEAR); - while (env->GetBooleanField(obj, isOpenedField) && !CloseHandle(serialPortHandle) && (numRetries-- > 0)); - serialPortHandle = INVALID_HANDLE_VALUE; - env->SetLongField(obj, serialPortHandleField, -1l); - env->SetBooleanField(obj, isOpenedField, JNI_FALSE); - } - else if ((result = GetOverlappedResult(serialPortHandle, &overlappedStruct, &numBytesRead, TRUE)) == FALSE) - { - // Problem reading, close port - int numRetries = 10; - PurgeComm(serialPortHandle, PURGE_RXABORT | PURGE_RXCLEAR | PURGE_TXABORT | PURGE_TXCLEAR); - while (env->GetBooleanField(obj, isOpenedField) && !CloseHandle(serialPortHandle) && (numRetries-- > 0)); - serialPortHandle = INVALID_HANDLE_VALUE; - env->SetLongField(obj, serialPortHandleField, -1l); - env->SetBooleanField(obj, isOpenedField, JNI_FALSE); - } - } + BOOL result; + if (((result = ReadFile(serialPortHandle, readBuffer, bytesToRead, NULL, &overlappedStruct)) == FALSE) && (GetLastError() != ERROR_IO_PENDING)) + { + // Problem reading, close port + int numRetries = 10; + PurgeComm(serialPortHandle, PURGE_RXABORT | PURGE_RXCLEAR | PURGE_TXABORT | PURGE_TXCLEAR); + while (env->GetBooleanField(obj, isOpenedField) && !CloseHandle(serialPortHandle) && (numRetries-- > 0)); + serialPortHandle = INVALID_HANDLE_VALUE; + env->SetLongField(obj, serialPortHandleField, -1l); + env->SetBooleanField(obj, isOpenedField, JNI_FALSE); + } + else if ((result = GetOverlappedResult(serialPortHandle, &overlappedStruct, &numBytesRead, TRUE)) == FALSE) + { + // Problem reading, close port + int numRetries = 10; + PurgeComm(serialPortHandle, PURGE_RXABORT | PURGE_RXCLEAR | PURGE_TXABORT | PURGE_TXCLEAR); + while (env->GetBooleanField(obj, isOpenedField) && !CloseHandle(serialPortHandle) && (numRetries-- > 0)); + serialPortHandle = INVALID_HANDLE_VALUE; + env->SetLongField(obj, serialPortHandleField, -1l); + env->SetBooleanField(obj, isOpenedField, JNI_FALSE); + } // Return number of bytes read if successful CloseHandle(overlappedStruct.hEvent); @@ -708,9 +731,26 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_readBytes(JNIEnv JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_writeBytes(JNIEnv *env, jobject obj, jlong serialPortFD, jbyteArray buffer, jlong bytesToWrite, jlong offset) { + // Retrieve the serial port handle HANDLE serialPortHandle = (HANDLE)serialPortFD; if (serialPortHandle == INVALID_HANDLE_VALUE) return -1; + + // Check for a disconnected serial port + COMSTAT commInfo; + if (!ClearCommError(serialPortHandle, NULL, &commInfo)) + { + // Problem detected, close port + int numRetries = 10; + PurgeComm(serialPortHandle, PURGE_RXABORT | PURGE_RXCLEAR | PURGE_TXABORT | PURGE_TXCLEAR); + while (env->GetBooleanField(obj, isOpenedField) && !CloseHandle(serialPortHandle) && (numRetries-- > 0)); + serialPortHandle = INVALID_HANDLE_VALUE; + env->SetLongField(obj, serialPortHandleField, -1l); + env->SetBooleanField(obj, isOpenedField, JNI_FALSE); + return -1; + } + + // Create an asynchronous result structure OVERLAPPED overlappedStruct = {0}; overlappedStruct.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); if (overlappedStruct.hEvent == NULL) @@ -726,28 +766,25 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_writeBytes(JNIEn //EscapeCommFunction(serialPortHandle, SETDTR); // Write to serial port - if ((result = WriteFile(serialPortHandle, writeBuffer+offset, bytesToWrite, &numBytesWritten, &overlappedStruct)) == FALSE) + if (((result = WriteFile(serialPortHandle, writeBuffer+offset, bytesToWrite, NULL, &overlappedStruct)) == FALSE) && (GetLastError() != ERROR_IO_PENDING)) { - if (GetLastError() != ERROR_IO_PENDING) - { - // Problem writing, close port - int numRetries = 10; - PurgeComm(serialPortHandle, PURGE_RXABORT | PURGE_RXCLEAR | PURGE_TXABORT | PURGE_TXCLEAR); - while (env->GetBooleanField(obj, isOpenedField) && !CloseHandle(serialPortHandle) && (numRetries-- > 0)); - serialPortHandle = INVALID_HANDLE_VALUE; - env->SetLongField(obj, serialPortHandleField, -1l); - env->SetBooleanField(obj, isOpenedField, JNI_FALSE); - } - else if ((result = GetOverlappedResult(serialPortHandle, &overlappedStruct, &numBytesWritten, TRUE)) == FALSE) - { - // Problem reading, close port - int numRetries = 10; - PurgeComm(serialPortHandle, PURGE_RXABORT | PURGE_RXCLEAR | PURGE_TXABORT | PURGE_TXCLEAR); - while (env->GetBooleanField(obj, isOpenedField) && !CloseHandle(serialPortHandle) && (numRetries-- > 0)); - serialPortHandle = INVALID_HANDLE_VALUE; - env->SetLongField(obj, serialPortHandleField, -1l); - env->SetBooleanField(obj, isOpenedField, JNI_FALSE); - } + // Problem writing, close port + int numRetries = 10; + PurgeComm(serialPortHandle, PURGE_RXABORT | PURGE_RXCLEAR | PURGE_TXABORT | PURGE_TXCLEAR); + while (env->GetBooleanField(obj, isOpenedField) && !CloseHandle(serialPortHandle) && (numRetries-- > 0)); + serialPortHandle = INVALID_HANDLE_VALUE; + env->SetLongField(obj, serialPortHandleField, -1l); + env->SetBooleanField(obj, isOpenedField, JNI_FALSE); + } + else if ((result = GetOverlappedResult(serialPortHandle, &overlappedStruct, &numBytesWritten, TRUE)) == FALSE) + { + // Problem writing, close port + int numRetries = 10; + PurgeComm(serialPortHandle, PURGE_RXABORT | PURGE_RXCLEAR | PURGE_TXABORT | PURGE_TXCLEAR); + while (env->GetBooleanField(obj, isOpenedField) && !CloseHandle(serialPortHandle) && (numRetries-- > 0)); + serialPortHandle = INVALID_HANDLE_VALUE; + env->SetLongField(obj, serialPortHandleField, -1l); + env->SetBooleanField(obj, isOpenedField, JNI_FALSE); } // Clear the DTR line if using RS-422 diff --git a/src/main/c/Windows/WindowsHelperFunctions.c b/src/main/c/Windows/WindowsHelperFunctions.c index 9524cde..348e8ad 100644 --- a/src/main/c/Windows/WindowsHelperFunctions.c +++ b/src/main/c/Windows/WindowsHelperFunctions.c @@ -5,7 +5,7 @@ * Last Updated on: Mar 25, 2016 * Author: Will Hedgecock * - * Copyright (C) 2012-2018 Fazecast, Inc. + * Copyright (C) 2012-2016 Fazecast, Inc. * * This file is part of jSerialComm. * @@ -53,6 +53,7 @@ void push_back(struct charTupleVector* vector, const wchar_t* firstString, const char keyExists(struct charTupleVector* vector, const wchar_t* key) { + // Search for a vector item with a matching key size_t i; for (i = 0; i < vector->length; ++i) if (wcscmp(key, vector->first[i]) == 0) diff --git a/src/main/resources/Windows/x86/jSerialComm.dll b/src/main/resources/Windows/x86/jSerialComm.dll index 7c3af35dd819609e3b090b2fb07f12528ca0d5a4..e97cf476e6159d5e39ade0088045f780d9be7917 100644 GIT binary patch delta 9975 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 diff --git a/src/main/resources/Windows/x86_64/jSerialComm.dll b/src/main/resources/Windows/x86_64/jSerialComm.dll index d559b96d7f2790d9edf04a2f236b87c53f603adf..bbc107475d88a1b28014d994f166bbf044b092e9 100644 GIT binary patch delta 21672 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 WhjgBZ+%h$9Bw>e0mH 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