4 ***********************************************************************
5 * This file is part of wiringPi:
6 * https://projects.drogon.net/raspberry-pi/wiringpi/
8 * wiringPi is free software: you can redistribute it and/or modify
9 * it under the terms of the GNU Lesser General Public License as published by
10 * the Free Software Foundation, either version 3 of the License, or
11 * (at your option) any later version.
13 * wiringPi is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public License
19 * along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
20 ***********************************************************************
31 #include <sys/ioctl.h>
32 #include <sys/types.h>
35 #include "wiringSerial.h"
39 * Open and initialise the serial port, setting all the right
40 * port parameters - or as many as are required - hopefully!
41 *********************************************************************************
44 int serialOpen (char *device, int baud)
46 struct termios options ;
52 case 50: myBaud = B50 ; break ;
53 case 75: myBaud = B75 ; break ;
54 case 110: myBaud = B110 ; break ;
55 case 134: myBaud = B134 ; break ;
56 case 150: myBaud = B150 ; break ;
57 case 200: myBaud = B200 ; break ;
58 case 300: myBaud = B300 ; break ;
59 case 600: myBaud = B600 ; break ;
60 case 1200: myBaud = B1200 ; break ;
61 case 1800: myBaud = B1800 ; break ;
62 case 2400: myBaud = B2400 ; break ;
63 case 9600: myBaud = B9600 ; break ;
64 case 19200: myBaud = B19200 ; break ;
65 case 38400: myBaud = B38400 ; break ;
66 case 57600: myBaud = B57600 ; break ;
67 case 115200: myBaud = B115200 ; break ;
68 case 230400: myBaud = B230400 ; break ;
74 if ((fd = open (device, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK)) == -1)
77 fcntl (fd, F_SETFL, O_RDWR) ;
79 // Get and modify current options:
81 tcgetattr (fd, &options) ;
83 cfmakeraw (&options) ;
84 cfsetispeed (&options, myBaud) ;
85 cfsetospeed (&options, myBaud) ;
87 options.c_cflag |= (CLOCAL | CREAD) ;
88 options.c_cflag &= ~PARENB ;
89 options.c_cflag &= ~CSTOPB ;
90 options.c_cflag &= ~CSIZE ;
91 options.c_cflag |= CS8 ;
92 options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG) ;
93 options.c_oflag &= ~OPOST ;
95 options.c_cc [VMIN] = 0 ;
96 options.c_cc [VTIME] = 100 ; // Ten seconds (100 deciseconds)
98 tcsetattr (fd, TCSANOW | TCSAFLUSH, &options) ;
100 ioctl (fd, TIOCMGET, &status);
102 status |= TIOCM_DTR ;
103 status |= TIOCM_RTS ;
105 ioctl (fd, TIOCMSET, &status);
107 usleep (10000) ; // 10mS
115 * Flush the serial buffers (both tx & rx)
116 *********************************************************************************
119 void serialFlush (int fd)
121 tcflush (fd, TCIOFLUSH) ;
127 * Release the serial port
128 *********************************************************************************
131 void serialClose (int fd)
139 * Send a single character to the serial port
140 *********************************************************************************
143 void serialPutchar (int fd, unsigned char c)
151 * Send a string to the serial port
152 *********************************************************************************
155 void serialPuts (int fd, char *s)
157 write (fd, s, strlen (s)) ;
163 *********************************************************************************
166 void serialPrintf (int fd, char *message, ...)
171 va_start (argp, message) ;
172 vsnprintf (buffer, 1023, message, argp) ;
175 serialPuts (fd, buffer) ;
181 * Return the number of bytes of data avalable to be read in the serial port
182 *********************************************************************************
185 int serialDataAvail (int fd)
189 if (ioctl (fd, FIONREAD, &result) == -1)
198 * Get a single character from the serial device.
199 * Note: Zero is a valid character and this function will time-out after
201 *********************************************************************************
204 int serialGetchar (int fd)
208 if (read (fd, &x, 1) != 1)
211 return ((int)x) & 0xFF ;