UART to port szeregowy – można go znaleźć na pinout RPi i wykorzystać do połączenia z innym urządzeniem – np. z STM32 lub drugim RPi.
Łączymy w tym celu:
RX – TX
TX – RX
GND – GND (UWAGA! przy różnych zasilaniach obu urządzeń musi być wspólna masa, łączymy je)
(na krzyż). Musimy ustawić wspólną szybkość transmisji (w przykładzie 9600 baud – bezpiecznie, ale można też 115200 lub inne standardowe wartości).
Włączamy transmisję UART w Rpi
W tym celu wpisz:
1 2 | sudraspi-config INTERFACING OPTIONS -> P6 Serial -> DISABLE!! logging via UART -> Enable hardware UART. |
To ważne, aby wyłączyć konsolę przez UART, bo służy ona do logowania się przez UART (np. z terminala komputerowego przez FTDI).
Następnie restartujemy – mamy teraz nowe urządzenie:
1 | /dev/serial0 |
i możemy się połączyć:
1 | sudo screen /dev/serial0 9600 |
Zakończenie aplikacji: Ctrl A potem D
Jeśli już w systemie nam działa UART, teraz można działać w C:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | #include <stdio.h> #include <string.h> //Linux #include <fcntl.h> // Contains file controls like O_RDWR #include <errno.h> // Error integer and strerror() function #include <termios.h> // Contains POSIX terminal control definitions #include <unistd.h> // write(), read(), close() int serial_port, //global port for TTY UART stopServer = 0; //global stopServer for ALL THREADS later //char *save_buf_ptr; int init_ttyUSB0() { serial_port = open("/dev/serial0", O_RDWR); //devUSB0 if we use FTDI for external UART // Create new termios struct, we call it 'tty' for convention struct termios tty; // Read in existing settings, and handle any error if(tcgetattr(serial_port, &tty) != 0) { printf("ERR (203) Error %i from tcgetattr: %s - RUN AS A ROOT?!\n", errno, strerror(errno)); return 203; } tty.c_cflag &= ~PARENB; // Clear parity bit, disabling parity (most common) tty.c_cflag &= ~CSTOPB; // Clear stop field, only one stop bit used in communication (most common) tty.c_cflag &= ~CSIZE; // Clear all bits that set the data size tty.c_cflag |= CS8; // 8 bits per byte (most common) tty.c_cflag &= ~CRTSCTS; // Disable RTS/CTS hardware flow control (most common) tty.c_cflag |= CREAD | CLOCAL; // Turn on READ & ignore ctrl lines (CLOCAL = 1) tty.c_lflag &= ~ICANON; 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_oflag &= ~OXTABS; // Prevent conversion of tabs to spaces (NOT PRESENT ON LINUX) // tty.c_oflag &= ~ONOEOT; // Prevent removal of C-d chars (0x004) in output (NOT PRESENT ON LINUX) tty.c_cc[VTIME] = 10; // Wait for up to 1s (10 deciseconds), returning as soon as any data is received. tty.c_cc[VMIN] = 0; // Set in/out baud rate to be 9600 cfsetispeed(&tty, B9600); cfsetospeed(&tty, B9600); // Save tty settings, also checking for error if (tcsetattr(serial_port, TCSANOW, &tty) != 0) { printf("ERR (204) Error %i from tcsetattr: %s\n", errno, strerror(errno)); return 204; } return 0; } int main() { char read_buf [1024]; int errNo = init_ttyUSB0(); //inicjacja UART USB if (errNo > 0) return errNo; fprintf(stderr, "\r\nUARTLinux by FX-Team 2023\r\n\r\n"); while (!stopServer) { memset(&read_buf, '\0', sizeof(read_buf)); int num_bytes = read(serial_port, &read_buf, sizeof(read_buf)); if (num_bytes < 0) { printf("UART Read (201) - server - Error reading: %s", strerror(errno)); stopServer = 1; return 201; } if (num_bytes > 0) { fprintf( stderr, "%s", read_buf); } }//while close(serial_port); stopServer = 1; return 0; } |