diff --git a/.gitignore b/.gitignore index b678af8..6688893 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,7 @@ a.out *.o fake-values -essai +essai serial/t doc/*.toc doc/*.log doc/*.aux doc/*.pdf diff --git a/serial/Makefile b/serial/Makefile new file mode 100644 index 0000000..3af2ad8 --- /dev/null +++ b/serial/Makefile @@ -0,0 +1,9 @@ + + + +serial.o: serial.c serial.h Makefile + gcc -Wall -c $< + +t: t.c serial.o Makefile + gcc -Wall $< serial.o -o $@ + diff --git a/serial/README.md b/serial/README.md index bdb9934..98293fc 100644 --- a/serial/README.md +++ b/serial/README.md @@ -1,8 +1,20 @@ - # Serial Input But premier de ce module : recevoir les données fournies par l'automate de contrôle du phytotron. +Ayant déja pratiqué ce genre de chose pour un déja ancien +[projet](http://art.dinorama.fr/bdf/) +avec _MadPhoenix_, je me propose de reprendre quelques parties de ce code, +de le remettre au gout du jour et de le tester dès que possible. + + + + + + + + + diff --git a/serial/serial.c b/serial/serial.c new file mode 100644 index 0000000..1de14ce --- /dev/null +++ b/serial/serial.c @@ -0,0 +1,117 @@ + +#include +#include +#include //Used for UART +#include //Used for UART +#include //Used for UART + +#include "serial.h" + +/* -------------------------------------------------------------------- */ +static int baudrate2const(int bauds) +{ +int br; + +switch (bauds) + { + case 1200: br = B1200; break; + case 2400: br = B2400; break; + case 4800: br = B4800; break; + case 9600: br = B9600; break; + case 19200: br = B19200; break; + case 38400: br = B38400; break; + case 57600: br = B57600; break; + case 115200: br = B115200; break; + default: + fprintf(stderr, "baudrate %d invalide\n", bauds); + exit(1); + break; + } +return br; +} +/* -------------------------------------------------------------------- */ + +int prepare_UART(char *port, int baudrate) +{ +int uart0 = -1; +int baudbits; +struct termios options; + +#if DEBUG_LEVEL +fprintf(stderr, "%s ( %s %d )\n", __func__, port, baudrate); +#endif +// 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 = open(port, O_RDWR | O_NOCTTY); +if (uart0== -1) + { + perror("unable to open uart "); + return -1; + } + +// 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) + + +baudbits = baudrate2const(baudrate); +#if DEBUG_LEVEL +fprintf(stderr, "%d -> %x\n", baudrate, baudbits); +#endif +tcgetattr(uart0, &options); +options.c_cflag = baudbits | CS8 | CLOCAL | CREAD; // + +#include "serial.h" + +int main (int argc, char *argv[]) +{ +int serial_in; +int byte, foo; + +serial_in = prepare_UART("/dev/ttyS0", 9600); +fprintf(stderr, "prepare uart -> %d\n", serial_in); + +for (foo=0; foo<20; foo++) { + byte = getbyte(serial_in); + printf("%6d %02x\n", foo, byte); + } + +return 0; +}