summaryrefslogtreecommitdiff
path: root/2003/i/buzz/src/serial/serial.cc
blob: d603c638407a3a343873c57e8077c6055737f628 (plain)
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
// serial.cc
// buzz - Programme du robot Efrei Robotique I1-I2 2003
// Copyright (C) 2003 Nicolas Schodet
//
#include "serial.h"
#include "erreur/erreur.h"

#include <fcntl.h>

// Constructeur.
Serial::Serial (const char *name)
{
    struct termios tios;
    // Ouvre le port s�rie.
    m_fd = open (name, O_RDWR | O_NOCTTY | O_NONBLOCK);
    if (m_fd < 0)
	throw ErreurFatale ("Erreur d'ouverture du port s�rie.\n");
    // Rendre le port s�rie asynchrone.
    //fcntl (m_fd, F_SETFL, FASYNC);
    // Sauver la configuration courante du port s�rie.
    tcgetattr (m_fd, &m_old);
    // Param�trer les options du port s�rie.
    tios.c_cflag = CS8 | CLOCAL | CREAD /*| BAUDRATE*/;
    tios.c_iflag = IGNBRK | IGNPAR;
    tios.c_oflag = 0;
    tios.c_lflag = 0;
    // On n'attend jamais.
    tios.c_cc[VMIN] = 0;
    tios.c_cc[VTIME] = 0;
    //cfsetspeed (&tios, B115200);
    cfsetspeed (&tios, B9600);
    // Vider et configuer le port s�rie.
    tcflush (m_fd, TCIFLUSH);
    tcsetattr (m_fd, TCSANOW, &tios);
}

// Destructeur.
Serial::~Serial (void)
{
    tcsetattr (m_fd, TCSANOW, &m_old);
}

// Lit un caract�re, ou -1.
int
Serial::getchar (void)
{
    char c;
    if (read (m_fd, &c, 1) == 1)
	return c;
    else
	return -1;
}

// Ecrit un bloc.
ssize_t
Serial::write (const void *buf, size_t size)
{
    return ::write (m_fd, buf, size);
}