Du hast in deinem Code mehrere Fehler!
1 | #define rxbuffersize 32
|
2 | #define txbuffersize 32
|
3 | ...
|
4 | uint8_t rxbuffer[rxbuffersize];
|
5 | uint8_t txbuffer[txbuffersize];
|
6 | ...
|
7 | void cleanrxbuffer(void){
|
8 | for (int i = 0; i<=rxbuffersize; i++){
|
9 | rxbuffer[i] = 0;
|
10 | }
|
11 | rxbyte = 0;
|
12 | }
|
13 |
|
14 | void cleantxbuffer(void){
|
15 | for (int i = 0; i<=txbuffersize; i++){
|
16 | txbuffer[i] = 0;
|
17 | }
|
18 |
|
19 | }
|
Generiert dir einen Array Overflow!
richtig wäre wohl:
1 | void cleanrxbuffer(void){
|
2 | for (int i = 0; i < rxbuffersize; i++){
|
3 | rxbuffer[i] = 0;
|
4 | }
|
5 | rxbyte = 0;
|
6 | }
|
7 |
|
8 | void cleantxbuffer(void){
|
9 | for (int i = 0; i < txbuffersize; i++){
|
10 | txbuffer[i] = 0;
|
11 | }
|
12 | }
|
Zusätzlich musst du an diversen Orten noch die Buffer-Grösse Prüfen (ob
wirklich so viele Bytes empfangen wurden...):
1 | volatile static uint16_t crc16(uint8_t *buffer, uint16_t buffer_length) {
|
2 | uint8_t crc_hi = 0xFF; // high CRC byte initialized
|
3 | uint8_t crc_lo = 0xFF; // low CRC byte initialized
|
4 | unsigned int i; // will index into CRC lookup
|
5 |
|
6 | if((buffer_length >= rxbuffersize) ||
|
7 | (buffer_length >= txbuffersize))
|
8 | {
|
9 | // ERROR
|
10 | return 0;
|
11 | }
|
12 | else
|
13 | {
|
14 | //pass through message buffer
|
15 | while (buffer_length--) {
|
16 | i = crc_hi ^ *buffer++;
|
17 | crc_hi = crc_lo ^ table_crc_hi[i];
|
18 | crc_lo = table_crc_lo[i];
|
19 | }
|
20 |
|
21 | return (crc_hi << 8 | crc_lo);
|
22 | }
|
23 | }
|
24 |
|
25 | ISR(USART_UDRE_vect ){
|
26 | if ((txposition < txbuffer_length) &&
|
27 | (txbuffer_length < txbuffersize)){ //
|
28 | UDR = txbuffer[txposition];
|
29 | txposition++;
|
30 | }
|
31 | else{
|
32 | UCSRB |= (1<<TXCIE);
|
33 | UCSRB &= ~(1<<UDRIE);
|
34 | }
|
35 | }
|
Weiter würde ich bei "dataprocessing" auf die minimale Frame-Länge
prüfen! Bei Modbus gibt es ja mindestes Slave-ID, Function-Code, CRC
(weiss jetzt nicht, ob noch ein Register mehr dabei ist).
Das sind gerade die Dinge, die mir aufgefallen sind. Eventuell gibt's
noch mehr Problemstellen.