#include #include #include //Used for UART #include //Used for UART #include //Used for UART #include #include #include #include #include #include struct serial_struct { int type; int line; unsigned int port; int irq; int flags; int xmit_fifo_size; int custom_divisor; int baud_base; unsigned short close_delay; char io_type; char reserved_char[1]; int hub6; unsigned short closing_wait; /* time to wait before closing */ unsigned short closing_wait2; /* no longer used... */ unsigned char *iomem_base; unsigned short iomem_reg_shift; unsigned int port_high; unsigned long iomap_base; /* cookie passed into ioremap */ }; static volatile bool _running; void signal_handler(int signum) { _running = false; } int main() { _running = true; signal(SIGTERM, &signal_handler); //------------------------- //----- SETUP USART 0 ----- //------------------------- //At bootup, pins 8 and 10 are already set to UART0_TXD, UART0_RXD (ie the alt0 function) respectively int uart0_filestream = -1; //OPEN THE UART //The flags (defined in fcntl.h): // Access modes (use 1 of these): // O_RDONLY - Open for reading only. // O_RDWR - Open for reading and writing. // O_WRONLY - Open for writing only. // // O_NDELAY / O_NONBLOCK (same function) - Enables nonblocking mode. When set read requests on the file can return immediately with a failure status // if there is no input immediately available (instead of blocking). Likewise, write requests can also return // immediately with a failure status if the output can't be written immediately. // // O_NOCTTY - When set and path identifies a terminal device, open() shall not cause the terminal device to become the controlling terminal for the process. uart0_filestream = open("/dev/ttyAMA0", O_RDWR | O_NOCTTY | O_NDELAY); //Open in non blocking read/write mode if (uart0_filestream == -1) { //ERROR - CAN'T OPEN SERIAL PORT printf("Error - Unable to open UART. Ensure it is not in use by another application\n"); } //CONFIGURE THE UART //The flags (defined in /usr/include/termios.h - see http://pubs.opengroup.org/onlinepubs/007908799/xsh/termios.h.html): // Baud rate:- B1200, B2400, B4800, B9600, B19200, B38400, B57600, B115200, B230400, B460800, B500000, B576000, B921600, B1000000, B1152000, B1500000, B2000000, B2500000, B3000000, B3500000, B4000000 // CSIZE:- CS5, CS6, CS7, CS8 // CLOCAL - Ignore modem status lines // CREAD - Enable receiver // IGNPAR = Ignore characters with parity errors // ICRNL - Map CR to NL on input (Use for ASCII comms where you want to auto correct end of line characters - don't use for bianry comms!) // PARENB - Parity enable // PARODD - Odd parity (else even) struct termios options; tcgetattr(uart0_filestream, &options); options.c_cflag = B4000000 | CS8 | CLOCAL | CREAD; //) (*txIt) << " 0 "; } std::cout << "]" << std::endl; std::cout << "Type 'c' to continue, 'q' or 'x' to quit: "; while (_running) { char c = getchar(); if (c == 'q' || c == 'x') { break; } if (c != 'c') { continue; } int count = write(uart0_filestream, &tx_buffer[0], (p_tx_buffer - &tx_buffer[0])); //Filestream, bytes to write, number of bytes to write if (count < 0) { std::cerr << "UART TX error" << std::endl; //----- CLOSE THE UART ----- close(uart0_filestream); return -1; } std::cout << "Writing " << count << " bytes to uart" << std::endl; } //----- CLOSE THE UART ----- close(uart0_filestream); std::cout << "Program finished" << std::endl; return 0; }