Check for valid file descriptor before closing and add RS485 mode
This commit is contained in:
parent
53449d43bc
commit
fbb51c858b
|
@ -2,7 +2,7 @@
|
||||||
* SerialPort_Android.c
|
* SerialPort_Android.c
|
||||||
*
|
*
|
||||||
* Created on: Mar 13, 2015
|
* Created on: Mar 13, 2015
|
||||||
* Last Updated on: Apr 15, 2019
|
* Last Updated on: Jul 08, 2019
|
||||||
* Author: Will Hedgecock
|
* Author: Will Hedgecock
|
||||||
*
|
*
|
||||||
* Copyright (C) 2012-2019 Fazecast, Inc.
|
* Copyright (C) 2012-2019 Fazecast, Inc.
|
||||||
|
@ -66,6 +66,9 @@ jfieldID parityField;
|
||||||
jfieldID flowControlField;
|
jfieldID flowControlField;
|
||||||
jfieldID sendDeviceQueueSizeField;
|
jfieldID sendDeviceQueueSizeField;
|
||||||
jfieldID receiveDeviceQueueSizeField;
|
jfieldID receiveDeviceQueueSizeField;
|
||||||
|
jfieldID rs485ModeField;
|
||||||
|
jfieldID rs485DelayBeforeField;
|
||||||
|
jfieldID rs485DelayAfterField;
|
||||||
jfieldID timeoutModeField;
|
jfieldID timeoutModeField;
|
||||||
jfieldID readTimeoutField;
|
jfieldID readTimeoutField;
|
||||||
jfieldID writeTimeoutField;
|
jfieldID writeTimeoutField;
|
||||||
|
@ -121,6 +124,9 @@ JNIEXPORT void JNICALL Java_com_fazecast_jSerialComm_SerialPort_initializeLibrar
|
||||||
flowControlField = (*env)->GetFieldID(env, serialCommClass, "flowControl", "I");
|
flowControlField = (*env)->GetFieldID(env, serialCommClass, "flowControl", "I");
|
||||||
sendDeviceQueueSizeField = (*env)->GetFieldID(env, serialCommClass, "sendDeviceQueueSize", "I");
|
sendDeviceQueueSizeField = (*env)->GetFieldID(env, serialCommClass, "sendDeviceQueueSize", "I");
|
||||||
receiveDeviceQueueSizeField = (*env)->GetFieldID(env, serialCommClass, "receiveDeviceQueueSize", "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");
|
timeoutModeField = (*env)->GetFieldID(env, serialCommClass, "timeoutMode", "I");
|
||||||
readTimeoutField = (*env)->GetFieldID(env, serialCommClass, "readTimeout", "I");
|
readTimeoutField = (*env)->GetFieldID(env, serialCommClass, "readTimeout", "I");
|
||||||
writeTimeoutField = (*env)->GetFieldID(env, serialCommClass, "writeTimeout", "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 flowControl = (*env)->GetIntField(env, obj, flowControlField);
|
||||||
int sendDeviceQueueSize = (*env)->GetIntField(env, obj, sendDeviceQueueSizeField);
|
int sendDeviceQueueSize = (*env)->GetIntField(env, obj, sendDeviceQueueSizeField);
|
||||||
int receiveDeviceQueueSize = (*env)->GetIntField(env, obj, receiveDeviceQueueSizeField);
|
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 configDisabled = (*env)->GetBooleanField(env, obj, disableConfigField);
|
||||||
|
unsigned char rs485ModeEnabled = (*env)->GetBooleanField(env, obj, rs485ModeField);
|
||||||
unsigned char isDtrEnabled = (*env)->GetBooleanField(env, obj, isDtrEnabledField);
|
unsigned char isDtrEnabled = (*env)->GetBooleanField(env, obj, isDtrEnabledField);
|
||||||
unsigned char isRtsEnabled = (*env)->GetBooleanField(env, obj, isRtsEnabledField);
|
unsigned char isRtsEnabled = (*env)->GetBooleanField(env, obj, isRtsEnabledField);
|
||||||
tcflag_t byteSize = (byteSizeInt == 5) ? CS5 : (byteSizeInt == 6) ? CS6 : (byteSizeInt == 7) ? CS7 : CS8;
|
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);
|
ioctl(serialPortFD, TIOCSSERIAL, &serInfo);
|
||||||
if (baudRateCode == 0)
|
if (baudRateCode == 0)
|
||||||
setBaudRate(serialPortFD, baudRate);
|
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);
|
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)
|
if (numBytesRead == -1)
|
||||||
{
|
{
|
||||||
// Problem reading, close port
|
// Problem reading, close port
|
||||||
while ((close(serialPortFD) == -1) && (errno != EBADF));
|
while (((*env)->GetBooleanField(env, obj, isOpenedField)) && (close(serialPortFD) == -1) && (errno != EBADF));
|
||||||
serialPortFD = -1;
|
serialPortFD = -1;
|
||||||
(*env)->SetLongField(env, obj, serialPortFdField, -1l);
|
(*env)->SetLongField(env, obj, serialPortFdField, -1l);
|
||||||
(*env)->SetBooleanField(env, obj, isOpenedField, JNI_FALSE);
|
(*env)->SetBooleanField(env, obj, isOpenedField, JNI_FALSE);
|
||||||
|
@ -485,7 +507,7 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_readBytes(JNIEnv
|
||||||
if (numBytesRead == -1)
|
if (numBytesRead == -1)
|
||||||
{
|
{
|
||||||
// Problem reading, close port
|
// Problem reading, close port
|
||||||
while ((close(serialPortFD) == -1) && (errno != EBADF));
|
while (((*env)->GetBooleanField(env, obj, isOpenedField)) && (close(serialPortFD) == -1) && (errno != EBADF));
|
||||||
serialPortFD = -1;
|
serialPortFD = -1;
|
||||||
(*env)->SetLongField(env, obj, serialPortFdField, -1l);
|
(*env)->SetLongField(env, obj, serialPortFdField, -1l);
|
||||||
(*env)->SetBooleanField(env, obj, isOpenedField, JNI_FALSE);
|
(*env)->SetBooleanField(env, obj, isOpenedField, JNI_FALSE);
|
||||||
|
@ -508,7 +530,7 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_readBytes(JNIEnv
|
||||||
if (numBytesRead == -1)
|
if (numBytesRead == -1)
|
||||||
{
|
{
|
||||||
// Problem reading, close port
|
// Problem reading, close port
|
||||||
while ((close(serialPortFD) == -1) && (errno != EBADF));
|
while (((*env)->GetBooleanField(env, obj, isOpenedField)) && (close(serialPortFD) == -1) && (errno != EBADF));
|
||||||
serialPortFD = -1;
|
serialPortFD = -1;
|
||||||
(*env)->SetLongField(env, obj, serialPortFdField, -1l);
|
(*env)->SetLongField(env, obj, serialPortFdField, -1l);
|
||||||
(*env)->SetBooleanField(env, obj, isOpenedField, JNI_FALSE);
|
(*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
|
// Problem writing, allow others to open the port and close it ourselves
|
||||||
ioctl(serialPortFD, TIOCNXCL);
|
ioctl(serialPortFD, TIOCNXCL);
|
||||||
ioctl(serialPortFD, TCSBRK, 1);
|
ioctl(serialPortFD, TCSBRK, 1);
|
||||||
while ((close(serialPortFD) == -1) && (errno != EBADF));
|
while (((*env)->GetBooleanField(env, obj, isOpenedField)) && (close(serialPortFD) == -1) && (errno != EBADF));
|
||||||
serialPortFD = -1;
|
serialPortFD = -1;
|
||||||
(*env)->SetLongField(env, obj, serialPortFdField, -1l);
|
(*env)->SetLongField(env, obj, serialPortFdField, -1l);
|
||||||
(*env)->SetBooleanField(env, obj, isOpenedField, JNI_FALSE);
|
(*env)->SetBooleanField(env, obj, isOpenedField, JNI_FALSE);
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* SerialPort_Posix.c
|
* SerialPort_Posix.c
|
||||||
*
|
*
|
||||||
* Created on: Feb 25, 2012
|
* Created on: Feb 25, 2012
|
||||||
* Last Updated on: Apr 15, 2019
|
* Last Updated on: Jul 08, 2019
|
||||||
* Author: Will Hedgecock
|
* Author: Will Hedgecock
|
||||||
*
|
*
|
||||||
* Copyright (C) 2012-2019 Fazecast, Inc.
|
* Copyright (C) 2012-2019 Fazecast, Inc.
|
||||||
|
@ -64,6 +64,9 @@ jfieldID parityField;
|
||||||
jfieldID flowControlField;
|
jfieldID flowControlField;
|
||||||
jfieldID sendDeviceQueueSizeField;
|
jfieldID sendDeviceQueueSizeField;
|
||||||
jfieldID receiveDeviceQueueSizeField;
|
jfieldID receiveDeviceQueueSizeField;
|
||||||
|
jfieldID rs485ModeField;
|
||||||
|
jfieldID rs485DelayBeforeField;
|
||||||
|
jfieldID rs485DelayAfterField;
|
||||||
jfieldID timeoutModeField;
|
jfieldID timeoutModeField;
|
||||||
jfieldID readTimeoutField;
|
jfieldID readTimeoutField;
|
||||||
jfieldID writeTimeoutField;
|
jfieldID writeTimeoutField;
|
||||||
|
@ -225,6 +228,9 @@ JNIEXPORT void JNICALL Java_com_fazecast_jSerialComm_SerialPort_initializeLibrar
|
||||||
flowControlField = (*env)->GetFieldID(env, serialCommClass, "flowControl", "I");
|
flowControlField = (*env)->GetFieldID(env, serialCommClass, "flowControl", "I");
|
||||||
sendDeviceQueueSizeField = (*env)->GetFieldID(env, serialCommClass, "sendDeviceQueueSize", "I");
|
sendDeviceQueueSizeField = (*env)->GetFieldID(env, serialCommClass, "sendDeviceQueueSize", "I");
|
||||||
receiveDeviceQueueSizeField = (*env)->GetFieldID(env, serialCommClass, "receiveDeviceQueueSize", "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");
|
timeoutModeField = (*env)->GetFieldID(env, serialCommClass, "timeoutMode", "I");
|
||||||
readTimeoutField = (*env)->GetFieldID(env, serialCommClass, "readTimeout", "I");
|
readTimeoutField = (*env)->GetFieldID(env, serialCommClass, "readTimeout", "I");
|
||||||
writeTimeoutField = (*env)->GetFieldID(env, serialCommClass, "writeTimeout", "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 flowControl = (*env)->GetIntField(env, obj, flowControlField);
|
||||||
int sendDeviceQueueSize = (*env)->GetIntField(env, obj, sendDeviceQueueSizeField);
|
int sendDeviceQueueSize = (*env)->GetIntField(env, obj, sendDeviceQueueSizeField);
|
||||||
int receiveDeviceQueueSize = (*env)->GetIntField(env, obj, receiveDeviceQueueSizeField);
|
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 configDisabled = (*env)->GetBooleanField(env, obj, disableConfigField);
|
||||||
|
unsigned char rs485ModeEnabled = (*env)->GetBooleanField(env, obj, rs485ModeField);
|
||||||
unsigned char isDtrEnabled = (*env)->GetBooleanField(env, obj, isDtrEnabledField);
|
unsigned char isDtrEnabled = (*env)->GetBooleanField(env, obj, isDtrEnabledField);
|
||||||
unsigned char isRtsEnabled = (*env)->GetBooleanField(env, obj, isRtsEnabledField);
|
unsigned char isRtsEnabled = (*env)->GetBooleanField(env, obj, isRtsEnabledField);
|
||||||
tcflag_t byteSize = (byteSizeInt == 5) ? CS5 : (byteSizeInt == 6) ? CS6 : (byteSizeInt == 7) ? CS7 : CS8;
|
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
|
// Attempt to set the transmit buffer size and any necessary custom baud rates
|
||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
struct serial_struct serInfo;
|
struct serial_struct serInfo;
|
||||||
int ioctlRetVal = ioctl(serialPortFD, TIOCGSERIAL, &serInfo);
|
if (ioctl(serialPortFD, TIOCGSERIAL, &serInfo) == 0)
|
||||||
if (ioctlRetVal == 0)
|
|
||||||
{
|
{
|
||||||
serInfo.xmit_fifo_size = sendDeviceQueueSize;
|
serInfo.xmit_fifo_size = sendDeviceQueueSize;
|
||||||
ioctl(serialPortFD, TIOCSSERIAL, &serInfo);
|
ioctl(serialPortFD, TIOCSSERIAL, &serInfo);
|
||||||
|
@ -356,6 +364,21 @@ JNIEXPORT jboolean JNICALL Java_com_fazecast_jSerialComm_SerialPort_configPort(J
|
||||||
#endif
|
#endif
|
||||||
if (nonStandardBaudRate)
|
if (nonStandardBaudRate)
|
||||||
setBaudRateCustom(serialPortFD, baudRate);
|
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);
|
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
|
// Problem reading, allow others to open the port and close it ourselves
|
||||||
ioctl(serialPortFD, TIOCNXCL);
|
ioctl(serialPortFD, TIOCNXCL);
|
||||||
tcdrain(serialPortFD);
|
tcdrain(serialPortFD);
|
||||||
while ((close(serialPortFD) == -1) && (errno != EBADF));
|
while (((*env)->GetBooleanField(env, obj, isOpenedField)) && (close(serialPortFD) == -1) && (errno != EBADF));
|
||||||
serialPortFD = -1;
|
serialPortFD = -1;
|
||||||
(*env)->SetLongField(env, obj, serialPortFdField, -1l);
|
(*env)->SetLongField(env, obj, serialPortFdField, -1l);
|
||||||
(*env)->SetBooleanField(env, obj, isOpenedField, JNI_FALSE);
|
(*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
|
// Problem reading, allow others to open the port and close it ourselves
|
||||||
ioctl(serialPortFD, TIOCNXCL);
|
ioctl(serialPortFD, TIOCNXCL);
|
||||||
tcdrain(serialPortFD);
|
tcdrain(serialPortFD);
|
||||||
while ((close(serialPortFD) == -1) && (errno != EBADF));
|
while (((*env)->GetBooleanField(env, obj, isOpenedField)) && (close(serialPortFD) == -1) && (errno != EBADF));
|
||||||
serialPortFD = -1;
|
serialPortFD = -1;
|
||||||
(*env)->SetLongField(env, obj, serialPortFdField, -1l);
|
(*env)->SetLongField(env, obj, serialPortFdField, -1l);
|
||||||
(*env)->SetBooleanField(env, obj, isOpenedField, JNI_FALSE);
|
(*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
|
// Problem reading, allow others to open the port and close it ourselves
|
||||||
ioctl(serialPortFD, TIOCNXCL);
|
ioctl(serialPortFD, TIOCNXCL);
|
||||||
tcdrain(serialPortFD);
|
tcdrain(serialPortFD);
|
||||||
while ((close(serialPortFD) == -1) && (errno != EBADF));
|
while (((*env)->GetBooleanField(env, obj, isOpenedField)) && (close(serialPortFD) == -1) && (errno != EBADF));
|
||||||
serialPortFD = -1;
|
serialPortFD = -1;
|
||||||
(*env)->SetLongField(env, obj, serialPortFdField, -1l);
|
(*env)->SetLongField(env, obj, serialPortFdField, -1l);
|
||||||
(*env)->SetBooleanField(env, obj, isOpenedField, JNI_FALSE);
|
(*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
|
// Problem writing, allow others to open the port and close it ourselves
|
||||||
ioctl(serialPortFD, TIOCNXCL);
|
ioctl(serialPortFD, TIOCNXCL);
|
||||||
tcdrain(serialPortFD);
|
tcdrain(serialPortFD);
|
||||||
while ((close(serialPortFD) == -1) && (errno != EBADF));
|
while (((*env)->GetBooleanField(env, obj, isOpenedField)) && (close(serialPortFD) == -1) && (errno != EBADF));
|
||||||
serialPortFD = -1;
|
serialPortFD = -1;
|
||||||
(*env)->SetLongField(env, obj, serialPortFdField, -1l);
|
(*env)->SetLongField(env, obj, serialPortFdField, -1l);
|
||||||
(*env)->SetBooleanField(env, obj, isOpenedField, JNI_FALSE);
|
(*env)->SetBooleanField(env, obj, isOpenedField, JNI_FALSE);
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* SerialPort_Windows.c
|
* SerialPort_Windows.c
|
||||||
*
|
*
|
||||||
* Created on: Feb 25, 2012
|
* Created on: Feb 25, 2012
|
||||||
* Last Updated on: Mar 07, 2019
|
* Last Updated on: Jul 08, 2019
|
||||||
* Author: Will Hedgecock
|
* Author: Will Hedgecock
|
||||||
*
|
*
|
||||||
* Copyright (C) 2012-2019 Fazecast, Inc.
|
* Copyright (C) 2012-2019 Fazecast, Inc.
|
||||||
|
@ -57,6 +57,9 @@ jfieldID parityField;
|
||||||
jfieldID flowControlField;
|
jfieldID flowControlField;
|
||||||
jfieldID sendDeviceQueueSizeField;
|
jfieldID sendDeviceQueueSizeField;
|
||||||
jfieldID receiveDeviceQueueSizeField;
|
jfieldID receiveDeviceQueueSizeField;
|
||||||
|
jfieldID rs485ModeField;
|
||||||
|
jfieldID rs485DelayBeforeField;
|
||||||
|
jfieldID rs485DelayAfterField;
|
||||||
jfieldID timeoutModeField;
|
jfieldID timeoutModeField;
|
||||||
jfieldID readTimeoutField;
|
jfieldID readTimeoutField;
|
||||||
jfieldID writeTimeoutField;
|
jfieldID writeTimeoutField;
|
||||||
|
@ -358,6 +361,9 @@ JNIEXPORT void JNICALL Java_com_fazecast_jSerialComm_SerialPort_initializeLibrar
|
||||||
flowControlField = env->GetFieldID(serialCommClass, "flowControl", "I");
|
flowControlField = env->GetFieldID(serialCommClass, "flowControl", "I");
|
||||||
sendDeviceQueueSizeField = env->GetFieldID(serialCommClass, "sendDeviceQueueSize", "I");
|
sendDeviceQueueSizeField = env->GetFieldID(serialCommClass, "sendDeviceQueueSize", "I");
|
||||||
receiveDeviceQueueSizeField = env->GetFieldID(serialCommClass, "receiveDeviceQueueSize", "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");
|
timeoutModeField = env->GetFieldID(serialCommClass, "timeoutMode", "I");
|
||||||
readTimeoutField = env->GetFieldID(serialCommClass, "readTimeout", "I");
|
readTimeoutField = env->GetFieldID(serialCommClass, "readTimeout", "I");
|
||||||
writeTimeoutField = env->GetFieldID(serialCommClass, "writeTimeout", "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 sendDeviceQueueSize = (DWORD)env->GetIntField(obj, sendDeviceQueueSizeField);
|
||||||
DWORD receiveDeviceQueueSize = (DWORD)env->GetIntField(obj, receiveDeviceQueueSizeField);
|
DWORD receiveDeviceQueueSize = (DWORD)env->GetIntField(obj, receiveDeviceQueueSizeField);
|
||||||
BYTE configDisabled = (BYTE)env->GetBooleanField(obj, disableConfigField);
|
BYTE configDisabled = (BYTE)env->GetBooleanField(obj, disableConfigField);
|
||||||
|
BYTE rs485ModeEnabled = (BYTE)env->GetBooleanField(obj, rs485ModeField);
|
||||||
BYTE isDtrEnabled = env->GetBooleanField(obj, isDtrEnabledField);
|
BYTE isDtrEnabled = env->GetBooleanField(obj, isDtrEnabledField);
|
||||||
BYTE isRtsEnabled = env->GetBooleanField(obj, isRtsEnabledField);
|
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;
|
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) ||
|
BOOL DSREnabled = (((flowControl & com_fazecast_jSerialComm_SerialPort_FLOW_CONTROL_DSR_ENABLED) > 0) ||
|
||||||
((flowControl & com_fazecast_jSerialComm_SerialPort_FLOW_CONTROL_DTR_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 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 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);
|
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
|
// Problem reading, close port
|
||||||
int numRetries = 10;
|
int numRetries = 10;
|
||||||
PurgeComm(serialPortHandle, PURGE_RXABORT | PURGE_RXCLEAR | PURGE_TXABORT | PURGE_TXCLEAR);
|
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;
|
serialPortHandle = INVALID_HANDLE_VALUE;
|
||||||
env->SetLongField(obj, serialPortHandleField, -1l);
|
env->SetLongField(obj, serialPortHandleField, -1l);
|
||||||
env->SetBooleanField(obj, isOpenedField, JNI_FALSE);
|
env->SetBooleanField(obj, isOpenedField, JNI_FALSE);
|
||||||
|
@ -674,7 +682,7 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_readBytes(JNIEnv
|
||||||
// Problem reading, close port
|
// Problem reading, close port
|
||||||
int numRetries = 10;
|
int numRetries = 10;
|
||||||
PurgeComm(serialPortHandle, PURGE_RXABORT | PURGE_RXCLEAR | PURGE_TXABORT | PURGE_TXCLEAR);
|
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;
|
serialPortHandle = INVALID_HANDLE_VALUE;
|
||||||
env->SetLongField(obj, serialPortHandleField, -1l);
|
env->SetLongField(obj, serialPortHandleField, -1l);
|
||||||
env->SetBooleanField(obj, isOpenedField, JNI_FALSE);
|
env->SetBooleanField(obj, isOpenedField, JNI_FALSE);
|
||||||
|
@ -684,7 +692,7 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_readBytes(JNIEnv
|
||||||
// Problem reading, close port
|
// Problem reading, close port
|
||||||
int numRetries = 10;
|
int numRetries = 10;
|
||||||
PurgeComm(serialPortHandle, PURGE_RXABORT | PURGE_RXCLEAR | PURGE_TXABORT | PURGE_TXCLEAR);
|
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;
|
serialPortHandle = INVALID_HANDLE_VALUE;
|
||||||
env->SetLongField(obj, serialPortHandleField, -1l);
|
env->SetLongField(obj, serialPortHandleField, -1l);
|
||||||
env->SetBooleanField(obj, isOpenedField, JNI_FALSE);
|
env->SetBooleanField(obj, isOpenedField, JNI_FALSE);
|
||||||
|
@ -725,7 +733,7 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_writeBytes(JNIEn
|
||||||
// Problem writing, close port
|
// Problem writing, close port
|
||||||
int numRetries = 10;
|
int numRetries = 10;
|
||||||
PurgeComm(serialPortHandle, PURGE_RXABORT | PURGE_RXCLEAR | PURGE_TXABORT | PURGE_TXCLEAR);
|
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;
|
serialPortHandle = INVALID_HANDLE_VALUE;
|
||||||
env->SetLongField(obj, serialPortHandleField, -1l);
|
env->SetLongField(obj, serialPortHandleField, -1l);
|
||||||
env->SetBooleanField(obj, isOpenedField, JNI_FALSE);
|
env->SetBooleanField(obj, isOpenedField, JNI_FALSE);
|
||||||
|
@ -735,7 +743,7 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_writeBytes(JNIEn
|
||||||
// Problem reading, close port
|
// Problem reading, close port
|
||||||
int numRetries = 10;
|
int numRetries = 10;
|
||||||
PurgeComm(serialPortHandle, PURGE_RXABORT | PURGE_RXCLEAR | PURGE_TXABORT | PURGE_TXCLEAR);
|
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;
|
serialPortHandle = INVALID_HANDLE_VALUE;
|
||||||
env->SetLongField(obj, serialPortHandleField, -1l);
|
env->SetLongField(obj, serialPortHandleField, -1l);
|
||||||
env->SetBooleanField(obj, isOpenedField, JNI_FALSE);
|
env->SetBooleanField(obj, isOpenedField, JNI_FALSE);
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* SerialPort.java
|
* SerialPort.java
|
||||||
*
|
*
|
||||||
* Created on: Feb 25, 2012
|
* Created on: Feb 25, 2012
|
||||||
* Last Updated on: Apr 15, 2019
|
* Last Updated on: Jul 08, 2019
|
||||||
* Author: Will Hedgecock
|
* Author: Will Hedgecock
|
||||||
*
|
*
|
||||||
* Copyright (C) 2012-2019 Fazecast, Inc.
|
* 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 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 timeoutMode = TIMEOUT_NONBLOCKING, readTimeout = 0, writeTimeout = 0, flowControl = 0;
|
||||||
private volatile int sendDeviceQueueSize = 4096, receiveDeviceQueueSize = 4096;
|
private volatile int sendDeviceQueueSize = 4096, receiveDeviceQueueSize = 4096;
|
||||||
|
private volatile int rs485DelayBefore = 0, rs485DelayAfter = 0;
|
||||||
private volatile SerialPortInputStream inputStream = null;
|
private volatile SerialPortInputStream inputStream = null;
|
||||||
private volatile SerialPortOutputStream outputStream = null;
|
private volatile SerialPortOutputStream outputStream = null;
|
||||||
private volatile SerialPortDataListener userDataListener = null;
|
private volatile SerialPortDataListener userDataListener = null;
|
||||||
private volatile SerialPortEventListener serialEventListener = null;
|
private volatile SerialPortEventListener serialEventListener = null;
|
||||||
private volatile String comPort, friendlyName, portDescription;
|
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.
|
* 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.
|
||||||
|
* <p>
|
||||||
|
* Allows the user to set all port parameters with a single function call.
|
||||||
|
* <p>
|
||||||
|
* 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.
|
||||||
|
* <p>
|
||||||
|
* 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}).
|
||||||
|
* <p>
|
||||||
|
* 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}.
|
||||||
|
* <p>
|
||||||
|
* 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.
|
* Sets the serial port read and write timeout parameters.
|
||||||
* <p>
|
* <p>
|
||||||
|
@ -1014,6 +1063,33 @@ public final class SerialPort
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets whether to enable RS-485 mode for this device.
|
||||||
|
* <p>
|
||||||
|
* 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.
|
||||||
|
* <p>
|
||||||
|
* 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.
|
* Gets a descriptive string representing this serial port or the device connected to it.
|
||||||
* <p>
|
* <p>
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue