2025-04-17 10:59 AM - edited 2025-04-17 11:05 AM
Hello !
My Nucleo-F411RE board is visible in Cygwin as dev/ttyS3. I try to send message "Hello !" to Nucleo and receive answer from it, but inside the code I found in the internet, the functions tcgetattr() and tggetattr() return the error Invalid argument. How to fix this ?
I give the code below...
#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>
#include <stdio.h>
int set_interface_attribs (int fd, int speed, int parity)
{
struct termios tty;
if (tcgetattr (fd, &tty) != 0)
{
perror("error from tcgetattr\r\n");
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)
{
perror("error from tcsetattr\r\n");
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)
{
perror("error from tggetattr\r\n");
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)
perror("error setting term attributes\r\n");
}
int main(void)
{
char *portname = "dev/ttyS3";
int fd = open (portname, O_RDWR | O_NOCTTY | O_SYNC);
if (fd < 0)
{
perror("error opening port\r\n");
return 0;
}
set_interface_attribs (fd, B9600, 0); // set speed to 9,600 bps, 8n1 (no parity)
set_blocking (fd, 0); // set no blocking
write (fd, "hello!\n", 7); // send 7 character greeting
usleep ((7 + 25) * 100); // sleep enough to transmit the 7 plus
// receive 25: approx 100 uS per char transmit
char buf [100];
read (fd, buf, sizeof buf); // read up to 100 characters if ready to read
printf("%s\r\n", buf);
return 0;
}
2025-04-19 2:24 AM - edited 2025-04-19 2:30 AM
No, receiving end is linux code on laptop, and sending end is Nucleo. Into CubeIDE I haven't any problem to working with code...
In my case, enough to send from Nucleo to laptop, I don't need to think receive data in Nucleo. Working simplest, yes ? :) Minimum on this stage...
2025-04-20 10:15 AM
Hmm... I think I was wrong. In order to receive data stream on the laptop, I need to send back some kind of confirmation that previous portion of data was successful. But garbage comes from the laptop to the Nucleo board. I'm still racking my brains over this...