diff --git a/build.gradle b/build.gradle index 372e32a..68a363b 100644 --- a/build.gradle +++ b/build.gradle @@ -12,7 +12,7 @@ plugins { group = 'com.fazecast' archivesBaseName = 'jSerialComm' -version = '2.8.2' +version = '2.8.3' ext.moduleName = 'com.fazecast.jSerialComm' if (hasProperty('manualBuild')) diff --git a/src/main/c/Posix/SerialPort_Posix.c b/src/main/c/Posix/SerialPort_Posix.c index d9d4734..7502ce0 100644 --- a/src/main/c/Posix/SerialPort_Posix.c +++ b/src/main/c/Posix/SerialPort_Posix.c @@ -2,7 +2,7 @@ * SerialPort_Posix.c * * Created on: Feb 25, 2012 - * Last Updated on: Jan 13, 2022 + * Last Updated on: Jan 17, 2022 * Author: Will Hedgecock * * Copyright (C) 2012-2022 Fazecast, Inc. @@ -43,6 +43,7 @@ #include "PosixHelperFunctions.h" // Cached class, method, and field IDs +jclass jniErrorClass; jclass serialCommClass; jmethodID serialCommConstructor; jfieldID serialPortFdField; @@ -79,6 +80,23 @@ jfieldID eventFlagsField; // List of available serial ports serialPortVector serialPorts = { NULL, 0, 0 }; +// JNI exception handler +char jniErrorMessage[64] = { 0 }; +int lastErrorLineNumber = 0, lastErrorNumber = 0; +static inline jboolean checkJniError(JNIEnv *env, int lineNumber) +{ + // Check if a JNI exception has been thrown + if ((*env)->ExceptionCheck(env)) + { + (*env)->ExceptionDescribe(env); + (*env)->ExceptionClear(env); + snprintf(jniErrorMessage, sizeof(jniErrorMessage), "Native exception thrown at line %d", lineNumber); + (*env)->ThrowNew(env, jniErrorClass, jniErrorMessage); + return JNI_TRUE; + } + return JNI_FALSE; +} + #if defined(__linux__) && !defined(__ANDROID__) // Event listening threads @@ -86,7 +104,7 @@ void* eventReadingThread1(void *serialPortPointer) { // Make this thread immediately and asynchronously cancellable int oldValue; - serialPort *port = (serialPort*)serialPortPointer; + serialPort *port = (serialPort*)(intptr_t)serialPortPointer; pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &oldValue); pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldValue); @@ -134,7 +152,7 @@ void* eventReadingThread2(void *serialPortPointer) { // Make this thread immediately and asynchronously cancellable int oldValue; - serialPort *port = (serialPort*)serialPortPointer; + serialPort *port = (serialPort*)(intptr_t)serialPortPointer; pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &oldValue); pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldValue); struct serial_icounter_struct oldSerialLineInterrupts, newSerialLineInterrupts; @@ -216,17 +234,24 @@ JNIEXPORT jobjectArray JNICALL Java_com_fazecast_jSerialComm_SerialPort_getCommP // Create a Java-based port listing jobjectArray arrayObject = (*env)->NewObjectArray(env, serialPorts.length, serialCommClass, 0); + if (checkJniError(env, __LINE__ - 1)) return arrayObject; for (int i = 0; i < serialPorts.length; ++i) { // Create a new SerialComm object containing the enumerated values jobject serialCommObject = (*env)->NewObject(env, serialCommClass, serialCommConstructor); + if (checkJniError(env, __LINE__ - 1)) return arrayObject; (*env)->SetObjectField(env, serialCommObject, portDescriptionField, (*env)->NewStringUTF(env, serialPorts.ports[i]->portDescription)); + if (checkJniError(env, __LINE__ - 1)) return arrayObject; (*env)->SetObjectField(env, serialCommObject, friendlyNameField, (*env)->NewStringUTF(env, serialPorts.ports[i]->friendlyName)); + if (checkJniError(env, __LINE__ - 1)) return arrayObject; (*env)->SetObjectField(env, serialCommObject, comPortField, (*env)->NewStringUTF(env, serialPorts.ports[i]->portPath)); + if (checkJniError(env, __LINE__ - 1)) return arrayObject; (*env)->SetObjectField(env, serialCommObject, portLocationField, (*env)->NewStringUTF(env, serialPorts.ports[i]->portLocation)); + if (checkJniError(env, __LINE__ - 1)) return arrayObject; // Add new SerialComm object to array (*env)->SetObjectArrayElement(env, arrayObject, i, serialCommObject); + if (checkJniError(env, __LINE__ - 1)) return arrayObject; } return arrayObject; } @@ -234,40 +259,73 @@ JNIEXPORT jobjectArray JNICALL Java_com_fazecast_jSerialComm_SerialPort_getCommP JNIEXPORT void JNICALL Java_com_fazecast_jSerialComm_SerialPort_initializeLibrary(JNIEnv *env, jclass serialComm) { // Cache class and method ID as global references + jniErrorClass = (*env)->FindClass(env, "java/lang/Exception"); serialCommClass = (jclass)(*env)->NewGlobalRef(env, serialComm); + if (checkJniError(env, __LINE__ - 1)) return; serialCommConstructor = (*env)->GetMethodID(env, serialCommClass, "", "()V"); + if (checkJniError(env, __LINE__ - 1)) return; // Cache Java fields as global references serialPortFdField = (*env)->GetFieldID(env, serialCommClass, "portHandle", "J"); + if (checkJniError(env, __LINE__ - 1)) return; comPortField = (*env)->GetFieldID(env, serialCommClass, "comPort", "Ljava/lang/String;"); + if (checkJniError(env, __LINE__ - 1)) return; friendlyNameField = (*env)->GetFieldID(env, serialCommClass, "friendlyName", "Ljava/lang/String;"); + if (checkJniError(env, __LINE__ - 1)) return; portDescriptionField = (*env)->GetFieldID(env, serialCommClass, "portDescription", "Ljava/lang/String;"); + if (checkJniError(env, __LINE__ - 1)) return; portLocationField = (*env)->GetFieldID(env, serialCommClass, "portLocation", "Ljava/lang/String;"); + if (checkJniError(env, __LINE__ - 1)) return; eventListenerRunningField = (*env)->GetFieldID(env, serialCommClass, "eventListenerRunning", "Z"); + if (checkJniError(env, __LINE__ - 1)) return; disableConfigField = (*env)->GetFieldID(env, serialCommClass, "disableConfig", "Z"); + if (checkJniError(env, __LINE__ - 1)) return; isDtrEnabledField = (*env)->GetFieldID(env, serialCommClass, "isDtrEnabled", "Z"); + if (checkJniError(env, __LINE__ - 1)) return; isRtsEnabledField = (*env)->GetFieldID(env, serialCommClass, "isRtsEnabled", "Z"); + if (checkJniError(env, __LINE__ - 1)) return; autoFlushIOBuffersField = (*env)->GetFieldID(env, serialCommClass, "autoFlushIOBuffers", "Z"); + if (checkJniError(env, __LINE__ - 1)) return; baudRateField = (*env)->GetFieldID(env, serialCommClass, "baudRate", "I"); + if (checkJniError(env, __LINE__ - 1)) return; dataBitsField = (*env)->GetFieldID(env, serialCommClass, "dataBits", "I"); + if (checkJniError(env, __LINE__ - 1)) return; stopBitsField = (*env)->GetFieldID(env, serialCommClass, "stopBits", "I"); + if (checkJniError(env, __LINE__ - 1)) return; parityField = (*env)->GetFieldID(env, serialCommClass, "parity", "I"); + if (checkJniError(env, __LINE__ - 1)) return; flowControlField = (*env)->GetFieldID(env, serialCommClass, "flowControl", "I"); + if (checkJniError(env, __LINE__ - 1)) return; sendDeviceQueueSizeField = (*env)->GetFieldID(env, serialCommClass, "sendDeviceQueueSize", "I"); + if (checkJniError(env, __LINE__ - 1)) return; receiveDeviceQueueSizeField = (*env)->GetFieldID(env, serialCommClass, "receiveDeviceQueueSize", "I"); + if (checkJniError(env, __LINE__ - 1)) return; disableExclusiveLockField = (*env)->GetFieldID(env, serialCommClass, "disableExclusiveLock", "Z"); + if (checkJniError(env, __LINE__ - 1)) return; rs485ModeField = (*env)->GetFieldID(env, serialCommClass, "rs485Mode", "Z"); + if (checkJniError(env, __LINE__ - 1)) return; rs485ActiveHighField = (*env)->GetFieldID(env, serialCommClass, "rs485ActiveHigh", "Z"); + if (checkJniError(env, __LINE__ - 1)) return; rs485EnableTerminationField = (*env)->GetFieldID(env, serialCommClass, "rs485EnableTermination", "Z"); + if (checkJniError(env, __LINE__ - 1)) return; rs485RxDuringTxField = (*env)->GetFieldID(env, serialCommClass, "rs485RxDuringTx", "Z"); + if (checkJniError(env, __LINE__ - 1)) return; rs485DelayBeforeField = (*env)->GetFieldID(env, serialCommClass, "rs485DelayBefore", "I"); + if (checkJniError(env, __LINE__ - 1)) return; rs485DelayAfterField = (*env)->GetFieldID(env, serialCommClass, "rs485DelayAfter", "I"); + if (checkJniError(env, __LINE__ - 1)) return; xonStartCharField = (*env)->GetFieldID(env, serialCommClass, "xonStartChar", "B"); + if (checkJniError(env, __LINE__ - 1)) return; xoffStopCharField = (*env)->GetFieldID(env, serialCommClass, "xoffStopChar", "B"); + if (checkJniError(env, __LINE__ - 1)) return; timeoutModeField = (*env)->GetFieldID(env, serialCommClass, "timeoutMode", "I"); + if (checkJniError(env, __LINE__ - 1)) return; readTimeoutField = (*env)->GetFieldID(env, serialCommClass, "readTimeout", "I"); + if (checkJniError(env, __LINE__ - 1)) return; writeTimeoutField = (*env)->GetFieldID(env, serialCommClass, "writeTimeout", "I"); + if (checkJniError(env, __LINE__ - 1)) return; eventFlagsField = (*env)->GetFieldID(env, serialCommClass, "eventFlags", "I"); + if (checkJniError(env, __LINE__ - 1)) return; // Disable handling of various POSIX signals sigset_t blockMask; @@ -294,16 +352,22 @@ JNIEXPORT void JNICALL Java_com_fazecast_jSerialComm_SerialPort_uninitializeLibr // Delete the cached global reference (*env)->DeleteGlobalRef(env, serialCommClass); + checkJniError(env, __LINE__ - 1); } JNIEXPORT jlong JNICALL Java_com_fazecast_jSerialComm_SerialPort_openPortNative(JNIEnv *env, jobject obj) { // Retrieve the serial port parameter fields jstring portNameJString = (jstring)(*env)->GetObjectField(env, obj, comPortField); + if (checkJniError(env, __LINE__ - 1)) return 0; const char *portName = (*env)->GetStringUTFChars(env, portNameJString, NULL); + if (checkJniError(env, __LINE__ - 1)) return 0; unsigned char disableExclusiveLock = (*env)->GetBooleanField(env, obj, disableExclusiveLockField); + if (checkJniError(env, __LINE__ - 1)) return 0; unsigned char disableAutoConfig = (*env)->GetBooleanField(env, obj, disableConfigField); + if (checkJniError(env, __LINE__ - 1)) return 0; unsigned char autoFlushIOBuffers = (*env)->GetBooleanField(env, obj, autoFlushIOBuffersField); + if (checkJniError(env, __LINE__ - 1)) return 0; // Ensure that the serial port still exists and is not already open serialPort *port = fetchPort(&serialPorts, portName); @@ -315,20 +379,21 @@ JNIEXPORT jlong JNICALL Java_com_fazecast_jSerialComm_SerialPort_openPortNative( if (!port || (port->handle > 0)) { (*env)->ReleaseStringUTFChars(env, portNameJString, portName); - port->errorLineNumber = __LINE__ - 3; - port->errorNumber = (!port ? 1 : 2); + checkJniError(env, __LINE__ - 1); + lastErrorLineNumber = __LINE__ - 3; + lastErrorNumber = (!port ? 1 : 2); return 0; } // Try to open the serial port with read/write access - port->errorLineNumber = __LINE__ + 1; + port->errorLineNumber = lastErrorLineNumber = __LINE__ + 1; if ((port->handle = open(portName, O_RDWR | O_NOCTTY | O_NONBLOCK | O_CLOEXEC)) > 0) { // Ensure that multiple root users cannot access the device simultaneously if (!disableExclusiveLock && flock(port->handle, LOCK_EX | LOCK_NB)) { - port->errorLineNumber = __LINE__ - 2; - port->errorNumber = errno; + port->errorLineNumber = lastErrorLineNumber = __LINE__ - 2; + port->errorNumber = lastErrorNumber = errno; while (close(port->handle) && (errno == EINTR)) errno = 0; port->handle = -1; @@ -350,11 +415,12 @@ JNIEXPORT jlong JNICALL Java_com_fazecast_jSerialComm_SerialPort_openPortNative( } } else - port->errorNumber = errno; + port->errorNumber = lastErrorNumber = errno; // Return a pointer to the serial port data structure (*env)->ReleaseStringUTFChars(env, portNameJString, portName); - return (port->handle > 0) ? (jlong)(intptr_t)port : -(jlong)(intptr_t)port; + checkJniError(env, __LINE__ - 1); + return (port->handle > 0) ? (jlong)(intptr_t)port : 0; } JNIEXPORT jboolean JNICALL Java_com_fazecast_jSerialComm_SerialPort_configPort(JNIEnv *env, jobject obj, jlong serialPortPointer) @@ -362,26 +428,47 @@ JNIEXPORT jboolean JNICALL Java_com_fazecast_jSerialComm_SerialPort_configPort(J // Retrieve port parameters from the Java class serialPort *port = (serialPort*)(intptr_t)serialPortPointer; baud_rate baudRate = (*env)->GetIntField(env, obj, baudRateField); + if (checkJniError(env, __LINE__ - 1)) return JNI_FALSE; int byteSizeInt = (*env)->GetIntField(env, obj, dataBitsField); + if (checkJniError(env, __LINE__ - 1)) return JNI_FALSE; int stopBitsInt = (*env)->GetIntField(env, obj, stopBitsField); + if (checkJniError(env, __LINE__ - 1)) return JNI_FALSE; int parityInt = (*env)->GetIntField(env, obj, parityField); + if (checkJniError(env, __LINE__ - 1)) return JNI_FALSE; int flowControl = (*env)->GetIntField(env, obj, flowControlField); + if (checkJniError(env, __LINE__ - 1)) return JNI_FALSE; int sendDeviceQueueSize = (*env)->GetIntField(env, obj, sendDeviceQueueSizeField); + if (checkJniError(env, __LINE__ - 1)) return JNI_FALSE; int receiveDeviceQueueSize = (*env)->GetIntField(env, obj, receiveDeviceQueueSizeField); + if (checkJniError(env, __LINE__ - 1)) return JNI_FALSE; int rs485DelayBefore = (*env)->GetIntField(env, obj, rs485DelayBeforeField); + if (checkJniError(env, __LINE__ - 1)) return JNI_FALSE; int rs485DelayAfter = (*env)->GetIntField(env, obj, rs485DelayAfterField); + if (checkJniError(env, __LINE__ - 1)) return JNI_FALSE; int timeoutMode = (*env)->GetIntField(env, obj, timeoutModeField); + if (checkJniError(env, __LINE__ - 1)) return JNI_FALSE; int readTimeout = (*env)->GetIntField(env, obj, readTimeoutField); + if (checkJniError(env, __LINE__ - 1)) return JNI_FALSE; int writeTimeout = (*env)->GetIntField(env, obj, writeTimeoutField); + if (checkJniError(env, __LINE__ - 1)) return JNI_FALSE; int eventsToMonitor = (*env)->GetIntField(env, obj, eventFlagsField); + if (checkJniError(env, __LINE__ - 1)) return JNI_FALSE; unsigned char rs485ModeEnabled = (*env)->GetBooleanField(env, obj, rs485ModeField); + if (checkJniError(env, __LINE__ - 1)) return JNI_FALSE; unsigned char rs485ActiveHigh = (*env)->GetBooleanField(env, obj, rs485ActiveHighField); + if (checkJniError(env, __LINE__ - 1)) return JNI_FALSE; unsigned char rs485EnableTermination = (*env)->GetBooleanField(env, obj, rs485EnableTerminationField); + if (checkJniError(env, __LINE__ - 1)) return JNI_FALSE; unsigned char rs485RxDuringTx = (*env)->GetBooleanField(env, obj, rs485RxDuringTxField); + if (checkJniError(env, __LINE__ - 1)) return JNI_FALSE; unsigned char isDtrEnabled = (*env)->GetBooleanField(env, obj, isDtrEnabledField); + if (checkJniError(env, __LINE__ - 1)) return JNI_FALSE; unsigned char isRtsEnabled = (*env)->GetBooleanField(env, obj, isRtsEnabledField); + if (checkJniError(env, __LINE__ - 1)) return JNI_FALSE; char xonStartChar = (*env)->GetByteField(env, obj, xonStartCharField); + if (checkJniError(env, __LINE__ - 1)) return JNI_FALSE; char xoffStopChar = (*env)->GetByteField(env, obj, xoffStopCharField); + if (checkJniError(env, __LINE__ - 1)) return JNI_FALSE; // Clear any serial port flags and set up raw non-canonical port parameters struct termios options = { 0 }; @@ -422,8 +509,8 @@ JNIEXPORT jboolean JNICALL Java_com_fazecast_jSerialComm_SerialPort_configPort(J cfsetospeed(&options, baudRateCode); if (tcsetattr(port->handle, TCSANOW, &options) || tcsetattr(port->handle, TCSANOW, &options)) { - port->errorLineNumber = __LINE__ - 2; - port->errorNumber = errno; + port->errorLineNumber = lastErrorLineNumber = __LINE__ - 2; + port->errorNumber = lastErrorNumber = errno; return JNI_FALSE; } @@ -444,7 +531,9 @@ JNIEXPORT jboolean JNICALL Java_com_fazecast_jSerialComm_SerialPort_configPort(J sendDeviceQueueSize = serInfo.xmit_fifo_size; receiveDeviceQueueSize = sendDeviceQueueSize; (*env)->SetIntField(env, obj, sendDeviceQueueSizeField, sendDeviceQueueSize); + if (checkJniError(env, __LINE__ - 1)) return JNI_FALSE; (*env)->SetIntField(env, obj, receiveDeviceQueueSizeField, receiveDeviceQueueSize); + if (checkJniError(env, __LINE__ - 1)) return JNI_FALSE; // Attempt to set the requested RS-485 mode struct serial_rs485 rs485Conf = { 0 }; @@ -474,18 +563,15 @@ JNIEXPORT jboolean JNICALL Java_com_fazecast_jSerialComm_SerialPort_configPort(J rs485Conf.flags &= ~(SER_RS485_TERMINATE_BUS); rs485Conf.delay_rts_before_send = rs485DelayBefore / 1000; rs485Conf.delay_rts_after_send = rs485DelayAfter / 1000; - if (ioctl(port->handle, TIOCSRS485, &rs485Conf) && rs485ModeEnabled) - { - port->errorLineNumber = __LINE__ - 2; - port->errorNumber = errno; - return JNI_FALSE; - } + ioctl(port->handle, TIOCSRS485, &rs485Conf); } #else (*env)->SetIntField(env, obj, sendDeviceQueueSizeField, sysconf(_SC_PAGESIZE)); + if (checkJniError(env, __LINE__ - 1)) return JNI_FALSE; (*env)->SetIntField(env, obj, receiveDeviceQueueSizeField, sysconf(_SC_PAGESIZE)); + if (checkJniError(env, __LINE__ - 1)) return JNI_FALSE; #endif @@ -500,6 +586,7 @@ JNIEXPORT jboolean JNICALL Java_com_fazecast_jSerialComm_SerialPort_configTimeou struct termios options = { 0 }; serialPort *port = (serialPort*)(intptr_t)serialPortPointer; baud_rate baudRate = (*env)->GetIntField(env, obj, baudRateField); + if (checkJniError(env, __LINE__ - 1)) return JNI_FALSE; tcgetattr(port->handle, &options); // Set up the requested event flags @@ -547,20 +634,20 @@ JNIEXPORT jboolean JNICALL Java_com_fazecast_jSerialComm_SerialPort_configTimeou // Apply changes if (fcntl(port->handle, F_SETFL, flags)) { - port->errorLineNumber = __LINE__ - 2; - port->errorNumber = errno; + port->errorLineNumber = lastErrorLineNumber = __LINE__ - 2; + port->errorNumber = lastErrorNumber = errno; return JNI_FALSE; } if (tcsetattr(port->handle, TCSANOW, &options) || tcsetattr(port->handle, TCSANOW, &options)) { - port->errorLineNumber = __LINE__ - 2; - port->errorNumber = errno; + port->errorLineNumber = lastErrorLineNumber = __LINE__ - 2; + port->errorNumber = lastErrorNumber = errno; return JNI_FALSE; } if (!getBaudRateCode(baudRate) && setBaudRateCustom(port->handle, baudRate)) { - port->errorLineNumber = __LINE__ - 2; - port->errorNumber = errno; + port->errorLineNumber = lastErrorLineNumber = __LINE__ - 2; + port->errorNumber = lastErrorNumber = errno; return JNI_FALSE; } return JNI_TRUE; @@ -681,7 +768,7 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_bytesAvailable(J serialPort *port = (serialPort*)(intptr_t)serialPortPointer; int numBytesAvailable = -1; port->errorLineNumber = __LINE__ + 1; - ioctl(((serialPort*)(intptr_t)serialPortPointer)->handle, FIONREAD, &numBytesAvailable); + ioctl(port->handle, FIONREAD, &numBytesAvailable); port->errorNumber = errno; return numBytesAvailable; } @@ -692,7 +779,7 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_bytesAwaitingWri serialPort *port = (serialPort*)(intptr_t)serialPortPointer; int numBytesToWrite = -1; port->errorLineNumber = __LINE__ + 1; - ioctl(((serialPort*)(intptr_t)serialPortPointer)->handle, TIOCOUTQ, &numBytesToWrite); + ioctl(port->handle, TIOCOUTQ, &numBytesToWrite); port->errorNumber = errno; return numBytesToWrite; } @@ -771,6 +858,7 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_readBytes(JNIEnv // Return number of bytes read if successful (*env)->SetByteArrayRegion(env, buffer, offset, numBytesReadTotal, (jbyte*)port->readBuffer); + checkJniError(env, __LINE__ - 1); return (numBytesRead == -1) ? -1 : numBytesReadTotal; } @@ -779,6 +867,7 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_writeBytes(JNIEn // Retrieve port parameters from the Java class serialPort *port = (serialPort*)(intptr_t)serialPortPointer; jbyte *writeBuffer = (*env)->GetByteArrayElements(env, buffer, 0); + if (checkJniError(env, __LINE__ - 1)) return -1; // Write to the port int numBytesWritten; @@ -795,6 +884,7 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_writeBytes(JNIEn // Return the number of bytes written if successful (*env)->ReleaseByteArrayElements(env, buffer, writeBuffer, JNI_ABORT); + checkJniError(env, __LINE__ - 1); return numBytesWritten; } @@ -888,7 +978,9 @@ JNIEXPORT jboolean JNICALL Java_com_fazecast_jSerialComm_SerialPort_clearRTS(JNI JNIEXPORT jboolean JNICALL Java_com_fazecast_jSerialComm_SerialPort_presetRTS(JNIEnv *env, jobject obj) { jstring portNameJString = (jstring)(*env)->GetObjectField(env, obj, comPortField); + if (checkJniError(env, __LINE__ - 1)) return JNI_FALSE; const char *portName = (*env)->GetStringUTFChars(env, portNameJString, NULL); + if (checkJniError(env, __LINE__ - 1)) return JNI_FALSE; // Send a system command to preset the RTS mode of the serial port char commandString[128]; @@ -900,13 +992,16 @@ JNIEXPORT jboolean JNICALL Java_com_fazecast_jSerialComm_SerialPort_presetRTS(JN int result = system(commandString); (*env)->ReleaseStringUTFChars(env, portNameJString, portName); + checkJniError(env, __LINE__ - 1); return (result == 0); } JNIEXPORT jboolean JNICALL Java_com_fazecast_jSerialComm_SerialPort_preclearRTS(JNIEnv *env, jobject obj) { jstring portNameJString = (jstring)(*env)->GetObjectField(env, obj, comPortField); + if (checkJniError(env, __LINE__ - 1)) return JNI_FALSE; const char *portName = (*env)->GetStringUTFChars(env, portNameJString, NULL); + if (checkJniError(env, __LINE__ - 1)) return JNI_FALSE; // Send a system command to preset the RTS mode of the serial port char commandString[128]; @@ -918,6 +1013,7 @@ JNIEXPORT jboolean JNICALL Java_com_fazecast_jSerialComm_SerialPort_preclearRTS( int result = system(commandString); (*env)->ReleaseStringUTFChars(env, portNameJString, portName); + checkJniError(env, __LINE__ - 1); return (result == 0); } @@ -950,7 +1046,9 @@ JNIEXPORT jboolean JNICALL Java_com_fazecast_jSerialComm_SerialPort_clearDTR(JNI JNIEXPORT jboolean JNICALL Java_com_fazecast_jSerialComm_SerialPort_presetDTR(JNIEnv *env, jobject obj) { jstring portNameJString = (jstring)(*env)->GetObjectField(env, obj, comPortField); + if (checkJniError(env, __LINE__ - 1)) return JNI_FALSE; const char *portName = (*env)->GetStringUTFChars(env, portNameJString, NULL); + if (checkJniError(env, __LINE__ - 1)) return JNI_FALSE; // Send a system command to preset the DTR mode of the serial port char commandString[128]; @@ -962,13 +1060,16 @@ JNIEXPORT jboolean JNICALL Java_com_fazecast_jSerialComm_SerialPort_presetDTR(JN int result = system(commandString); (*env)->ReleaseStringUTFChars(env, portNameJString, portName); + checkJniError(env, __LINE__ - 1); return (result == 0); } JNIEXPORT jboolean JNICALL Java_com_fazecast_jSerialComm_SerialPort_preclearDTR(JNIEnv *env, jobject obj) { jstring portNameJString = (jstring)(*env)->GetObjectField(env, obj, comPortField); + if (checkJniError(env, __LINE__ - 1)) return JNI_FALSE; const char *portName = (*env)->GetStringUTFChars(env, portNameJString, NULL); + if (checkJniError(env, __LINE__ - 1)) return JNI_FALSE; // Send a system command to preclear the DTR mode of the serial port char commandString[128]; @@ -980,6 +1081,7 @@ JNIEXPORT jboolean JNICALL Java_com_fazecast_jSerialComm_SerialPort_preclearDTR( int result = system(commandString); (*env)->ReleaseStringUTFChars(env, portNameJString, portName); + checkJniError(env, __LINE__ - 1); return (result == 0); } @@ -1021,10 +1123,10 @@ JNIEXPORT jboolean JNICALL Java_com_fazecast_jSerialComm_SerialPort_getRI(JNIEnv JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_getLastErrorLocation(JNIEnv *env, jobject obj, jlong serialPortPointer) { - return ((serialPort*)(intptr_t)serialPortPointer)->errorLineNumber; + return serialPortPointer ? ((serialPort*)(intptr_t)serialPortPointer)->errorLineNumber : lastErrorLineNumber; } JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_getLastErrorCode(JNIEnv *env, jobject obj, jlong serialPortPointer) { - return ((serialPort*)(intptr_t)serialPortPointer)->errorNumber; + return serialPortPointer ? ((serialPort*)(intptr_t)serialPortPointer)->errorNumber : lastErrorNumber; } diff --git a/src/main/java/com/fazecast/jSerialComm/SerialPort.java b/src/main/java/com/fazecast/jSerialComm/SerialPort.java index a350e8b..8b49a47 100644 --- a/src/main/java/com/fazecast/jSerialComm/SerialPort.java +++ b/src/main/java/com/fazecast/jSerialComm/SerialPort.java @@ -2,7 +2,7 @@ * SerialPort.java * * Created on: Feb 25, 2012 - * Last Updated on: Jan 11, 2022 + * Last Updated on: Jan 17, 2022 * Author: Will Hedgecock * * Copyright (C) 2012-2022 Fazecast, Inc. @@ -43,14 +43,14 @@ import java.util.Date; * This class provides native access to serial ports and devices without requiring external libraries or tools. * * @author Will Hedgecock <will.hedgecock@fazecast.com> - * @version 2.8.2 + * @version 2.8.3 * @see java.io.InputStream * @see java.io.OutputStream */ public final class SerialPort { // Static initializer loads correct native library for this machine - static private final String versionString = "2.8.2"; + static private final String versionString = "2.8.3"; static private final String tmpdirAppIdProperty = "fazecast.jSerialComm.appid"; static private volatile boolean isAndroid = false; static private volatile boolean isWindows = false; @@ -560,7 +560,7 @@ public final class SerialPort safetySleepTimeMS = safetySleepTime; sendDeviceQueueSize = (deviceSendQueueSize > 0) ? deviceSendQueueSize : sendDeviceQueueSize; receiveDeviceQueueSize = (deviceReceiveQueueSize > 0) ? deviceReceiveQueueSize : receiveDeviceQueueSize; - if (portHandle > 0) + if (portHandle != 0) return configPort(portHandle); // Force a sleep to ensure that the port does not become unusable due to rapid closing/opening on the part of the user @@ -600,12 +600,12 @@ public final class SerialPort } // Open the serial port and start an event-based listener if registered - if ((portHandle = openPortNative()) > 0) + if ((portHandle = openPortNative()) != 0) { if (serialEventListener != null) serialEventListener.startListening(); } - return (portHandle > 0); + return (portHandle != 0); } } @@ -648,9 +648,9 @@ public final class SerialPort { if (serialEventListener != null) serialEventListener.stopListening(); - if (portHandle > 0) + if (portHandle != 0) portHandle = closePortNative(portHandle); - return (portHandle <= 0); + return (portHandle == 0); } } @@ -659,7 +659,7 @@ public final class SerialPort * * @return Whether the port is opened. */ - public final synchronized boolean isOpen() { return (portHandle > 0); } + public final synchronized boolean isOpen() { return (portHandle != 0); } /** * Disables the library from calling any of the underlying device driver configuration methods. @@ -687,7 +687,7 @@ public final class SerialPort * * @return Source line of latest native code error. */ - public final synchronized int getLastErrorLocation() { return (portHandle != 0) ? getLastErrorLocation((portHandle > 0) ? portHandle : -portHandle) : -1; } + public final synchronized int getLastErrorLocation() { return getLastErrorLocation(portHandle); } /** * Returns the error number returned by the most recent native source code line that failed execution. @@ -697,7 +697,7 @@ public final class SerialPort * * @return Error number of the latest native code error. */ - public final synchronized int getLastErrorCode() { return (portHandle != 0) ? getLastErrorCode((portHandle > 0) ? portHandle : -portHandle) : 0; } + public final synchronized int getLastErrorCode() { return getLastErrorCode(portHandle); } // Serial Port Setup Methods private static native void initializeLibrary(); // Initializes the JNI code @@ -738,7 +738,7 @@ public final class SerialPort * * @return The number of bytes currently available to be read, or -1 if the port is not open. */ - public final int bytesAvailable() { return (portHandle > 0) ? bytesAvailable(portHandle) : -1; } + public final int bytesAvailable() { return (portHandle != 0) ? bytesAvailable(portHandle) : -1; } /** * Returns the number of bytes still waiting to be written in the device's output queue. @@ -747,7 +747,7 @@ public final class SerialPort * * @return The number of bytes currently waiting to be written, or -1 if the port is not open. */ - public final int bytesAwaitingWrite() { return (portHandle > 0) ? bytesAwaitingWrite(portHandle) : -1; } + public final int bytesAwaitingWrite() { return (portHandle != 0) ? bytesAwaitingWrite(portHandle) : -1; } /** * Reads up to bytesToRead raw data bytes from the serial port and stores them in the buffer. @@ -762,7 +762,7 @@ public final class SerialPort * @param bytesToRead The number of bytes to read from the serial port. * @return The number of bytes successfully read, or -1 if there was an error reading from the port. */ - public final int readBytes(byte[] buffer, long bytesToRead) { return (portHandle > 0) ? readBytes(portHandle, buffer, bytesToRead, 0, timeoutMode, readTimeout) : -1; } + public final int readBytes(byte[] buffer, long bytesToRead) { return (portHandle != 0) ? readBytes(portHandle, buffer, bytesToRead, 0, timeoutMode, readTimeout) : -1; } /** * Reads up to bytesToRead raw data bytes from the serial port and stores them in the buffer starting at the indicated offset. @@ -778,7 +778,7 @@ public final class SerialPort * @param offset The read buffer index into which to begin storing data. * @return The number of bytes successfully read, or -1 if there was an error reading from the port. */ - public final int readBytes(byte[] buffer, long bytesToRead, long offset) { return (portHandle > 0) ? readBytes(portHandle, buffer, bytesToRead, offset, timeoutMode, readTimeout) : -1; } + public final int readBytes(byte[] buffer, long bytesToRead, long offset) { return (portHandle != 0) ? readBytes(portHandle, buffer, bytesToRead, offset, timeoutMode, readTimeout) : -1; } /** * Writes up to bytesToWrite raw data bytes from the buffer parameter to the serial port. @@ -797,7 +797,7 @@ public final class SerialPort { // Write to the serial port until all bytes have been consumed int totalNumWritten = 0; - while ((portHandle > 0) && (totalNumWritten != bytesToWrite)) + while ((portHandle != 0) && (totalNumWritten != bytesToWrite)) { int numWritten = writeBytes(portHandle, buffer, bytesToWrite - totalNumWritten, totalNumWritten, timeoutMode); if (numWritten > 0) @@ -805,7 +805,7 @@ public final class SerialPort else break; } - return ((portHandle > 0) && (totalNumWritten >= 0)) ? totalNumWritten : -1; + return ((portHandle != 0) && (totalNumWritten >= 0)) ? totalNumWritten : -1; } /** @@ -826,7 +826,7 @@ public final class SerialPort { // Write to the serial port until all bytes have been consumed int totalNumWritten = 0; - while ((portHandle > 0) && (totalNumWritten != bytesToWrite)) + while ((portHandle != 0) && (totalNumWritten != bytesToWrite)) { int numWritten = writeBytes(portHandle, buffer, bytesToWrite - totalNumWritten, offset + totalNumWritten, timeoutMode); if (numWritten > 0) @@ -834,7 +834,7 @@ public final class SerialPort else break; } - return ((portHandle > 0) && (totalNumWritten >= 0)) ? totalNumWritten : -1; + return ((portHandle != 0) && (totalNumWritten >= 0)) ? totalNumWritten : -1; } /** @@ -857,13 +857,13 @@ public final class SerialPort * Sets the BREAK signal on the serial control line. * @return true if successful, false if not. */ - public final boolean setBreak() { return (portHandle > 0) && setBreak(portHandle); } + public final boolean setBreak() { return (portHandle != 0) && setBreak(portHandle); } /** * Clears the BREAK signal from the serial control line. * @return true if successful, false if not. */ - public final boolean clearBreak() { return (portHandle > 0) && clearBreak(portHandle); } + public final boolean clearBreak() { return (portHandle != 0) && clearBreak(portHandle); } /** * Sets the state of the RTS line to 1. @@ -872,7 +872,7 @@ public final class SerialPort public final boolean setRTS() { isRtsEnabled = true; - return (portHandle > 0) ? setRTS(portHandle) : presetRTS(); + return (portHandle != 0) ? setRTS(portHandle) : presetRTS(); } /** @@ -882,7 +882,7 @@ public final class SerialPort public final boolean clearRTS() { isRtsEnabled = false; - return (portHandle > 0) ? clearRTS(portHandle) : preclearRTS(); + return (portHandle != 0) ? clearRTS(portHandle) : preclearRTS(); } /** @@ -892,7 +892,7 @@ public final class SerialPort public final boolean setDTR() { isDtrEnabled = true; - return (portHandle > 0) ? setDTR(portHandle) : presetDTR(); + return (portHandle != 0) ? setDTR(portHandle) : presetDTR(); } /** @@ -902,26 +902,26 @@ public final class SerialPort public final boolean clearDTR() { isDtrEnabled = false; - return (portHandle > 0) ? clearDTR(portHandle) : preclearDTR(); + return (portHandle != 0) ? clearDTR(portHandle) : preclearDTR(); } /** * Returns whether the CTS line is currently asserted. * @return Whether or not the CTS line is asserted. */ - public final boolean getCTS() { return (portHandle > 0) && getCTS(portHandle); } + public final boolean getCTS() { return (portHandle != 0) && getCTS(portHandle); } /** * Returns whether the DSR line is currently asserted. * @return Whether or not the DSR line is asserted. */ - public final boolean getDSR() { return (portHandle > 0) && getDSR(portHandle); } + public final boolean getDSR() { return (portHandle != 0) && getDSR(portHandle); } /** * Returns whether the DCD line is currently asserted. * @return Whether or not the DCD line is asserted. */ - public final boolean getDCD() { return (portHandle > 0) && getDCD(portHandle); } + public final boolean getDCD() { return (portHandle != 0) && getDCD(portHandle); } /** * Returns whether the DTR line is currently asserted. @@ -929,7 +929,7 @@ public final class SerialPort * Note that polling this line's status is not supported on Windows, so results may be incorrect. * @return Whether or not the DTR line is asserted. */ - public final boolean getDTR() { return (portHandle > 0) && getDTR(portHandle); } + public final boolean getDTR() { return (portHandle != 0) && getDTR(portHandle); } /** * Returns whether the RTS line is currently asserted. @@ -937,13 +937,13 @@ public final class SerialPort * Note that polling this line's status is not supported on Windows, so results may be incorrect. * @return Whether or not the RTS line is asserted. */ - public final boolean getRTS() { return (portHandle > 0) && getRTS(portHandle); } + public final boolean getRTS() { return (portHandle != 0) && getRTS(portHandle); } /** * Returns whether the RI line is currently asserted. * @return Whether or not the RI line is asserted. */ - public final boolean getRI() { return (portHandle > 0) && getRI(portHandle); } + public final boolean getRI() { return (portHandle != 0) && getRI(portHandle); } // Default Constructor private SerialPort() {} @@ -982,7 +982,7 @@ public final class SerialPort ((userDataListener instanceof SerialPortMessageListener) ? new SerialPortEventListener(((SerialPortMessageListener)userDataListener).getMessageDelimiter(), ((SerialPortMessageListener)userDataListener).delimiterIndicatesEndOfMessage()) : new SerialPortEventListener())); - if (portHandle > 0) + if (portHandle != 0) { configTimeouts(portHandle, timeoutMode, readTimeout, writeTimeout, eventFlags); serialEventListener.startListening(); @@ -1095,7 +1095,7 @@ public final class SerialPort { autoFlushIOBuffers = true; - if (portHandle > 0) + if (portHandle != 0) return flushRxTxBuffers(portHandle); return true; } @@ -1174,7 +1174,7 @@ public final class SerialPort parity = newParity; rs485Mode = useRS485Mode; - if (portHandle > 0) + if (portHandle != 0) { if (safetySleepTimeMS > 0) try { Thread.sleep(safetySleepTimeMS); } catch (Exception e) { Thread.currentThread().interrupt(); } @@ -1245,7 +1245,7 @@ public final class SerialPort else readTimeout = Math.round((float)newReadTimeout / 100.0f) * 100; - if (portHandle > 0) + if (portHandle != 0) { if (safetySleepTimeMS > 0) try { Thread.sleep(safetySleepTimeMS); } catch (Exception e) { Thread.currentThread().interrupt(); } @@ -1266,7 +1266,7 @@ public final class SerialPort { baudRate = newBaudRate; - if (portHandle > 0) + if (portHandle != 0) { if (safetySleepTimeMS > 0) try { Thread.sleep(safetySleepTimeMS); } catch (Exception e) { Thread.currentThread().interrupt(); } @@ -1287,7 +1287,7 @@ public final class SerialPort { dataBits = newDataBits; - if (portHandle > 0) + if (portHandle != 0) { if (safetySleepTimeMS > 0) try { Thread.sleep(safetySleepTimeMS); } catch (Exception e) { Thread.currentThread().interrupt(); } @@ -1314,7 +1314,7 @@ public final class SerialPort { stopBits = newStopBits; - if (portHandle > 0) + if (portHandle != 0) { if (safetySleepTimeMS > 0) try { Thread.sleep(safetySleepTimeMS); } catch (Exception e) { Thread.currentThread().interrupt(); } @@ -1362,7 +1362,7 @@ public final class SerialPort { flowControl = newFlowControlSettings; - if (portHandle > 0) + if (portHandle != 0) { if (safetySleepTimeMS > 0) try { Thread.sleep(safetySleepTimeMS); } catch (Exception e) { Thread.currentThread().interrupt(); } @@ -1389,7 +1389,7 @@ public final class SerialPort { parity = newParity; - if (portHandle > 0) + if (portHandle != 0) { if (safetySleepTimeMS > 0) try { Thread.sleep(safetySleepTimeMS); } catch (Exception e) { Thread.currentThread().interrupt(); } @@ -1449,7 +1449,7 @@ public final class SerialPort rs485DelayBefore = delayBeforeSendMicroseconds; rs485DelayAfter = delayAfterSendMicroseconds; - if (portHandle > 0) + if (portHandle != 0) { if (safetySleepTimeMS > 0) try { Thread.sleep(safetySleepTimeMS); } catch (Exception e) { Thread.currentThread().interrupt(); } @@ -1474,7 +1474,7 @@ public final class SerialPort xonStartChar = xonStartCharacter; xoffStopChar = xoffStopCharacter; - if (portHandle > 0) + if (portHandle != 0) { if (safetySleepTimeMS > 0) try { Thread.sleep(safetySleepTimeMS); } catch (Exception e) { Thread.currentThread().interrupt(); } @@ -1778,7 +1778,7 @@ public final class SerialPort @Override public final int available() throws SerialPortIOException { - if (portHandle <= 0) + if (portHandle == 0) throw new SerialPortIOException("This port appears to have been shutdown or disconnected."); return bytesAvailable(portHandle); } @@ -1787,7 +1787,7 @@ public final class SerialPort public final int read() throws SerialPortIOException, SerialPortTimeoutException { // Perform error checking - if (portHandle <= 0) + if (portHandle == 0) throw new SerialPortIOException("This port appears to have been shutdown or disconnected."); // Read from the serial port @@ -1808,7 +1808,7 @@ public final class SerialPort // Perform error checking if (b == null) throw new NullPointerException("A null pointer was passed in for the read buffer."); - if (portHandle <= 0) + if (portHandle == 0) throw new SerialPortIOException("This port appears to have been shutdown or disconnected."); if (b.length == 0) return 0; @@ -1828,7 +1828,7 @@ public final class SerialPort throw new NullPointerException("A null pointer was passed in for the read buffer."); if ((len < 0) || (off < 0) || (len > (b.length - off))) throw new IndexOutOfBoundsException("The specified read offset plus length extends past the end of the specified buffer."); - if (portHandle <= 0) + if (portHandle == 0) throw new SerialPortIOException("This port appears to have been shutdown or disconnected."); if ((b.length == 0) || (len == 0)) return 0; @@ -1843,7 +1843,7 @@ public final class SerialPort @Override public final long skip(long n) throws SerialPortIOException { - if (portHandle <= 0) + if (portHandle == 0) throw new SerialPortIOException("This port appears to have been shutdown or disconnected."); byte[] buffer = new byte[(int)n]; return readBytes(portHandle, buffer, n, 0, timeoutMode, readTimeout); @@ -1860,7 +1860,7 @@ public final class SerialPort @Override public final void write(int b) throws SerialPortIOException, SerialPortTimeoutException { - if (portHandle <= 0) + if (portHandle == 0) throw new SerialPortIOException("This port appears to have been shutdown or disconnected."); byteBuffer[0] = (byte)(b & 0xFF); int bytesWritten = writeBytes(portHandle, byteBuffer, 1L, 0, timeoutMode); @@ -1890,7 +1890,7 @@ public final class SerialPort while (totalNumWritten != len) { // Always ensure that the port has not been closed - if (portHandle <= 0) + if (portHandle == 0) throw new SerialPortIOException("This port appears to have been shutdown or disconnected."); // Write the actual bytes to the serial port diff --git a/src/main/java/com/fazecast/jSerialComm/SerialPortDataListener.java b/src/main/java/com/fazecast/jSerialComm/SerialPortDataListener.java index e1f8a84..d25ec93 100644 --- a/src/main/java/com/fazecast/jSerialComm/SerialPortDataListener.java +++ b/src/main/java/com/fazecast/jSerialComm/SerialPortDataListener.java @@ -31,7 +31,7 @@ import java.util.EventListener; * This interface must be implemented to enable simple event-based serial port I/O. * * @author Will Hedgecock <will.hedgecock@fazecast.com> - * @version 2.8.2 + * @version 2.8.3 * @see java.util.EventListener */ public interface SerialPortDataListener extends EventListener diff --git a/src/main/java/com/fazecast/jSerialComm/SerialPortDataListenerWithExceptions.java b/src/main/java/com/fazecast/jSerialComm/SerialPortDataListenerWithExceptions.java index 372eaeb..9396a12 100644 --- a/src/main/java/com/fazecast/jSerialComm/SerialPortDataListenerWithExceptions.java +++ b/src/main/java/com/fazecast/jSerialComm/SerialPortDataListenerWithExceptions.java @@ -29,7 +29,7 @@ package com.fazecast.jSerialComm; * This interface must be implemented to enable simple event-based serial port I/O with a custom Exception callback. * * @author Will Hedgecock <will.hedgecock@fazecast.com> - * @version 2.8.2 + * @version 2.8.3 * @see com.fazecast.jSerialComm.SerialPortDataListener * @see java.util.EventListener */ diff --git a/src/main/java/com/fazecast/jSerialComm/SerialPortEvent.java b/src/main/java/com/fazecast/jSerialComm/SerialPortEvent.java index 0c7eb32..50de477 100644 --- a/src/main/java/com/fazecast/jSerialComm/SerialPortEvent.java +++ b/src/main/java/com/fazecast/jSerialComm/SerialPortEvent.java @@ -31,7 +31,7 @@ import java.util.EventObject; * This class describes an asynchronous serial port event. * * @author Will Hedgecock <will.hedgecock@fazecast.com> - * @version 2.8.2 + * @version 2.8.3 * @see java.util.EventObject */ public class SerialPortEvent extends EventObject diff --git a/src/main/java/com/fazecast/jSerialComm/SerialPortIOException.java b/src/main/java/com/fazecast/jSerialComm/SerialPortIOException.java index 59e771e..0cd6453 100644 --- a/src/main/java/com/fazecast/jSerialComm/SerialPortIOException.java +++ b/src/main/java/com/fazecast/jSerialComm/SerialPortIOException.java @@ -31,7 +31,7 @@ import java.io.IOException; * This class describes a serial port IO exception. * * @author Will Hedgecock <will.hedgecock@fazecast.com> - * @version 2.8.2 + * @version 2.8.3 * @see java.io.IOException */ public final class SerialPortIOException extends IOException diff --git a/src/main/java/com/fazecast/jSerialComm/SerialPortInvalidPortException.java b/src/main/java/com/fazecast/jSerialComm/SerialPortInvalidPortException.java index 399bb49..3cf80b9 100644 --- a/src/main/java/com/fazecast/jSerialComm/SerialPortInvalidPortException.java +++ b/src/main/java/com/fazecast/jSerialComm/SerialPortInvalidPortException.java @@ -29,7 +29,7 @@ package com.fazecast.jSerialComm; * This class describes a serial port invalid port exception. * * @author Will Hedgecock <will.hedgecock@fazecast.com> - * @version 2.8.2 + * @version 2.8.3 * @see java.lang.RuntimeException */ public final class SerialPortInvalidPortException extends RuntimeException diff --git a/src/main/java/com/fazecast/jSerialComm/SerialPortMessageListener.java b/src/main/java/com/fazecast/jSerialComm/SerialPortMessageListener.java index 24a09d7..657ef12 100644 --- a/src/main/java/com/fazecast/jSerialComm/SerialPortMessageListener.java +++ b/src/main/java/com/fazecast/jSerialComm/SerialPortMessageListener.java @@ -31,7 +31,7 @@ package com.fazecast.jSerialComm; * Note: Using this interface will negate any serial port read timeout settings since they make no sense in an asynchronous context. * * @author Will Hedgecock <will.hedgecock@fazecast.com> - * @version 2.8.2 + * @version 2.8.3 * @see com.fazecast.jSerialComm.SerialPortDataListener * @see java.util.EventListener */ diff --git a/src/main/java/com/fazecast/jSerialComm/SerialPortMessageListenerWithExceptions.java b/src/main/java/com/fazecast/jSerialComm/SerialPortMessageListenerWithExceptions.java index 96e41d5..001c7a3 100644 --- a/src/main/java/com/fazecast/jSerialComm/SerialPortMessageListenerWithExceptions.java +++ b/src/main/java/com/fazecast/jSerialComm/SerialPortMessageListenerWithExceptions.java @@ -31,7 +31,7 @@ package com.fazecast.jSerialComm; * Note: Using this interface will negate any serial port read timeout settings since they make no sense in an asynchronous context. * * @author Will Hedgecock <will.hedgecock@fazecast.com> - * @version 2.8.2 + * @version 2.8.3 * @see com.fazecast.jSerialComm.SerialPortMessageListener * @see com.fazecast.jSerialComm.SerialPortDataListener * @see java.util.EventListener diff --git a/src/main/java/com/fazecast/jSerialComm/SerialPortPacketListener.java b/src/main/java/com/fazecast/jSerialComm/SerialPortPacketListener.java index d0b26f7..aab48fb 100644 --- a/src/main/java/com/fazecast/jSerialComm/SerialPortPacketListener.java +++ b/src/main/java/com/fazecast/jSerialComm/SerialPortPacketListener.java @@ -31,7 +31,7 @@ package com.fazecast.jSerialComm; * Note: Using this interface will negate any serial port read timeout settings since they make no sense in an asynchronous context. * * @author Will Hedgecock <will.hedgecock@fazecast.com> - * @version 2.8.2 + * @version 2.8.3 * @see com.fazecast.jSerialComm.SerialPortDataListener * @see java.util.EventListener */ diff --git a/src/main/java/com/fazecast/jSerialComm/SerialPortTimeoutException.java b/src/main/java/com/fazecast/jSerialComm/SerialPortTimeoutException.java index 5ca0061..96fcc65 100644 --- a/src/main/java/com/fazecast/jSerialComm/SerialPortTimeoutException.java +++ b/src/main/java/com/fazecast/jSerialComm/SerialPortTimeoutException.java @@ -31,7 +31,7 @@ import java.io.InterruptedIOException; * This class describes a serial port timeout exception. * * @author Will Hedgecock <will.hedgecock@fazecast.com> - * @version 2.8.2 + * @version 2.8.3 * @see java.io.InterruptedIOException */ public final class SerialPortTimeoutException extends InterruptedIOException diff --git a/src/main/resources/Android/arm64-v8a/libjSerialComm.so b/src/main/resources/Android/arm64-v8a/libjSerialComm.so index 1206881..3d252b6 100644 Binary files a/src/main/resources/Android/arm64-v8a/libjSerialComm.so and b/src/main/resources/Android/arm64-v8a/libjSerialComm.so differ diff --git a/src/main/resources/Android/armeabi-v7a/libjSerialComm.so b/src/main/resources/Android/armeabi-v7a/libjSerialComm.so index 783d76a..9ebddf7 100644 Binary files a/src/main/resources/Android/armeabi-v7a/libjSerialComm.so and b/src/main/resources/Android/armeabi-v7a/libjSerialComm.so differ diff --git a/src/main/resources/Android/x86/libjSerialComm.so b/src/main/resources/Android/x86/libjSerialComm.so index 3ab4332..7d4b6ab 100644 Binary files a/src/main/resources/Android/x86/libjSerialComm.so and b/src/main/resources/Android/x86/libjSerialComm.so differ diff --git a/src/main/resources/Android/x86_64/libjSerialComm.so b/src/main/resources/Android/x86_64/libjSerialComm.so index 5bd229f..e4d61bd 100644 Binary files a/src/main/resources/Android/x86_64/libjSerialComm.so and b/src/main/resources/Android/x86_64/libjSerialComm.so differ diff --git a/src/main/resources/FreeBSD/arm64/libjSerialComm.so b/src/main/resources/FreeBSD/arm64/libjSerialComm.so index 9d49efc..5bedc68 100644 Binary files a/src/main/resources/FreeBSD/arm64/libjSerialComm.so and b/src/main/resources/FreeBSD/arm64/libjSerialComm.so differ diff --git a/src/main/resources/FreeBSD/x86/libjSerialComm.so b/src/main/resources/FreeBSD/x86/libjSerialComm.so index 8f01865..0f27153 100644 Binary files a/src/main/resources/FreeBSD/x86/libjSerialComm.so and b/src/main/resources/FreeBSD/x86/libjSerialComm.so differ diff --git a/src/main/resources/FreeBSD/x86_64/libjSerialComm.so b/src/main/resources/FreeBSD/x86_64/libjSerialComm.so index 7cb0207..1785f97 100644 Binary files a/src/main/resources/FreeBSD/x86_64/libjSerialComm.so and b/src/main/resources/FreeBSD/x86_64/libjSerialComm.so differ diff --git a/src/main/resources/Linux/armv5/libjSerialComm.so b/src/main/resources/Linux/armv5/libjSerialComm.so index 8d2fe58..15fcc2c 100644 Binary files a/src/main/resources/Linux/armv5/libjSerialComm.so and b/src/main/resources/Linux/armv5/libjSerialComm.so differ diff --git a/src/main/resources/Linux/armv6/libjSerialComm.so b/src/main/resources/Linux/armv6/libjSerialComm.so index d18bc2a..c2a6435 100644 Binary files a/src/main/resources/Linux/armv6/libjSerialComm.so and b/src/main/resources/Linux/armv6/libjSerialComm.so differ diff --git a/src/main/resources/Linux/armv6hf/libjSerialComm.so b/src/main/resources/Linux/armv6hf/libjSerialComm.so index 05f37f3..7064f33 100644 Binary files a/src/main/resources/Linux/armv6hf/libjSerialComm.so and b/src/main/resources/Linux/armv6hf/libjSerialComm.so differ diff --git a/src/main/resources/Linux/armv7/libjSerialComm.so b/src/main/resources/Linux/armv7/libjSerialComm.so index bb8b57a..92236c7 100644 Binary files a/src/main/resources/Linux/armv7/libjSerialComm.so and b/src/main/resources/Linux/armv7/libjSerialComm.so differ diff --git a/src/main/resources/Linux/armv7hf/libjSerialComm.so b/src/main/resources/Linux/armv7hf/libjSerialComm.so index 04401b7..444c67d 100644 Binary files a/src/main/resources/Linux/armv7hf/libjSerialComm.so and b/src/main/resources/Linux/armv7hf/libjSerialComm.so differ diff --git a/src/main/resources/Linux/armv8_32/libjSerialComm.so b/src/main/resources/Linux/armv8_32/libjSerialComm.so index 5157cae..0522d9a 100644 Binary files a/src/main/resources/Linux/armv8_32/libjSerialComm.so and b/src/main/resources/Linux/armv8_32/libjSerialComm.so differ diff --git a/src/main/resources/Linux/armv8_64/libjSerialComm.so b/src/main/resources/Linux/armv8_64/libjSerialComm.so index 68fda4e..e22fc20 100644 Binary files a/src/main/resources/Linux/armv8_64/libjSerialComm.so and b/src/main/resources/Linux/armv8_64/libjSerialComm.so differ diff --git a/src/main/resources/Linux/ppc64le/libjSerialComm.so b/src/main/resources/Linux/ppc64le/libjSerialComm.so index 4562cf8..cd1d4c9 100644 Binary files a/src/main/resources/Linux/ppc64le/libjSerialComm.so and b/src/main/resources/Linux/ppc64le/libjSerialComm.so differ diff --git a/src/main/resources/Linux/x86/libjSerialComm.so b/src/main/resources/Linux/x86/libjSerialComm.so index bf5d081..3da818b 100644 Binary files a/src/main/resources/Linux/x86/libjSerialComm.so and b/src/main/resources/Linux/x86/libjSerialComm.so differ diff --git a/src/main/resources/Linux/x86_64/libjSerialComm.so b/src/main/resources/Linux/x86_64/libjSerialComm.so index e1aec38..7b1db46 100644 Binary files a/src/main/resources/Linux/x86_64/libjSerialComm.so and b/src/main/resources/Linux/x86_64/libjSerialComm.so differ diff --git a/src/main/resources/OSX/aarch64/libjSerialComm.jnilib b/src/main/resources/OSX/aarch64/libjSerialComm.jnilib index e5a5ee9..af87c70 100755 Binary files a/src/main/resources/OSX/aarch64/libjSerialComm.jnilib and b/src/main/resources/OSX/aarch64/libjSerialComm.jnilib differ diff --git a/src/main/resources/OSX/x86/libjSerialComm.jnilib b/src/main/resources/OSX/x86/libjSerialComm.jnilib index 94674f1..8c7f069 100644 Binary files a/src/main/resources/OSX/x86/libjSerialComm.jnilib and b/src/main/resources/OSX/x86/libjSerialComm.jnilib differ diff --git a/src/main/resources/OSX/x86_64/libjSerialComm.jnilib b/src/main/resources/OSX/x86_64/libjSerialComm.jnilib index a635f07..dcedf26 100755 Binary files a/src/main/resources/OSX/x86_64/libjSerialComm.jnilib and b/src/main/resources/OSX/x86_64/libjSerialComm.jnilib differ diff --git a/src/main/resources/Solaris/sparcv8plus_32/libjSerialComm.so b/src/main/resources/Solaris/sparcv8plus_32/libjSerialComm.so index 44e5ce8..bf0ec40 100644 Binary files a/src/main/resources/Solaris/sparcv8plus_32/libjSerialComm.so and b/src/main/resources/Solaris/sparcv8plus_32/libjSerialComm.so differ diff --git a/src/main/resources/Solaris/sparcv9_64/libjSerialComm.so b/src/main/resources/Solaris/sparcv9_64/libjSerialComm.so index d432f23..25833ad 100644 Binary files a/src/main/resources/Solaris/sparcv9_64/libjSerialComm.so and b/src/main/resources/Solaris/sparcv9_64/libjSerialComm.so differ diff --git a/src/main/resources/Solaris/x86/libjSerialComm.so b/src/main/resources/Solaris/x86/libjSerialComm.so index 47821e1..32634be 100644 Binary files a/src/main/resources/Solaris/x86/libjSerialComm.so and b/src/main/resources/Solaris/x86/libjSerialComm.so differ diff --git a/src/main/resources/Solaris/x86_64/libjSerialComm.so b/src/main/resources/Solaris/x86_64/libjSerialComm.so index 2038247..35fa97c 100644 Binary files a/src/main/resources/Solaris/x86_64/libjSerialComm.so and b/src/main/resources/Solaris/x86_64/libjSerialComm.so differ