UART_clay/include/uart_func.c

79 lines
2.5 KiB
C
Raw Normal View History

2025-10-14 19:37:46 +03:00
#ifndef UART_CLAY_UART_FUNC_H
#define UART_CLAY_UART_FUNC_H
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>
#include "clay.h"
bool UART_modal_show = false;
typedef struct {
int serial_port;
Clay_String buffer;
} uart_data;
static void trim_message(const Clay_String message, const size_t length) {
memset((void *)message.chars + length - 2, 0, message.length - length + 2);
}
int open_uart_port(const char *file_path) {
const int serial_port = open(file_path, O_RDWR);
if (serial_port < 0) {
printf("Error %i from open: %s\n", errno, strerror(errno));
return -1;
}
struct termios tty;
if (tcgetattr(serial_port, &tty) < 0) {
printf("Error %i from tcgetattr: %s\n", errno, strerror(errno));
return -1;
}
tty.c_cflag &= ~PARENB; // Clear parity bit, disabling parity
tty.c_cflag &= ~CSTOPB; // Clear stop field, only one stop bit used in communication
tty.c_cflag &= ~CSIZE; // Clear all the size bits
tty.c_cflag |= CS8; // 8 bits per byte
tty.c_cflag &= ~CRTSCTS; // Disable RTS/CTS hardware flow control
tty.c_cflag |= CREAD | CLOCAL; // Turn on READ & ignore ctrl lines (CLOCAL = 1)
tty.c_lflag &= ~ICANON; // Non-canonical mode
tty.c_lflag &= ~ECHO; // Disable echo
tty.c_lflag &= ~ECHOE; // Disable erasure
tty.c_lflag &= ~ECHONL; // Disable new-line echo
tty.c_lflag &= ~ISIG; // Disable interpretation of INTR, QUIT and SUSP
tty.c_iflag &= ~(IXON | IXOFF | IXANY); // Turn off s/w flow ctrl
tty.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL);
// Disable any special handling of received bytes
tty.c_oflag &= ~OPOST; // Prevent special interpretation of output bytes (e.g. newline chars)
tty.c_oflag &= ~ONLCR; // Prevent conversion of newline to carriage return/line feed
tty.c_cc[VTIME] = 0;
tty.c_cc[VMIN] = 1;
// Set baud rate to be 9600
cfsetspeed(&tty, B9600);
// Save tty settings, also checking for error
if (tcsetattr(serial_port, TCSANOW, &tty) != 0) {
printf("Can't set fd state. Error %d, %s", errno, strerror(errno));
return -1;
}
return serial_port;
}
void handle_uart(const uart_data *data, const char msg, const int response_length) {
write(data->serial_port, &msg, 1);
memset((void *)data->buffer.chars, 0, data->buffer.length);
read(data->serial_port, (void *)data->buffer.chars, response_length);
}
#endif //UART_CLAY_UART_FUNC_H