Bonjour.

J'ai besoin de programmer l'accès à un port série en R/W en C sous Linux. J'ai actuellement réussi à écrire vers un terminal externe mais je n'arrive pas à lire des caractères envoyés depuis ce terminal.

J'ai essayé de lire les codes dans les différentes discussions sur le prot RS232 (recherche "port série" sur forum C), mais je tombe sur des codes Windows que je n'arrive pas à décrypter. Ci joint mon code actuel :

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
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
 
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
 
int srl_handle;
struct termios options;
 
void mode_raw(int activer)
{
	struct termios raw;
	static int raw_actif=0;
	static struct termios cooked;
 
	if (raw_actif == activer) return;
	if (activer)
	{
		tcgetattr(STDIN_FILENO, &cooked);
		raw = cooked;
		cfmakeraw(&raw);
		tcsetattr(STDIN_FILENO, TCSANOW, &raw);
		printf("Raw mode activated\r\n");
	}
	else
	{
		tcsetattr(STDIN_FILENO, TCSANOW, &cooked);
		printf("Raw mode deactivated\r\n");
	}
 
	raw_actif = activer;
}
 
int main(int argc, char *argv[])
{
	char c=0;
	char s[2]="\0";
	char* buf=0;
 
	mode_raw(1);
	/*Open serial port*/
	srl_handle=open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
	if(srl_handle<0)
	{
		perror("serial port open");
		exit(-1);
	}
	fcntl(srl_handle, F_SETFL, FNDELAY);
	tcgetattr(srl_handle, &options);
 
	/*Set baud rate*/
	cfsetospeed(&options, B19200);
	cfsetispeed(&options, B19200);
	options.c_cflag |= (CLOCAL | CREAD);
	/*Set no parity*/
	options.c_cflag |= PARENB;
	options.c_cflag &= ~CSTOPB;
	options.c_cflag &= ~CSIZE;
	options.c_cflag &= ~PARODD;
	options.c_cflag |= CS7;
	options.c_cflag &= ~CRTSCTS;
	options.c_iflag &= ~(IXON|IXOFF|IXANY);
	/*Set raw output*/
	tcsetattr(srl_handle, TCSANOW, &options);
 
	/*Write Data*/
	while ((c=fgetc(stdin))!='x')
	{
		printf("%c\t",c);
		s[0] = c;
		s[1] = '\0';
		printf("%s\r\n",s);
		if (write(srl_handle, s, 1) < 0)
			fputs("write() failed!\r\n", stderr);
	}
	mode_raw(0);
//	fcntl(srl_handle, F_SETFL, 0);
//	while (strstr(buf,"OK")==NULL)
//	{
		if (read(srl_handle, buf, 10) < 0)
			fputs("read() failed!\r\n", stderr);
		printf("%s\n",buf);
//	}
 
	close(srl_handle);	
//	mode_raw(0);
	return EXIT_SUCCESS;
 
}
C'est cette partie qui ne semble pas fonctionner, en tout cas, je n'ai pas l'impression de recevoir quoi que ce soit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
//	fcntl(srl_handle, F_SETFL, 0);
//	while (strstr(buf,"OK")==NULL)
//	{
		if (read(srl_handle, buf, 10) < 0)
			fputs("read() failed!\r\n", stderr);
		printf("%s\n",buf);
//	}
car lorsque je décommente la ligne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
//	fcntl(srl_handle, F_SETFL, 0);
je suis sensé attendre la lecture d'un caractère sur mon port série, mais rien ne vient et mon programme reste bloqué.

Please help

Merci

DBoJ