cancel
Showing results for 
Search instead for 
Did you mean: 

Nucleo-F411RE and dev/ttyS3 communication

Max75
Associate II

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;
    
}

 

11 REPLIES 11

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... 

Max75
Associate II

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...