summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorkutayboz <kutayboz@gmail.com>2023-06-06 20:04:17 +0300
committerkutayboz <kutayboz@gmail.com>2023-06-06 20:04:17 +0300
commit8ca671f6f056415072d752f9df5637abb4586799 (patch)
tree36ff6ec6f0a038da35c4712ba0b1d26a3b50449b /src
parente3460fb4598cc1460d6c6c7e48ccebaec6b4b119 (diff)
downloadcelnetmon-8ca671f6f056415072d752f9df5637abb4586799.tar.gz
Serial comm functional
Diffstat (limited to 'src')
-rw-r--r--src/serial.c37
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
+}