diff --git a/src/main/c/Android/jni/SerialPort_Android.c b/src/main/c/Android/jni/SerialPort_Android.c index bf1cec9..014b8e2 100644 --- a/src/main/c/Android/jni/SerialPort_Android.c +++ b/src/main/c/Android/jni/SerialPort_Android.c @@ -2,7 +2,7 @@ * SerialPort_Android.c * * Created on: Mar 13, 2015 - * Last Updated on: Apr 15, 2019 + * Last Updated on: Jul 08, 2019 * Author: Will Hedgecock * * Copyright (C) 2012-2019 Fazecast, Inc. @@ -66,6 +66,9 @@ jfieldID parityField; jfieldID flowControlField; jfieldID sendDeviceQueueSizeField; jfieldID receiveDeviceQueueSizeField; +jfieldID rs485ModeField; +jfieldID rs485DelayBeforeField; +jfieldID rs485DelayAfterField; jfieldID timeoutModeField; jfieldID readTimeoutField; jfieldID writeTimeoutField; @@ -121,6 +124,9 @@ JNIEXPORT void JNICALL Java_com_fazecast_jSerialComm_SerialPort_initializeLibrar flowControlField = (*env)->GetFieldID(env, serialCommClass, "flowControl", "I"); sendDeviceQueueSizeField = (*env)->GetFieldID(env, serialCommClass, "sendDeviceQueueSize", "I"); receiveDeviceQueueSizeField = (*env)->GetFieldID(env, serialCommClass, "receiveDeviceQueueSize", "I"); + rs485ModeField = (*env)->GetFieldID(env, serialCommClass, "rs485Mode", "Z"); + rs485DelayBeforeField = (*env)->GetFieldID(env, serialCommClass, "rs485DelayBefore", "I"); + rs485DelayAfterField = (*env)->GetFieldID(env, serialCommClass, "rs485DelayAfter", "I"); timeoutModeField = (*env)->GetFieldID(env, serialCommClass, "timeoutMode", "I"); readTimeoutField = (*env)->GetFieldID(env, serialCommClass, "readTimeout", "I"); writeTimeoutField = (*env)->GetFieldID(env, serialCommClass, "writeTimeout", "I"); @@ -193,7 +199,10 @@ JNIEXPORT jboolean JNICALL Java_com_fazecast_jSerialComm_SerialPort_configPort(J int flowControl = (*env)->GetIntField(env, obj, flowControlField); int sendDeviceQueueSize = (*env)->GetIntField(env, obj, sendDeviceQueueSizeField); int receiveDeviceQueueSize = (*env)->GetIntField(env, obj, receiveDeviceQueueSizeField); + int rs485DelayBefore = (*env)->GetIntField(env, obj, rs485DelayBeforeField); + int rs485DelayAfter = (*env)->GetIntField(env, obj, rs485DelayAfterField); unsigned char configDisabled = (*env)->GetBooleanField(env, obj, disableConfigField); + unsigned char rs485ModeEnabled = (*env)->GetBooleanField(env, obj, rs485ModeField); unsigned char isDtrEnabled = (*env)->GetBooleanField(env, obj, isDtrEnabledField); unsigned char isRtsEnabled = (*env)->GetBooleanField(env, obj, isRtsEnabledField); tcflag_t byteSize = (byteSizeInt == 5) ? CS5 : (byteSizeInt == 6) ? CS6 : (byteSizeInt == 7) ? CS7 : CS8; @@ -255,6 +264,19 @@ JNIEXPORT jboolean JNICALL Java_com_fazecast_jSerialComm_SerialPort_configPort(J ioctl(serialPortFD, TIOCSSERIAL, &serInfo); if (baudRateCode == 0) setBaudRate(serialPortFD, baudRate); + + // Attempt to set the requested RS-485 mode + struct serial_rs485 rs485Conf; + if (ioctl(serialPortFD, TIOCGRS485, &rs485Conf) == 0) + { + if (rs485ModeEnabled) + rs485Conf.flags |= SER_RS485_ENABLED; + else + rs485Conf.flags &= ~SER_RS485_ENABLED; + rs485Conf.delay_rts_before_send = rs485DelayBefore; + rs485Conf.delay_rts_after_send = rs485DelayAfter; + ioctl(serialPortFD, TIOCSRS485, &rs485Conf); + } return ((retVal == 0) && Java_com_fazecast_jSerialComm_SerialPort_configEventFlags(env, obj, serialPortFD) ? JNI_TRUE : JNI_FALSE); } @@ -454,7 +476,7 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_readBytes(JNIEnv if (numBytesRead == -1) { // Problem reading, close port - while ((close(serialPortFD) == -1) && (errno != EBADF)); + while (((*env)->GetBooleanField(env, obj, isOpenedField)) && (close(serialPortFD) == -1) && (errno != EBADF)); serialPortFD = -1; (*env)->SetLongField(env, obj, serialPortFdField, -1l); (*env)->SetBooleanField(env, obj, isOpenedField, JNI_FALSE); @@ -485,7 +507,7 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_readBytes(JNIEnv if (numBytesRead == -1) { // Problem reading, close port - while ((close(serialPortFD) == -1) && (errno != EBADF)); + while (((*env)->GetBooleanField(env, obj, isOpenedField)) && (close(serialPortFD) == -1) && (errno != EBADF)); serialPortFD = -1; (*env)->SetLongField(env, obj, serialPortFdField, -1l); (*env)->SetBooleanField(env, obj, isOpenedField, JNI_FALSE); @@ -508,7 +530,7 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_readBytes(JNIEnv if (numBytesRead == -1) { // Problem reading, close port - while ((close(serialPortFD) == -1) && (errno != EBADF)); + while (((*env)->GetBooleanField(env, obj, isOpenedField)) && (close(serialPortFD) == -1) && (errno != EBADF)); serialPortFD = -1; (*env)->SetLongField(env, obj, serialPortFdField, -1l); (*env)->SetBooleanField(env, obj, isOpenedField, JNI_FALSE); @@ -538,7 +560,7 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_writeBytes(JNIEn // Problem writing, allow others to open the port and close it ourselves ioctl(serialPortFD, TIOCNXCL); ioctl(serialPortFD, TCSBRK, 1); - while ((close(serialPortFD) == -1) && (errno != EBADF)); + while (((*env)->GetBooleanField(env, obj, isOpenedField)) && (close(serialPortFD) == -1) && (errno != EBADF)); serialPortFD = -1; (*env)->SetLongField(env, obj, serialPortFdField, -1l); (*env)->SetBooleanField(env, obj, isOpenedField, JNI_FALSE); diff --git a/src/main/c/Posix/SerialPort_Posix.c b/src/main/c/Posix/SerialPort_Posix.c index 72693e5..a39d123 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: Apr 15, 2019 + * Last Updated on: Jul 08, 2019 * Author: Will Hedgecock * * Copyright (C) 2012-2019 Fazecast, Inc. @@ -64,6 +64,9 @@ jfieldID parityField; jfieldID flowControlField; jfieldID sendDeviceQueueSizeField; jfieldID receiveDeviceQueueSizeField; +jfieldID rs485ModeField; +jfieldID rs485DelayBeforeField; +jfieldID rs485DelayAfterField; jfieldID timeoutModeField; jfieldID readTimeoutField; jfieldID writeTimeoutField; @@ -225,6 +228,9 @@ JNIEXPORT void JNICALL Java_com_fazecast_jSerialComm_SerialPort_initializeLibrar flowControlField = (*env)->GetFieldID(env, serialCommClass, "flowControl", "I"); sendDeviceQueueSizeField = (*env)->GetFieldID(env, serialCommClass, "sendDeviceQueueSize", "I"); receiveDeviceQueueSizeField = (*env)->GetFieldID(env, serialCommClass, "receiveDeviceQueueSize", "I"); + rs485ModeField = (*env)->GetFieldID(env, serialCommClass, "rs485Mode", "Z"); + rs485DelayBeforeField = (*env)->GetFieldID(env, serialCommClass, "rs485DelayBefore", "I"); + rs485DelayAfterField = (*env)->GetFieldID(env, serialCommClass, "rs485DelayAfter", "I"); timeoutModeField = (*env)->GetFieldID(env, serialCommClass, "timeoutMode", "I"); readTimeoutField = (*env)->GetFieldID(env, serialCommClass, "readTimeout", "I"); writeTimeoutField = (*env)->GetFieldID(env, serialCommClass, "writeTimeout", "I"); @@ -307,7 +313,10 @@ JNIEXPORT jboolean JNICALL Java_com_fazecast_jSerialComm_SerialPort_configPort(J int flowControl = (*env)->GetIntField(env, obj, flowControlField); int sendDeviceQueueSize = (*env)->GetIntField(env, obj, sendDeviceQueueSizeField); int receiveDeviceQueueSize = (*env)->GetIntField(env, obj, receiveDeviceQueueSizeField); + int rs485DelayBefore = (*env)->GetIntField(env, obj, rs485DelayBeforeField); + int rs485DelayAfter = (*env)->GetIntField(env, obj, rs485DelayAfterField); unsigned char configDisabled = (*env)->GetBooleanField(env, obj, disableConfigField); + unsigned char rs485ModeEnabled = (*env)->GetBooleanField(env, obj, rs485ModeField); unsigned char isDtrEnabled = (*env)->GetBooleanField(env, obj, isDtrEnabledField); unsigned char isRtsEnabled = (*env)->GetBooleanField(env, obj, isRtsEnabledField); tcflag_t byteSize = (byteSizeInt == 5) ? CS5 : (byteSizeInt == 6) ? CS6 : (byteSizeInt == 7) ? CS7 : CS8; @@ -347,8 +356,7 @@ JNIEXPORT jboolean JNICALL Java_com_fazecast_jSerialComm_SerialPort_configPort(J // Attempt to set the transmit buffer size and any necessary custom baud rates #if defined(__linux__) struct serial_struct serInfo; - int ioctlRetVal = ioctl(serialPortFD, TIOCGSERIAL, &serInfo); - if (ioctlRetVal == 0) + if (ioctl(serialPortFD, TIOCGSERIAL, &serInfo) == 0) { serInfo.xmit_fifo_size = sendDeviceQueueSize; ioctl(serialPortFD, TIOCSSERIAL, &serInfo); @@ -356,6 +364,21 @@ JNIEXPORT jboolean JNICALL Java_com_fazecast_jSerialComm_SerialPort_configPort(J #endif if (nonStandardBaudRate) setBaudRateCustom(serialPortFD, baudRate); + + // Attempt to set the requested RS-485 mode +#if defined(__linux__) + struct serial_rs485 rs485Conf; + if (ioctl(serialPortFD, TIOCGRS485, &rs485Conf) == 0) + { + if (rs485ModeEnabled) + rs485Conf.flags |= SER_RS485_ENABLED; + else + rs485Conf.flags &= ~SER_RS485_ENABLED; + rs485Conf.delay_rts_before_send = rs485DelayBefore; + rs485Conf.delay_rts_after_send = rs485DelayAfter; + ioctl(serialPortFD, TIOCSRS485, &rs485Conf); + } +#endif return ((retVal == 0) && Java_com_fazecast_jSerialComm_SerialPort_configEventFlags(env, obj, serialPortFD) ? JNI_TRUE : JNI_FALSE); } @@ -538,7 +561,7 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_readBytes(JNIEnv // Problem reading, allow others to open the port and close it ourselves ioctl(serialPortFD, TIOCNXCL); tcdrain(serialPortFD); - while ((close(serialPortFD) == -1) && (errno != EBADF)); + while (((*env)->GetBooleanField(env, obj, isOpenedField)) && (close(serialPortFD) == -1) && (errno != EBADF)); serialPortFD = -1; (*env)->SetLongField(env, obj, serialPortFdField, -1l); (*env)->SetBooleanField(env, obj, isOpenedField, JNI_FALSE); @@ -571,7 +594,7 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_readBytes(JNIEnv // Problem reading, allow others to open the port and close it ourselves ioctl(serialPortFD, TIOCNXCL); tcdrain(serialPortFD); - while ((close(serialPortFD) == -1) && (errno != EBADF)); + while (((*env)->GetBooleanField(env, obj, isOpenedField)) && (close(serialPortFD) == -1) && (errno != EBADF)); serialPortFD = -1; (*env)->SetLongField(env, obj, serialPortFdField, -1l); (*env)->SetBooleanField(env, obj, isOpenedField, JNI_FALSE); @@ -596,7 +619,7 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_readBytes(JNIEnv // Problem reading, allow others to open the port and close it ourselves ioctl(serialPortFD, TIOCNXCL); tcdrain(serialPortFD); - while ((close(serialPortFD) == -1) && (errno != EBADF)); + while (((*env)->GetBooleanField(env, obj, isOpenedField)) && (close(serialPortFD) == -1) && (errno != EBADF)); serialPortFD = -1; (*env)->SetLongField(env, obj, serialPortFdField, -1l); (*env)->SetBooleanField(env, obj, isOpenedField, JNI_FALSE); @@ -631,7 +654,7 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_writeBytes(JNIEn // Problem writing, allow others to open the port and close it ourselves ioctl(serialPortFD, TIOCNXCL); tcdrain(serialPortFD); - while ((close(serialPortFD) == -1) && (errno != EBADF)); + while (((*env)->GetBooleanField(env, obj, isOpenedField)) && (close(serialPortFD) == -1) && (errno != EBADF)); serialPortFD = -1; (*env)->SetLongField(env, obj, serialPortFdField, -1l); (*env)->SetBooleanField(env, obj, isOpenedField, JNI_FALSE); diff --git a/src/main/c/Windows/SerialPort_Windows.c b/src/main/c/Windows/SerialPort_Windows.c index 0a5f923..3b86ed3 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: Mar 07, 2019 + * Last Updated on: Jul 08, 2019 * Author: Will Hedgecock * * Copyright (C) 2012-2019 Fazecast, Inc. @@ -57,6 +57,9 @@ jfieldID parityField; jfieldID flowControlField; jfieldID sendDeviceQueueSizeField; jfieldID receiveDeviceQueueSizeField; +jfieldID rs485ModeField; +jfieldID rs485DelayBeforeField; +jfieldID rs485DelayAfterField; jfieldID timeoutModeField; jfieldID readTimeoutField; jfieldID writeTimeoutField; @@ -358,6 +361,9 @@ JNIEXPORT void JNICALL Java_com_fazecast_jSerialComm_SerialPort_initializeLibrar flowControlField = env->GetFieldID(serialCommClass, "flowControl", "I"); sendDeviceQueueSizeField = env->GetFieldID(serialCommClass, "sendDeviceQueueSize", "I"); receiveDeviceQueueSizeField = env->GetFieldID(serialCommClass, "receiveDeviceQueueSize", "I"); + rs485ModeField = env->GetFieldID(serialCommClass, "rs485Mode", "Z"); + rs485DelayBeforeField = env->GetFieldID(serialCommClass, "rs485DelayBefore", "I"); + rs485DelayAfterField = env->GetFieldID(serialCommClass, "rs485DelayAfter", "I"); timeoutModeField = env->GetFieldID(serialCommClass, "timeoutMode", "I"); readTimeoutField = env->GetFieldID(serialCommClass, "readTimeout", "I"); writeTimeoutField = env->GetFieldID(serialCommClass, "writeTimeout", "I"); @@ -414,6 +420,7 @@ JNIEXPORT jboolean JNICALL Java_com_fazecast_jSerialComm_SerialPort_configPort(J DWORD sendDeviceQueueSize = (DWORD)env->GetIntField(obj, sendDeviceQueueSizeField); DWORD receiveDeviceQueueSize = (DWORD)env->GetIntField(obj, receiveDeviceQueueSizeField); BYTE configDisabled = (BYTE)env->GetBooleanField(obj, disableConfigField); + BYTE rs485ModeEnabled = (BYTE)env->GetBooleanField(obj, rs485ModeField); BYTE isDtrEnabled = env->GetBooleanField(obj, isDtrEnabledField); BYTE isRtsEnabled = env->GetBooleanField(obj, isRtsEnabledField); BYTE stopBits = (stopBitsInt == com_fazecast_jSerialComm_SerialPort_ONE_STOP_BIT) ? ONESTOPBIT : (stopBitsInt == com_fazecast_jSerialComm_SerialPort_ONE_POINT_FIVE_STOP_BITS) ? ONE5STOPBITS : TWOSTOPBITS; @@ -424,7 +431,8 @@ JNIEXPORT jboolean JNICALL Java_com_fazecast_jSerialComm_SerialPort_configPort(J BOOL DSREnabled = (((flowControl & com_fazecast_jSerialComm_SerialPort_FLOW_CONTROL_DSR_ENABLED) > 0) || ((flowControl & com_fazecast_jSerialComm_SerialPort_FLOW_CONTROL_DTR_ENABLED) > 0)); BYTE DTRValue = ((flowControl & com_fazecast_jSerialComm_SerialPort_FLOW_CONTROL_DTR_ENABLED) > 0) ? DTR_CONTROL_HANDSHAKE : (isDtrEnabled ? DTR_CONTROL_ENABLE : DTR_CONTROL_DISABLE); - BYTE RTSValue = ((flowControl & com_fazecast_jSerialComm_SerialPort_FLOW_CONTROL_RTS_ENABLED) > 0) ? RTS_CONTROL_HANDSHAKE : (isRtsEnabled ? RTS_CONTROL_ENABLE : RTS_CONTROL_DISABLE); + BYTE RTSValue = (rs485ModeEnabled ? RTS_CONTROL_TOGGLE : + (((flowControl & com_fazecast_jSerialComm_SerialPort_FLOW_CONTROL_RTS_ENABLED) > 0) ? RTS_CONTROL_HANDSHAKE : (isRtsEnabled ? RTS_CONTROL_ENABLE : RTS_CONTROL_DISABLE))); BOOL XonXoffInEnabled = ((flowControl & com_fazecast_jSerialComm_SerialPort_FLOW_CONTROL_XONXOFF_IN_ENABLED) > 0); BOOL XonXoffOutEnabled = ((flowControl & com_fazecast_jSerialComm_SerialPort_FLOW_CONTROL_XONXOFF_OUT_ENABLED) > 0); @@ -566,7 +574,7 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_waitForEvent(JNI // Problem reading, close port int numRetries = 10; PurgeComm(serialPortHandle, PURGE_RXABORT | PURGE_RXCLEAR | PURGE_TXABORT | PURGE_TXCLEAR); - while (!CloseHandle(serialPortHandle) && (numRetries-- > 0)); + while (env->GetBooleanField(obj, isOpenedField) && !CloseHandle(serialPortHandle) && (numRetries-- > 0)); serialPortHandle = INVALID_HANDLE_VALUE; env->SetLongField(obj, serialPortHandleField, -1l); env->SetBooleanField(obj, isOpenedField, JNI_FALSE); @@ -674,7 +682,7 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_readBytes(JNIEnv // Problem reading, close port int numRetries = 10; PurgeComm(serialPortHandle, PURGE_RXABORT | PURGE_RXCLEAR | PURGE_TXABORT | PURGE_TXCLEAR); - while (!CloseHandle(serialPortHandle) && (numRetries-- > 0)); + while (env->GetBooleanField(obj, isOpenedField) && !CloseHandle(serialPortHandle) && (numRetries-- > 0)); serialPortHandle = INVALID_HANDLE_VALUE; env->SetLongField(obj, serialPortHandleField, -1l); env->SetBooleanField(obj, isOpenedField, JNI_FALSE); @@ -684,7 +692,7 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_readBytes(JNIEnv // Problem reading, close port int numRetries = 10; PurgeComm(serialPortHandle, PURGE_RXABORT | PURGE_RXCLEAR | PURGE_TXABORT | PURGE_TXCLEAR); - while (!CloseHandle(serialPortHandle) && (numRetries-- > 0)); + while (env->GetBooleanField(obj, isOpenedField) && !CloseHandle(serialPortHandle) && (numRetries-- > 0)); serialPortHandle = INVALID_HANDLE_VALUE; env->SetLongField(obj, serialPortHandleField, -1l); env->SetBooleanField(obj, isOpenedField, JNI_FALSE); @@ -725,7 +733,7 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_writeBytes(JNIEn // Problem writing, close port int numRetries = 10; PurgeComm(serialPortHandle, PURGE_RXABORT | PURGE_RXCLEAR | PURGE_TXABORT | PURGE_TXCLEAR); - while (!CloseHandle(serialPortHandle) && (numRetries-- > 0)); + while (env->GetBooleanField(obj, isOpenedField) && !CloseHandle(serialPortHandle) && (numRetries-- > 0)); serialPortHandle = INVALID_HANDLE_VALUE; env->SetLongField(obj, serialPortHandleField, -1l); env->SetBooleanField(obj, isOpenedField, JNI_FALSE); @@ -735,7 +743,7 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_writeBytes(JNIEn // Problem reading, close port int numRetries = 10; PurgeComm(serialPortHandle, PURGE_RXABORT | PURGE_RXCLEAR | PURGE_TXABORT | PURGE_TXCLEAR); - while (!CloseHandle(serialPortHandle) && (numRetries-- > 0)); + while (env->GetBooleanField(obj, isOpenedField) && !CloseHandle(serialPortHandle) && (numRetries-- > 0)); serialPortHandle = INVALID_HANDLE_VALUE; env->SetLongField(obj, serialPortHandleField, -1l); env->SetBooleanField(obj, isOpenedField, JNI_FALSE); diff --git a/src/main/java/com/fazecast/jSerialComm/SerialPort.java b/src/main/java/com/fazecast/jSerialComm/SerialPort.java index 823da5d..82446e6 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: Apr 15, 2019 + * Last Updated on: Jul 08, 2019 * Author: Will Hedgecock * * Copyright (C) 2012-2019 Fazecast, Inc. @@ -364,12 +364,14 @@ public final class SerialPort private volatile int baudRate = 9600, dataBits = 8, stopBits = ONE_STOP_BIT, parity = NO_PARITY, eventFlags = 0; private volatile int timeoutMode = TIMEOUT_NONBLOCKING, readTimeout = 0, writeTimeout = 0, flowControl = 0; private volatile int sendDeviceQueueSize = 4096, receiveDeviceQueueSize = 4096; + private volatile int rs485DelayBefore = 0, rs485DelayAfter = 0; private volatile SerialPortInputStream inputStream = null; private volatile SerialPortOutputStream outputStream = null; private volatile SerialPortDataListener userDataListener = null; private volatile SerialPortEventListener serialEventListener = null; private volatile String comPort, friendlyName, portDescription; - private volatile boolean isOpened = false, disableConfig = false, isRtsEnabled = true, isDtrEnabled = true; + private volatile boolean isOpened = false, disableConfig = false; + private volatile boolean rs485Mode = false, isRtsEnabled = true, isDtrEnabled = true; /** * Opens this serial port for reading and writing with an optional delay time and user-specified device buffer size. @@ -820,6 +822,53 @@ public final class SerialPort } } + /** + * Sets all serial port parameters at one time. + *

+ * Allows the user to set all port parameters with a single function call. + *

+ * The baud rate can be any arbitrary value specified by the user. The default value is 9600 baud. The data bits parameter + * specifies how many data bits to use per word. The default is 8, but any values from 5 to 8 are acceptable. + *

+ * The default number of stop bits is 1, but 2 bits can also be used or even 1.5 on Windows machines. Please use the built-in + * constants for this parameter ({@link #ONE_STOP_BIT}, {@link #ONE_POINT_FIVE_STOP_BITS}, {@link #TWO_STOP_BITS}). + *

+ * The parity parameter specifies how error detection is carried out. Again, the built-in constants should be used. + * Acceptable values are {@link #NO_PARITY}, {@link #EVEN_PARITY}, {@link #ODD_PARITY}, {@link #MARK_PARITY}, and {@link #SPACE_PARITY}. + *

+ * RS-485 mode can be used to enable transmit/receive mode signaling using the RTS pin. This mode should be set if you plan + * to use this library with an RS-485 device. Note that this mode requires support from the underlying device driver, so it + * may not work with all RS-485 devices. + * + * @param newBaudRate The desired baud rate for this serial port. + * @param newDataBits The number of data bits to use per word. + * @param newStopBits The number of stop bits to use. + * @param newParity The type of parity error-checking desired. + * @param useRS485Mode Whether to enable RS-485 mode. + * @see #ONE_STOP_BIT + * @see #ONE_POINT_FIVE_STOP_BITS + * @see #TWO_STOP_BITS + * @see #NO_PARITY + * @see #EVEN_PARITY + * @see #ODD_PARITY + * @see #MARK_PARITY + * @see #SPACE_PARITY + */ + public final void setComPortParameters(int newBaudRate, int newDataBits, int newStopBits, int newParity, boolean useRS485Mode) + { + baudRate = newBaudRate; + dataBits = newDataBits; + stopBits = newStopBits; + parity = newParity; + rs485Mode = useRS485Mode; + + if (isOpened) + { + try { Thread.sleep(200); } catch (Exception e) {} + configPort(portHandle); + } + } + /** * Sets the serial port read and write timeout parameters. *

@@ -1014,6 +1063,33 @@ public final class SerialPort } } + /** + * Sets whether to enable RS-485 mode for this device. + *

+ * RS-485 mode can be used to enable transmit/receive mode signaling using the RTS pin. This mode should be set if you plan + * to use this library with an RS-485 device. Note that this mode requires support from the underlying device driver, so it + * may not work with all RS-485 devices. + *

+ * The delay parameters specify how long to wait before or after transmission of data before enabling or disabling + * transmission mode via the RTS pin. + * + * @param useRS485Mode Whether to enable RS-485 mode. + * @param delayBeforeSendMicroseconds The time to wait after enabling transmit mode before sending the first data bit. + * @param delayAfterSendMicroseconds The time to wait after sending the last data bit before disabling transmit mode. + */ + public final void setRs485ModeParameters(boolean useRS485Mode, int delayBeforeSendMicroseconds, int delayAfterSendMicroseconds) + { + rs485Mode = useRS485Mode; + rs485DelayBefore = delayBeforeSendMicroseconds; + rs485DelayAfter = delayAfterSendMicroseconds; + + if (isOpened) + { + try { Thread.sleep(200); } catch (Exception e) {} + configPort(portHandle); + } + } + /** * Gets a descriptive string representing this serial port or the device connected to it. *

diff --git a/src/main/resources/Android/arm64-v8a/libjSerialComm.so b/src/main/resources/Android/arm64-v8a/libjSerialComm.so index 32800e1..34d9d75 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 5f0089f..9ca248f 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/armeabi/libjSerialComm.so b/src/main/resources/Android/armeabi/libjSerialComm.so index 3a9886c..eb548c3 100644 Binary files a/src/main/resources/Android/armeabi/libjSerialComm.so and b/src/main/resources/Android/armeabi/libjSerialComm.so differ diff --git a/src/main/resources/Android/mips/libjSerialComm.so b/src/main/resources/Android/mips/libjSerialComm.so index 40b61ba..51a5339 100644 Binary files a/src/main/resources/Android/mips/libjSerialComm.so and b/src/main/resources/Android/mips/libjSerialComm.so differ diff --git a/src/main/resources/Android/mips64/libjSerialComm.so b/src/main/resources/Android/mips64/libjSerialComm.so index 104f032..ad6f15f 100644 Binary files a/src/main/resources/Android/mips64/libjSerialComm.so and b/src/main/resources/Android/mips64/libjSerialComm.so differ diff --git a/src/main/resources/Android/x86/libjSerialComm.so b/src/main/resources/Android/x86/libjSerialComm.so index d6ce732..3663bdd 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 a2de74d..8057f3c 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/Linux/armv5/libjSerialComm.so b/src/main/resources/Linux/armv5/libjSerialComm.so index d96078d..9298bff 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-hf/libjSerialComm.so b/src/main/resources/Linux/armv6-hf/libjSerialComm.so index d3480a7..8978722 100644 Binary files a/src/main/resources/Linux/armv6-hf/libjSerialComm.so and b/src/main/resources/Linux/armv6-hf/libjSerialComm.so differ diff --git a/src/main/resources/Linux/armv6/libjSerialComm.so b/src/main/resources/Linux/armv6/libjSerialComm.so index c2fe270..e057cf9 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/armv7-hf/libjSerialComm.so b/src/main/resources/Linux/armv7-hf/libjSerialComm.so index d3480a7..8978722 100644 Binary files a/src/main/resources/Linux/armv7-hf/libjSerialComm.so and b/src/main/resources/Linux/armv7-hf/libjSerialComm.so differ diff --git a/src/main/resources/Linux/armv7/libjSerialComm.so b/src/main/resources/Linux/armv7/libjSerialComm.so index b64d532..07271a3 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/armv8_32/libjSerialComm.so b/src/main/resources/Linux/armv8_32/libjSerialComm.so index 3cef10e..d566d9c 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 fa18bc6..ac153f8 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/x86/libjSerialComm.so b/src/main/resources/Linux/x86/libjSerialComm.so index 12cb7a1..45f3dee 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 0e36c8e..840a6b3 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/x86_64/libjSerialComm.jnilib b/src/main/resources/OSX/x86_64/libjSerialComm.jnilib index 9dac44c..ebd8f1e 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 c7e20b5..96689ee 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 1b30197..4f006fd 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 6f7fd42..1c76c74 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 ef6e692..a3fd368 100644 Binary files a/src/main/resources/Solaris/x86_64/libjSerialComm.so and b/src/main/resources/Solaris/x86_64/libjSerialComm.so differ diff --git a/src/main/resources/Windows/x86/jSerialComm.dll b/src/main/resources/Windows/x86/jSerialComm.dll index 922d759..a825a63 100644 Binary files a/src/main/resources/Windows/x86/jSerialComm.dll and b/src/main/resources/Windows/x86/jSerialComm.dll differ diff --git a/src/main/resources/Windows/x86_64/jSerialComm.dll b/src/main/resources/Windows/x86_64/jSerialComm.dll index 716161b..b934581 100644 Binary files a/src/main/resources/Windows/x86_64/jSerialComm.dll and b/src/main/resources/Windows/x86_64/jSerialComm.dll differ