Hallo, wie kann ich am besten die Antworten von CAN-Teilnehmern überprüfen? Also ich schicke eine Nachricht raus (alle 10 millisekunden), mit der Frage, ob noch alle Teilnehmer da sind (es sind mit mir 4 Teilnehmer dabei). Diese sollen mir innerhalb dieser Zeit antworten. Jetzt bin ich am überlegen, wie ich das am besten machen kann. Meine Überlegung ist es, mit dem Senden der Nachricht einen Timer zu starten und bei Ablauf des Timers zu überprüfen ob alle geantwortet haben (Dabei bin ich mir ziemlich sicher, dass ich es so machen werde). Die überlegung ist nun, wie vergleiche ich das? Erstelle ich einen Array mit allen Teilnehmer als referenz und einen Array mit allen die geantwortet haben und vergleiche ich die dann? Dann müsste ich ja entweder mit ein paar for-schleifen alle kombinationen durchgehen und den Array vergleichen oder den array nach größe Sortieren (was wäre schnelle?). Oder gibt es da eine ganz andere möglichkeit? Wenn ja, wie wäre diese? Johannes
Das kommt wohl auf Deine Plattform an, wo programmierst Du? bei einem schnellen µC würde ich eher im ISR ein flag setzten und vor dem nächsten Sendezyklus auswerten ob alle Flags vorhanden sind, fehlt eines, hat wohl ein teilnehmer nicht mehr geantwortet. Unter C# wirst DEu wohl einen Timer benötigen, wenn dann aber zwei Teilnehmer fastz zur selben Zeit senden musst Du aufpassen dass die Nachricht im Rx-Buffe nicht verloren geht (Stichwort Ringpuffer und Multimessage) Wo läuft Dein Programm, welche Plattform, welche Hardware, welche Programmiersprache?
Das ganze Programmiere ich in C soll mit einem dsPIC30F6011 ausgeführt werden. Programmiren mache ihc mit MPLABX. Dass mehrere Nachrichten gleichzeitig ankommen könnten, hatte ich mir auf meinen Notizzettel schon einmal aufgeschrieben das ich das berücksichtigen muss. Zunächst sende ich die antworten mit tasterdruck (dafür gebe ich 5 Sekunden Zeit). wodurch das gleichzeitige senden ebenfalls unterdrückt wird.
Johannes schrieb: > Dass mehrere Nachrichten gleichzeitig ankommen könnten, Hast du mehrere Busse? Ansonsten kommen bei CAN alle Nachrichten nacheinander. Was spricht gegen einzelne Bits? Nach dem Senden der 1. Botschaft werden Bit 0 bis Bit 3 in einem Byte gesetzt. Beim Eintreffen einer Nachricht wird das entsprechende Bit gelöscht. Nach Ablauf des Timers muss das Byte=0 sein, sonst fehlt was.
Auf einem µC bietet es sich an, das ohne Timer zu machen sondern einen Interrupt beim empfangen einer CAN-Nachricht auszulösen. Im Interrupt setzt Du dann einzelne Bits ("Flags") die anzeigen, dass gerade eben von SlaveXY eine Antwort empfangen wurde. Vor dem nächsten Senden schaust Du, ob alle Bits gesetzt sind, wenn ein Bit fehlt, hat ein Slave nicht mehr geantwortet. Die Flags bzw. Bits muss Du natürlich in 2-er Potenz hoch setzen, d.h. der erste Slave bekommt das erste bit (0x01), der dritte slave bekommt das 3. Bit (0x04).... mal auf die schnelle und nur sinngemäß....
1 | #define Rx_SLAVE_01 0x01
|
2 | #define Rx_SLAVE_02 0x02
|
3 | #define Rx_SLAVE_03 0x04
|
4 | #define Rx_SLAVE_04 0x08
|
5 | |
6 | uint Rx_Flag; |
7 | |
8 | |
9 | // Das hier im Empfangsinterupt
|
10 | if (Rx_Message == Slave_1) |
11 | Rx_Flag |= Rx_SLAVE_01; |
12 | |
13 | else if (Rx_Message == Slave_2) |
14 | Rx_Flag |= Rx_SLAVE_02; |
15 | |
16 | else if (Rx_Message == Slave_3) |
17 | Rx_Flag |= Rx_SLAVE_03; |
18 | |
19 | else if (Rx_Message == Slave_4) |
20 | Rx_Flag |= Rx_SLAVE_04; |
21 | |
22 | |
23 | // Das hier vor dem senden
|
24 | if (Rx_Flag != 0x0F) // 00001111b |
25 | "irgendwas stimmt nicht, eine Slave fehlt
|
26 | else
|
27 | Rx_Flag = 0; // Zurücksetzen
|
28 | Sende_Neue_Anfrage();
|
Ahh, super, ich habe es hinbekommen. Zumindestens manuell mit Taster. JEtzt versuche ich das ganze noch mit Timern zu machen und dann funktioneiert es. besten dank Johannes
Super, auch mit den Timern habe ich hinbekommen. Noch einmal einr recht großes Dankeschön
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.