M
@Arun-Kapur I don't see any problem with the C code I have pointed you to.
I have personally tested the C code to work as expected on my Omega2+ for UART1 on 115200 Baud (8N1 standard config, non-blocking).The receiving side is a USB-Serial converter on my Windows 10 system. Connections are already listed in the documentation (GND, RX1, TX1).
Code below.
#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
int
set_interface_attribs (int fd, int speed, int parity)
{
struct termios tty;
memset (&tty, 0, sizeof tty);
if (tcgetattr (fd, &tty) != 0)
{
fprintf (stderr, "error %d from tcgetattr", errno);
return -1;
}
cfsetospeed (&tty, speed);
cfsetispeed (&tty, speed);
tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8; // 8-bit chars
// disable IGNBRK for mismatched speed tests; otherwise receive break
// as \000 chars
tty.c_iflag &= ~IGNBRK; // disable break processing
tty.c_lflag = 0; // no signaling chars, no echo,
// no canonical processing
tty.c_oflag = 0; // no remapping, no delays
tty.c_cc[VMIN] = 0; // read doesn't block
tty.c_cc[VTIME] = 5; // 0.5 seconds read timeout
tty.c_iflag &= ~(IXON | IXOFF | IXANY); // shut off xon/xoff ctrl
tty.c_cflag |= (CLOCAL | CREAD);// ignore modem controls,
// enable reading
tty.c_cflag &= ~(PARENB | PARODD); // shut off parity
tty.c_cflag |= parity;
tty.c_cflag &= ~CSTOPB;
tty.c_cflag &= ~CRTSCTS;
if (tcsetattr (fd, TCSANOW, &tty) != 0)
{
fprintf (stderr, "error %d from tcsetattr", errno);
return -1;
}
return 0;
}
void
set_blocking (int fd, int should_block)
{
struct termios tty;
memset (&tty, 0, sizeof tty);
if (tcgetattr (fd, &tty) != 0)
{
fprintf (stderr, "error %d from tggetattr", errno);
return;
}
tty.c_cc[VMIN] = should_block ? 1 : 0;
tty.c_cc[VTIME] = 5; // 0.5 seconds read timeout
if (tcsetattr (fd, TCSANOW, &tty) != 0)
fprintf (stderr, "error %d setting term attributes", errno);
}
/* use omega UART1 */
const char *portname = "/dev/ttyS1";
int uartFd = -1;
void uart_writestr(const char* string) {
write(uartFd, string, strlen(string));
}
void uart_write(void* data, size_t len) {
write(uartFd, data, len);
}
ssize_t uart_read(void* buffer, size_t charsToRead) {
return read(uartFd, buffer, charsToRead);
}
int uart_open(const char* port, int baud, int blocking) {
uartFd = open (port, O_RDWR | O_NOCTTY | O_SYNC);
if (uartFd < 0)
{
fprintf (stderr, "error %d opening %s: %s", errno, port, strerror (errno));
return -1;
}
set_interface_attribs (uartFd, baud, 0); // set speed, 8n1 (no parity)
set_blocking (uartFd, blocking); //set blocking mode
printf("Port %s opened.\n", port);
return 1;
}
int main(int argc, char* argv[] ) {
if(!uart_open(portname, B115200, 0))
return -1;
for(int i = 0; i < 10; i++) {
printf("[+] Writing string to UART.\n");
uart_writestr("Hello world!\n");
usleep(1000 * 1000);
}
return 0;
}