hallo,
ich will meinen Deye-Solar-Wechselrichter steuern. Dazu habe ich einen
nano-AVR, der Lichteinfall, Batteriespannung, und Stellung des
Lasttrennschalters misst und über zwei Relais den Lasttrennschalter und
den Akku steuert. Funktioniert alles ohne größere Probleme. Lediglich
die i2c-rtc und die Lcd-Anzeige sind manchmal - wohl aufgrund von
Störimpulsen - weg. Deswegen will ich lcd und rtc auf einen zweiten Nano
auslagern. uart-RS485-Kommunikation funktioniert auch - fast -
fehlerfrei.
1 | #if sender0_empfaenger1==0//Sender
|
2 | if(sec%7==3)
|
3 | {
|
4 | //0110006C0001020078 AF1E //crc-teststring
|
5 | u8 len=9;
|
6 | u16 crc=0;
|
7 | txBuffer[0]=0x01;
|
8 | txBuffer[1]=0x10;
|
9 | txBuffer[2]=0x00;
|
10 | txBuffer[3]=0x6c;
|
11 | txBuffer[4]=0x00;
|
12 | txBuffer[5]=0x01;
|
13 | txBuffer[6]=0x02;
|
14 | txBuffer[7]=0x00;
|
15 | txBuffer[8]=0x78;
|
16 |
|
17 | crc= function_crc( txBuffer, len);
|
18 | txBuffer[len] = crc & 255 ;
|
19 | txBuffer[len+1]= crc>>8 ;
|
20 |
|
21 | serial_tx(txBuffer,len+2);
|
22 | }
|
23 |
|
24 | #else//empfänger
|
25 | if(sec%7==3
|
26 | && uart_str_rx[9]>0
|
27 | )
|
28 | {
|
29 | for (u8 i=0;i<15;i++)
|
30 | {
|
31 | lcd_goto(5+i,1);
|
32 | lcd_int4(uart_str_rx[i]);
|
33 | }
|
34 |
|
35 | u16 crc= function_crc( uart_str_rx, 9);
|
36 | uart_str_rx_ct=0;
|
37 |
|
38 | if(((crc>>8)==uart_str_rx[10]) && ((crc&255)==uart_str_rx[9]))
|
39 | {
|
40 | lcd_goto(5+9,5);
|
41 | lcd_int4(crc&255);
|
42 | lcd_int4(crc>>8);
|
43 | }
|
44 | memset(uart_str_rx, 0, 13);
|
45 | }
|
46 | #endif
|
Jetzt geht es um das Protokoll. Wie macht man das am besten - wiederholt
Senden bis vom Empfänger eine Bestätigung kommt oder z.B. 5mal Senden
und der Empfänger steigt aus, wenn er korrekt empfangen hat?
Das ist sicher ein Problem, über das sich schon viele kluge Köpfe
Gedanken gemacht haben. Gibt es vielleicht eine einfache
Standard-Musterlösung?