Hoi,
Ik ben hier bezig om een aantal pc's te koppelen op een RS485 bus. Hiervoor gebruik ik beiden varianten (2 en 4 draads variant). Op de bus heb ik 1 hoofdcomputer aangesloten waarop ik vervolgens een N aantal client computer bijsluit. Die hoofdcomputer stuurt aanvragen naar de clients, die daarop antwoorden met bepaalde data uit hun process. Elke client heeft een eigen nodenaam en die naam word bij elke aanvraag ook de master meegegeven. Als het pakketje niet matched negeert hij het pakketje, anders antwoord hij met de gevraagde data.
Het probleem is nu dat ik al die tijd getest heb met 1 master en 1 client. Dit werkt helemaal geweldig tot ik een 2'de client op de bus aansloot. Die 2'de node ontvangt nu alleen maar rotzooi. Als ik de eerste node uitzet ontvangt de tweede wel correcte data. Alleen de eerste op de bus aangesloten client ontvangt dus data. Terwijl 485 juist zo is gemaakt dat alle apparaten elektrisch op de bus aangesloten alles ontvangen.
Het openen van de seriele poort doe ik op deze manier
Het versturen doe ik zo
Het ontvangen doe ik zo
Heeft iemand een idee heo het kan dat de eerste node ervoor zorgt dat ik op de nodes erachter niets goeds meer ontvang?Na het dagenlang nalezen van de 485 specs enzo snap ik het echt niet meer.
Ik ben hier bezig om een aantal pc's te koppelen op een RS485 bus. Hiervoor gebruik ik beiden varianten (2 en 4 draads variant). Op de bus heb ik 1 hoofdcomputer aangesloten waarop ik vervolgens een N aantal client computer bijsluit. Die hoofdcomputer stuurt aanvragen naar de clients, die daarop antwoorden met bepaalde data uit hun process. Elke client heeft een eigen nodenaam en die naam word bij elke aanvraag ook de master meegegeven. Als het pakketje niet matched negeert hij het pakketje, anders antwoord hij met de gevraagde data.
Het probleem is nu dat ik al die tijd getest heb met 1 master en 1 client. Dit werkt helemaal geweldig tot ik een 2'de client op de bus aansloot. Die 2'de node ontvangt nu alleen maar rotzooi. Als ik de eerste node uitzet ontvangt de tweede wel correcte data. Alleen de eerste op de bus aangesloten client ontvangt dus data. Terwijl 485 juist zo is gemaakt dat alle apparaten elektrisch op de bus aangesloten alles ontvangen.
Het openen van de seriele poort doe ik op deze manier
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
| // old and new serial port settings
termios oldtio;
termios newtio;
// Opening serial port based on Serial-Programming-HOWTO, chapter 3.2
this->connection = open(this->iodevice.c_str(), O_SYNC | O_RDWR | O_NOCTTY | O_NONBLOCK);
if (this->connection < 0)
{
return false;
}
tcgetattr(this->connection, &oldtio);
bzero(&newtio, sizeof(newtio));
newtio.c_cflag = BAUDRATE | CS8 | CREAD | CLOCAL;
newtio.c_iflag = IGNPAR;
newtio.c_oflag = 0;
newtio.c_lflag = 0;
newtio.c_cc[VTIME]=10; // 1.0 seconds timeout before read will return
newtio.c_cc[VMIN]=1; // read has to read something
tcflush(this->connection, TCIFLUSH);
tcsetattr(this->connection, TCSANOW, &newtio); |
Het versturen doe ik zo
code:
1
2
3
4
5
6
7
8
9
10
| tcflush(this->connection, TCIFLUSH);
//ioctl(this->connection, TIOCMBIC, &rts); //2draads
int res = write(this->connection, data.c_str(), data.length());
do
{
ioctl(this->connection, TIOCSERGETLSR, &arg);
}while((arg & TIOCSER_TEMT)==0); |
Het ontvangen doe ik zo
code:
1
2
3
4
5
6
7
8
9
| //ioctl(this->connection, TIOCMBIS, &rts); //2draads
bzero(totalreceived, sizeof(totalreceived));
while ((!timeout)&&(length<bytestoread))
{
bzero(received, sizeof(received));
res = read(this->connection, received, bytestoread);
....... |
Heeft iemand een idee heo het kan dat de eerste node ervoor zorgt dat ik op de nodes erachter niets goeds meer ontvang?Na het dagenlang nalezen van de 485 specs enzo snap ik het echt niet meer.