Alle Beiträge und Antworten
Eisbaeeer - 10.12.2007, 13:30
ACK - NACK Handling
Hallo zusammen
Ich wollte hier mal ein neuen Thread aufmachen, um die Vorgehensweise des ACK - NACK abzustimmen.
Ich dachte mir, dass der Sender nach seinem ersten Versuch, das Paket loszuwerden auf Empfang geht (tut er ja sowieso).
Sobald der Empfänger ein Paket erhält, das für Ihn ist und alles gut verläuft (im Sub Framehandler:) sendet er ja das ACK.
Code:
If Crc = Rf12_data(framelength) Then 'CRC OK?
Print "CRC OK! => " ; Crc
' Send ACK (i.e tell master that packet was OK)
' Set ACKs bit in HDB2 (xxxxxx10)
Hdb2 = Hdb2 Or &B00000010
Hdb2 = Hdb2 And &B11111110
'do ...
Gosub Senden 'Anwortframe senden--> nur als Slave
@Kurzschluss
Warum machst du hier alles zu 1 in HDB2? Hat das einen Grund? Dabei gehen doch die Adressen verloren.
ACK hast du als AA = &B10 definiert.
Der Sender müsste ja jetzt das ACK auswerten und demensprechend handeln.
Der Empfänger wertet im Moment noch nicht aus, ob der Master ein ACK möchte oder nicht. Sollen wir das auch implementieren oder soll grundsätzlich ein ACK angefordert werden?
Grüße Eisbaeeer
Kurzschluss - 10.12.2007, 22:19
Hi Eisbaeeer
die Auswertung der einzelnen Bits im HDB2 ist noch nicht komplett
Ich denke aber wir können einfach die beiden AA-Bits nach Empfang mit auswerten.
Je nachdem ein Ack senden wenn vom Master angefordert
vieleicht so:
Code:
If HDB2.0=1 then '---> Verarbeitung mit ACK
if AllesWarOK=1 then 'crc,Byteanzahl usw. OK
HDB2.0=0
HDB2.1=1 'ACK für Antwort
else
HDB2.0=1
HDB2.1=1 'NACK für Antwort
end if
else '---> Verarbeitung ohne ACK
'....
end if
Damit tun wir nur die beiden AA- Bits manipulieren und der Rest vom HDB2 wird nicht verändert.
Definition der ACK-Bits:
Bit 1 and 0 - ACK/NACK Bits (ACK)
These two bits defines if the sending node requests an ACK/NAK packet in return.
These bits also acts as the actual ACK/NAK response sent from the receiving node.
1 1 NAK response (Rx)
1 0 ACK response (Rx)
0 1 ACK request (Tx) ---> ACK gefordert!
0 0 No ACK request (Tx) ---> Frame ohne ACK
mit: Hdb2 = Hdb2 Or &B00000010
Hdb2 = Hdb2 And &B11111110
mach ich eigentlich das selbe,
die oberen 6Bits bleiben so wie sie waren
(Maskierfunktion mit gezielten setzen von Bit1 und rücksetzen von Bit0)
wie meinst du das mit Adresse geht verloren?
Die stecken doch in:
DAB1 Alias RF12_data(4)
SAB1 Alias RF12_data(5)
und werden nur zum zurücksenden getauscht
Grüsse
kurzschluss
Eisbaeeer - 11.12.2007, 07:19
Ja, so dachte ich mir das auch.
Die Tiefe der If Abfragen ist ja nur von den Stack Werten abhängig. Ich werde mich mal dran machen.
HDB2:
Da bin ich drübergestolpert und hab mich gerade nochmal in mein schon etwas umfangreicheres Programm eingelesen.
Ich werde mal die Kopf-Infos ändern.
Hab nur oben in der Beschreibung nachgeschaut, ohne weiter die Variablenzuordnung zu lesen:
Code:
' Overview of header definition bytes (HDB2 and HDB1)
'
' HDB2 HDB1
' +-----------------+-----------------+
' | D D S S P P A A | D E E E N N N N |
' +-----------------+-----------------+
Code:
Sync Alias Rf12_data(1) 'Snchr. Byte
Hdb2 Alias Rf12_data(2) 'Headerbyte2
Hdb1 Alias Rf12_data(3) 'Headerbyte1
Dab1 Alias Rf12_data(4) 'Destination Adress
Sab1 Alias Rf12_data(5) 'Source Adress
Das ist noch nicht stimmig.
Das hat mich kurz aus der Bahn geworfen. Naja, kann schon passieren, wenn man erkältet ist.
Grüße Eisbaeeer
-- ACHTUNG -- ACHTUNG --
Der Thread geht im neuen Forum weiter ---> http://www.weimars.net/forum
Mit folgendem Code, können Sie den Beitrag ganz bequem auf ihrer Homepage verlinken