Hoi,
Ik ben hier bezig met ene proggie die data over de seriele poort kan lezen en schrijven. Nu heb ik voor deze communicatie een mooie rs232 classe opgezet. Het probleem is dat het zenden helemaal goed gaat alleen het ontvangen gata totaal mis. Ik heb al heel wat serial howto's en manuals gelezen maar nergens staat iets wat mij kan helpen of wat ik nog niet geprobeerd heb.
Als eerste mijn code.
Nu heb ik twee test pc's aan elkaar verbonden. Op de 1 loopt een proggie die putdata() aanroept en op de ander loop readData(). als ik eerst de lezer start komt er (zoals verwacht) te staan " no data" . Start ik nu op de andere pc de schrijver dan krijg ik die " Cannot read" melding. Of te wel er gaat ergens is mis met de communicatie. Volgens mij staat de seriele verbinding goed ingesteld.
Btw het draait onder Linux. Op de ene machine /dev/ttys0 en op de andere /dev/tttS1.
Iemand een idee wat ik fout doe met het opzetten?.
Ik ben hier bezig met ene proggie die data over de seriele poort kan lezen en schrijven. Nu heb ik voor deze communicatie een mooie rs232 classe opgezet. Het probleem is dat het zenden helemaal goed gaat alleen het ontvangen gata totaal mis. Ik heb al heel wat serial howto's en manuals gelezen maar nergens staat iets wat mij kan helpen of wat ik nog niet geprobeerd heb.
Als eerste mijn code.
code:
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
| bool RS232::initCommunication(void)
{
termios oldtio;
termios newtio;
m_connection = open(this->m_iodevice, O_RDWR | O_NOCTTY | O_NONBLOCK);
if (m_connection < 0)
{
printf("Port open failed\n");
return false;
}
else
{
//See man termios
tcgetattr(m_connection, &oldtio);
bzero(&newtio, sizeof(newtio));
newtio.c_cflag = B9600 | CS8 | CLOCAL | CREAD;
newtio.c_iflag = IGNPAR;
newtio.c_oflag = 0;
newtio.c_lflag = 0;
//Delay for read
newtio.c_cc[VTIME]=10;
//Minimal characters to read
newtio.c_cc[VMIN]=1;
tcflush(m_connection, TCIFLUSH);
tcsetattr(m_connection, TCSANOW, &newtio);
printf("Port opened sucsesful\n");
return true;
}
}
char* RS232::readData(int bytes)
{
char *input = "";
int res;
if (m_connection < 1)
{
initCommunication();
}
while(1){
res = read(m_connection, input, bytes);
if (res == -1)
{
//Error no data
if (errno==EAGAIN)
{
printf("%s\n", "No data at this moment");
usleep(500000);
}
else
{
printf("%s\n", "Cannot read");
}
res =0;
}
}
//closeCommunication();
return input;
}
int RS232::putData(char * data)
{
int bytes_send = 0;
if (m_connection < 1)
{
initCommunication();
}
while(1)
{
bytes_send = write(m_connection, data, strlen(data));
if (bytes_send != strlen(data))
{
printf("%s\n", "Error sending data");
}
else
{
printf("%s\n", "data send");
usleep(5000000);
}
//closeCommunication();
}
return bytes_send;
} |
Nu heb ik twee test pc's aan elkaar verbonden. Op de 1 loopt een proggie die putdata() aanroept en op de ander loop readData(). als ik eerst de lezer start komt er (zoals verwacht) te staan " no data" . Start ik nu op de andere pc de schrijver dan krijg ik die " Cannot read" melding. Of te wel er gaat ergens is mis met de communicatie. Volgens mij staat de seriele verbinding goed ingesteld.
Btw het draait onder Linux. Op de ene machine /dev/ttys0 en op de andere /dev/tttS1.
Iemand een idee wat ik fout doe met het opzetten?.