diff options
| -rw-r--r-- | src/serial.c | 37 |
1 files changed, 16 insertions, 21 deletions
diff --git a/src/serial.c b/src/serial.c index a50c30c..0bcaf2d 100644 --- a/src/serial.c +++ b/src/serial.c @@ -5,6 +5,7 @@ #include <string.h> #include <termios.h> #include <time.h> +#include <unistd.h> #define BUFFER_SIZE sizeof(char) * 256 @@ -35,15 +36,14 @@ int openSerialPort(char pathToPort[]) { /* serialTerminal.c_lflag &= ~(ECHO | ECHONL | NOFLSH | ISIG | TOSTOP | ICANON | IEXTEN | ECHOE | ECHOK); */ - serialTerminal.c_lflag |= ICANON; - serialTerminal.c_lflag &= ~(ISIG | ECHO | ECHONL | ECHOE | ECHOK); + serialTerminal.c_lflag &= ~(ICANON | ISIG | ECHO | ECHONL | ECHOE | ECHOK); /* serialTerminal.c_oflag &= ~(OLCUC | OCRNL | OPOST | OFILL | ONLCR | ONOCR | ONLRET | OFDEL); */ serialTerminal.c_oflag &= ~(OPOST); - serialTerminal.c_cc[VTIME] = 50; - serialTerminal.c_cc[VMIN] = 1; + serialTerminal.c_cc[VTIME] = 2; + serialTerminal.c_cc[VMIN] = 0; cfsetispeed(&serialTerminal, B115200); cfsetospeed(&serialTerminal, B115200); @@ -61,16 +61,15 @@ int querySerialPort(char **output, int serialPort, char *input) { time_t timeStart; unsigned long idx; - int bytesRead, returnCode, isEnd, - bufferSize = BUFFER_SIZE; /* initial size in bytes */ - char *bufferCurrentPtr, *txBuffer, *buffer = malloc(BUFFER_SIZE); + int bytesRead, returnCode, isEnd, beforeLength; + char *txBuffer, *buffer = malloc(BUFFER_SIZE); const char *responseCodes[8] = {"\r\nOK\r\n", "\r\nCONNECT\r\n", "\r\nRING\r\n", "\r\nNO CARRIER\r\n", "\r\nERROR\r\n", "\r\nNO DIALTONE\r\n", "\r\nBUSY\r\n", "\r\nNO ANSWER\r\n"}; txBuffer = malloc(sizeof(char) * (strlen(input) + 2)); - strncpy(txBuffer, input, sizeof(char) * (strlen(input) + 1)); + strcpy(txBuffer, input); strncat(txBuffer, "\r", 2 * sizeof(char)); if (write(serialPort, txBuffer, sizeof(char) * (strlen(txBuffer))) < 0) { printf("Error write(): %s\n", strerror(errno)); @@ -80,29 +79,27 @@ int querySerialPort(char **output, int serialPort, char *input) { } free(txBuffer); + *output = realloc(*output, sizeof(char)); + **output = '\0'; bytesRead = 0; returnCode = isEnd = 0; - bufferCurrentPtr = buffer; timeStart = time(NULL); while (!isEnd) { - bytesRead = read(serialPort, bufferCurrentPtr, bufferSize); + bytesRead = read(serialPort, buffer, BUFFER_SIZE); if (bytesRead < 0) { printf("Error reading serial port\n"); returnCode = 1; break; - } else if (buffer[bytesRead] != '\n' && bytesRead == bufferSize) { - bufferSize += BUFFER_SIZE; - buffer = realloc(buffer, bufferSize); } - bufferCurrentPtr += bytesRead; - if (bytesRead > 0) { - *bufferCurrentPtr = '\0'; - + beforeLength = strlen(*output); + *output = realloc(*output, sizeof(char) * (beforeLength + 1) + bytesRead); + memcpy(*output + beforeLength, buffer, bytesRead); + (*output)[beforeLength + (bytesRead / sizeof(char))] = '\0'; for (idx = 0; idx < sizeof(responseCodes) / sizeof(*responseCodes); idx++) { - if (strstr(buffer, responseCodes[idx])) { + if (strstr(*output, responseCodes[idx])) { isEnd = 1; break; } @@ -114,8 +111,6 @@ int querySerialPort(char **output, int serialPort, char *input) { } } - *output = realloc(*output, sizeof(char) * (strlen(buffer) + 1)); - strncpy(*output, buffer, sizeof(char) * (strlen(buffer) + 1)); free(buffer); return returnCode; -}
\ No newline at end of file +} |
