diff --git a/src/main/c/Linux/LinuxHelperFunctions.c b/src/main/c/Linux/LinuxHelperFunctions.c index 5f2acd5..3daa89b 100644 --- a/src/main/c/Linux/LinuxHelperFunctions.c +++ b/src/main/c/Linux/LinuxHelperFunctions.c @@ -53,6 +53,15 @@ void push_back(struct charPairVector* vector, const char* firstString, const cha strcpy(vector->second[vector->length-1], secondString); } +char keyExists(struct charPairVector* vector, const char* key) +{ + size_t i; + for (i = 0; i < vector->length; ++i) + if (strcmp(key, vector->first[i]) == 0) + return 1; + return 0; +} + void getFriendlyName(const char* productFile, char* friendlyName) { int friendlyNameLength = 0; @@ -201,6 +210,47 @@ void recursiveSearchForComPorts(charPairVector* comPorts, const char* fullPathTo closedir(directoryIterator); } +void lastDitchSearchForComPorts(charPairVector* comPorts) +{ + // Open the linux dev directory + DIR *directoryIterator = opendir("/dev/"); + if (!directoryIterator) + return; + + // Read all files in the current directory + struct dirent *directoryEntry = readdir(directoryIterator); + while (directoryEntry) + { + // See if the file names a potential serial port + if ((strlen(directoryEntry->d_name) >= 6) && (directoryEntry->d_name[0] == 't') && (directoryEntry->d_name[1] == 't') && (directoryEntry->d_name[2] == 'y') && + (((directoryEntry->d_name[3] == 'A') && (directoryEntry->d_name[4] == 'M') && (directoryEntry->d_name[5] == 'A')) || + ((directoryEntry->d_name[3] == 'A') && (directoryEntry->d_name[4] == 'C') && (directoryEntry->d_name[5] == 'M')) || + ((directoryEntry->d_name[3] == 'U') && (directoryEntry->d_name[4] == 'S') && (directoryEntry->d_name[5] == 'B')))) + { + // Determine system name of port + char* systemName = (char*)malloc(256); + strcpy(systemName, "/dev/"); + strcat(systemName, directoryEntry->d_name); + + // Set static friendly name + char* friendlyName = (char*)malloc(256); + strcpy(friendlyName, "USB-Based Serial Port"); + + // Determine if port is already in the list, and add it if not + if (!keyExists(comPorts, systemName)) + push_back(comPorts, systemName, friendlyName); + + // Clean up memory + free(systemName); + free(friendlyName); + } + directoryEntry = readdir(directoryIterator); + } + + // Close the directory + closedir(directoryIterator); +} + unsigned int getBaudRateCode(int baudRate) { switch (baudRate) diff --git a/src/main/c/Linux/LinuxHelperFunctions.h b/src/main/c/Linux/LinuxHelperFunctions.h index e92ad5a..aa2ebfd 100644 --- a/src/main/c/Linux/LinuxHelperFunctions.h +++ b/src/main/c/Linux/LinuxHelperFunctions.h @@ -32,9 +32,11 @@ typedef struct charPairVector size_t length; } charPairVector; void push_back(struct charPairVector* vector, const char* firstString, const char* secondString); +char keyExists(struct charPairVector* vector, const char* key); void getDriverName(const char* directoryToSearch, char* friendlyName); void recursiveSearchForComPorts(charPairVector* comPorts, const char* fullPathToSearch); +void lastDitchSearchForComPorts(charPairVector* comPorts); void getFriendlyName(const char* productFile, char* friendlyName); unsigned int getBaudRateCode(int baudRate); void setBaudRate(int portFD, int baudRate); diff --git a/src/main/c/Linux/SerialPort_Linux.c b/src/main/c/Linux/SerialPort_Linux.c index 338f6a6..f55675a 100644 --- a/src/main/c/Linux/SerialPort_Linux.c +++ b/src/main/c/Linux/SerialPort_Linux.c @@ -61,6 +61,7 @@ JNIEXPORT jobjectArray JNICALL Java_com_fazecast_jSerialComm_SerialPort_getCommP // Enumerate serial ports on machine charPairVector serialPorts = { (char**)malloc(1), (char**)malloc(1), 0 }; recursiveSearchForComPorts(&serialPorts, "/sys/devices/"); + lastDitchSearchForComPorts(&serialPorts); jobjectArray arrayObject = (*env)->NewObjectArray(env, serialPorts.length, serialCommClass, 0); int i; for (i = 0; i < serialPorts.length; ++i) @@ -317,7 +318,8 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_waitForEvent(JNI FD_SET(serialPortFD, &waitingSet); // Wait for a serial port event - int retVal = select(serialPortFD + 1, &waitingSet, NULL, NULL, &timeout); + int retVal; + do { retVal = select(serialPortFD + 1, &waitingSet, NULL, NULL, &timeout); } while ((retVal < 0) && (errno == EINTR)); if (retVal <= 0) return 0; return (FD_ISSET(serialPortFD, &waitingSet)) ? com_fazecast_jSerialComm_SerialPort_LISTENING_EVENT_DATA_AVAILABLE : 0; @@ -361,7 +363,8 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_readBytes(JNIEnv // While there are more bytes we are supposed to read while (bytesRemaining > 0) { - if ((numBytesRead = read(serialPortFD, readBuffer+numBytesReadTotal, bytesRemaining)) == -1) + do { numBytesRead = read(serialPortFD, readBuffer+numBytesReadTotal, bytesRemaining); } while ((numBytesRead < 0) && (errno == EINTR)); + if (numBytesRead == -1) { // Problem reading, close port close(serialPortFD); @@ -391,7 +394,8 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_readBytes(JNIEnv // While there are more bytes we are supposed to read and the timeout has not elapsed do { - if ((numBytesRead = read(serialPortFD, readBuffer+numBytesReadTotal, bytesRemaining)) == -1) + do { numBytesRead = read(serialPortFD, readBuffer+numBytesReadTotal, bytesRemaining); } while ((numBytesRead < 0) && (errno == EINTR)); + if (numBytesRead == -1) { // Problem reading, close port close(serialPortFD); @@ -413,7 +417,8 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_readBytes(JNIEnv else // Semi- or non-blocking specified { // Read from port - if ((numBytesRead = read(serialPortFD, readBuffer, bytesToRead)) == -1) + do { numBytesRead = read(serialPortFD, readBuffer, bytesToRead); } while ((numBytesRead < 0) && (errno == EINTR)); + if (numBytesRead == -1) { // Problem reading, close port close(serialPortFD); @@ -436,10 +441,11 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_writeBytes(JNIEn if (serialPortFD <= 0) return -1; jbyte *writeBuffer = (*env)->GetByteArrayElements(env, buffer, 0); - int numBytesWritten; + int numBytesWritten, result = 0; // Write to port - if ((numBytesWritten = write(serialPortFD, writeBuffer, bytesToWrite)) == -1) + do { numBytesWritten = write(serialPortFD, writeBuffer, bytesToWrite); } while ((numBytesWritten < 0) && (errno == EINTR)); + if (numBytesWritten == -1) { // Problem writing, close port close(serialPortFD); diff --git a/src/main/c/OSX/SerialPort_OSX.c b/src/main/c/OSX/SerialPort_OSX.c index c442dc2..10d5c8b 100644 --- a/src/main/c/OSX/SerialPort_OSX.c +++ b/src/main/c/OSX/SerialPort_OSX.c @@ -356,7 +356,8 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_waitForEvent(JNI FD_SET(serialPortFD, &waitingSet); // Wait for a serial port event - int retVal = select(serialPortFD + 1, &waitingSet, NULL, NULL, &timeout); + int retVal; + do { retVal = select(serialPortFD + 1, &waitingSet, NULL, NULL, &timeout); } while ((retVal < 0) && (errno == EINTR)); if (retVal <= 0) return 0; return (FD_ISSET(serialPortFD, &waitingSet)) ? com_fazecast_jSerialComm_SerialPort_LISTENING_EVENT_DATA_AVAILABLE : 0; @@ -401,7 +402,8 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_readBytes(JNIEnv // While there are more bytes we are supposed to read while (bytesRemaining > 0) { - if ((numBytesRead = read(serialPortFD, readBuffer+numBytesReadTotal, bytesRemaining)) == -1) + do { numBytesRead = read(serialPortFD, readBuffer+numBytesReadTotal, bytesRemaining); } while ((numBytesRead < 0) && (errno == EINTR)); + if (numBytesRead == -1) { // Problem reading, close port close(serialPortFD); @@ -431,7 +433,8 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_readBytes(JNIEnv // While there are more bytes we are supposed to read and the timeout has not elapsed do { - if ((numBytesRead = read(serialPortFD, readBuffer+numBytesReadTotal, bytesRemaining)) == -1) + do { numBytesRead = read(serialPortFD, readBuffer+numBytesReadTotal, bytesRemaining); } while ((numBytesRead < 0) && (errno == EINTR)); + if (numBytesRead == -1) { // Problem reading, close port close(serialPortFD); @@ -453,7 +456,8 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_readBytes(JNIEnv else // Semi- or non-blocking specified { // Read from port - if ((numBytesRead = read(serialPortFD, readBuffer, bytesToRead)) == -1) + do { numBytesRead = read(serialPortFD, readBuffer, bytesToRead); } while ((numBytesRead < 0) && (errno == EINTR)); + if (numBytesRead == -1) { // Problem reading, close port close(serialPortFD); @@ -479,7 +483,8 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_writeBytes(JNIEn int numBytesWritten; // Write to port - if ((numBytesWritten = write(serialPortFD, writeBuffer, bytesToWrite)) == -1) + do { numBytesWritten = write(serialPortFD, writeBuffer, bytesToWrite); } while ((numBytesWritten < 0) && (errno == EINTR)); + if (numBytesWritten == -1) { // Problem writing, close port close(serialPortFD); diff --git a/src/main/resources/Linux/armv5/libjSerialComm.so b/src/main/resources/Linux/armv5/libjSerialComm.so index 78df79e..e2e97ea 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 c87f9c5..dc42eb8 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 7c43a44..b1f4c2a 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 fefd343..3669a83 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 744b5ac..21d8430 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/x86/libjSerialComm.so b/src/main/resources/Linux/x86/libjSerialComm.so index 313404c..a1d864c 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 49b150e..fd57cde 100644 Binary files a/src/main/resources/Linux/x86_64/libjSerialComm.so and b/src/main/resources/Linux/x86_64/libjSerialComm.so differ