Skip to content
WooKyoung Noh edited this page Jul 24, 2015 · 2 revisions
julia> using Cxx
julia> cxx"""
       #include <stdio.h>    /* Standard input/output definitions */
       #include <stdlib.h>
       #include <stdint.h>   /* Standard types */
       #include <string.h>   /* String function definitions */
       #include <unistd.h>   /* UNIX standard function definitions */
       #include <fcntl.h>    /* File control definitions */
       #include <errno.h>    /* Error number definitions */
       #include <termios.h>  /* POSIX terminal control definitions */
       #include <sys/ioctl.h>
       #include <getopt.h>"""
true
julia> cxx"""int serialport_init(const char* serialport, int baud)
       {
           struct termios toptions;
           int fd;

           //fprintf(stderr,"init_serialport: opening port %s @ %d bps\n",
           //        serialport,baud);

           fd = open(serialport, O_RDWR | O_NOCTTY | O_NDELAY);
           if (fd == -1)  {
               perror("init_serialport: Unable to open port ");
               return -1;
           }

           if (tcgetattr(fd, &toptions) < 0) {
               perror("init_serialport: Couldn't get term attributes");
               return -1;
           }
           speed_t brate = baud; // let you override switch below if needed
           switch(baud) {
           case 4800:   brate=B4800;   break;
           case 9600:   brate=B9600;   break;
       #ifdef B14400
           case 14400:  brate=B14400;  break;
       #endif
           case 19200:  brate=B19200;  break;
       #ifdef B28800
           case 28800:  brate=B28800;  break;
       #endif
           case 38400:  brate=B38400;  break;
           case 57600:  brate=B57600;  break;
           case 115200: brate=B115200; break;
           }
           cfsetispeed(&toptions, brate);
           cfsetospeed(&toptions, brate);

           // 8N1
           toptions.c_cflag &= ~PARENB;
           toptions.c_cflag &= ~CSTOPB;
           toptions.c_cflag &= ~CSIZE;
           toptions.c_cflag |= CS8;
           // no flow control
           toptions.c_cflag &= ~CRTSCTS;

           toptions.c_cflag |= CREAD | CLOCAL;  // turn on READ & ignore ctrl lines
           toptions.c_iflag &= ~(IXON | IXOFF | IXANY); // turn off s/w flow ctrl

           toptions.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // make raw
           toptions.c_oflag &= ~OPOST; // make raw

           // see: http://unixwiz.net/techtips/termios-vmin-vtime.html
           toptions.c_cc[VMIN]  = 0;
           toptions.c_cc[VTIME] = 20;

           if( tcsetattr(fd, TCSANOW, &toptions) < 0) {
               perror("init_serialport: Couldn't set term attributes");
               return -1;
           }

           return fd;
       }"""
true

julia> fd = @cxx serialport_init(pointer("/dev/tty.usbmodem1411"), 9600)


julia> @cxx close(fd)
Clone this wiki locally