Bonjour à tous,
Je suis débutant en linux et système embarqué. Et je dois communiqué par le port série.
Je travail avec un serveur DIGI Connect ME9210 sous linux.
Mon PC (XP) fait tourner, grâce a VMWare un Package linux Ubuntu modifié par DIGI.
L'EDI est Eclipse arranger par DIGI. Et les programmes sont en C.
Je souhaite faire fonctionner le port série de ma carte de développement.
Je précise qu'aux boot j'ai les instructions qui sont renvoyées par le port série. je visualise donc les étapes du boot jusqu'au pompt linux par un hypertherminal, ou je peux naviguer dans les dossiers du linux embarqué et lancer des commandes. Le linux embarqué se trouve sur mon PC charger par le Serveur en FTP/NFS je peux donc debooger mes programmes.
Ce que j'ai fait:
J'arrive à envoyer du texte sur le port COM, je le visualise bien. Par contre il faut que je le lance plusieurs fois car j'ai l'impression qu'il ne prend pas les bons paramètres de COM immédiatement.
Par contre la réception est plus hasardeuse, car cela ne fonctionne pas. J'ai la doc fourni par DIGI mais ce n'est pas super clair.
De plus je suis connecté sur le même port COM ou j'ai linux en visu (boot etc...). lorsque je tape donc du texte dans la console je suis sous linux embarqué. Je ne pense pas que se soit correct.
Voici mon Code:
Main:
Uart.h:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 #include <stdio.h> /* Standard input/output definitions */ #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 "uart.h" int main() { int n; char Chaine[50]; int Fin = 1; int SerialPort; /* File descriptor for the port */ uart_conf.baudrate = 38400; uart_conf.bits = 8; uart_conf.stop = 0; uart_conf.flux = 0; uart_conf.parite = 0; SerialPort = uart_open_port(); if (SerialPort == -1 ) { }else{ usleep(100000); strcpy(Chaine, "Connexion OK : \0"); n = strlen(Chaine); n = uart_write(Chaine, n); uart_read(); } uart_close(); return 0; }
uart.c:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 #ifndef UART_H_ #define UART_H_ #include <termios.h> /* POSIX terminal control definitions */ #include <stdio.h> /* Standard input/output definitions */ #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 */ struct{ int baudrate; char bits; char stop; char flux; char parite; }uart_conf; int SerialPort; int uart_open_port(); int uart_write(char* text, int Nbo); int uart_rear(); void uart_close(); #endif /* UART_H_ */
Merci de votre aide.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135 #include "uart.h" int uart_open_port() { struct termios options; SerialPort = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY); if (SerialPort == -1) { /* * Could not open the port. */ perror("open_port: Unable to open /dev/ttyS0 - "); return -1; } else /* * Get the current options for the port... */ tcgetattr(SerialPort, &options); /* * Set the baud rates to 38400... */ switch (uart_conf.baudrate) { case (2400): cfsetispeed(&options, B2400); cfsetospeed(&options, B2400); break; case (9600): cfsetispeed(&options, B9600); cfsetospeed(&options, B9600); break; case (19200): cfsetispeed(&options, B19200); cfsetospeed(&options, B19200); break; case (38400): cfsetispeed(&options, B38400); cfsetospeed(&options, B38400); break; default: cfsetispeed(&options, B19200); cfsetospeed(&options, B19200); break; } options.c_cflag |= (CLOCAL | CREAD); //Controle de parité if (uart_conf.parite == 0) { options.c_cflag &= ~PARENB; // sans Parité }else{ options.c_cflag |= PARENB; // avec Parité } //Bit de stop if (uart_conf.stop == 0){ options.c_cflag &= ~CSTOPB; // pas Bit de stop }else{ options.c_cflag |= CSTOPB; // avec Bit de stop } options.c_cflag &= ~CSIZE; //Bit mask for data bits //Controle de flux if (uart_conf.flux == 0){ options.c_iflag &= ~(IXON | IXOFF | IXANY); //sans Control de flux }else{ options.c_iflag |= (IXON | IXOFF | IXANY); //avec Control de flux } switch (uart_conf.bits) { case (5): options.c_cflag |= CS5; //5 Bits de données break; case (6): options.c_cflag |= CS6; //7 Bits de données break; case (7): options.c_cflag |= CS7; //6 Bits de données break; case (8): options.c_cflag |= CS8; //8 Bits de données break; default: options.c_cflag |= CS8; //8 Bits de données break; } tcsetattr(SerialPort, TCSANOW, &options); fcntl(SerialPort, F_SETFL, 0); return (SerialPort); } int uart_write(char* text, int Nbo) { int n; n = write(SerialPort,text, Nbo); return n; } void uart_close() { close(SerialPort); } int uart_read() { char buffer[255]; /* Input buffer */ char *bufptr; /* Current char in buffer */ int nbytes; /* Number of bytes read */ bufptr = buffer; while ((nbytes = read(SerialPort, buffer, 255)) > 0) { bufptr += nbytes; if (bufptr[-1] == '\n' || bufptr[-1] == '\r') break; } /* nul terminate the string and see if we got an OK response */ *bufptr = '\0'; uart_write(buffer,strlen(buffer)); if (strncmp(buffer, "OK", 2) == 0){ return (0); } return (-1); }
Partager