Zeitsteuerung

Fork of timer0 by V09

Committer:
rs27
Date:
Fri Feb 05 14:39:43 2016 +0000
Revision:
1:8779e76fd4ea
RS485 driver

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rs27 1:8779e76fd4ea 1 //---------------------------------------------------------------------------
rs27 1:8779e76fd4ea 2 // Modul...: RS_485.CPP
rs27 1:8779e76fd4ea 3 // Chip....: iox.mini
rs27 1:8779e76fd4ea 4 //
rs27 1:8779e76fd4ea 5 //---------------------------------------------------------------------------
rs27 1:8779e76fd4ea 6 // Author..: Reinhold Schäfer
rs27 1:8779e76fd4ea 7 // Date....: 2016.01.23
rs27 1:8779e76fd4ea 8 // http....: //www.microsps.net
rs27 1:8779e76fd4ea 9 //---------------------------------------------------------------------------
rs27 1:8779e76fd4ea 10 #include "mbed.h"
rs27 1:8779e76fd4ea 11 #include "rs_485.h"
rs27 1:8779e76fd4ea 12 #include "timer0.h"
rs27 1:8779e76fd4ea 13
rs27 1:8779e76fd4ea 14 MODSERIAL RS485(RS485_TX2, RS485_RX2); // tx, rx
rs27 1:8779e76fd4ea 15 DigitalOut RS485_DIR(RS485_DIR2,0); // RS485 Direction
rs27 1:8779e76fd4ea 16
rs27 1:8779e76fd4ea 17 extern MODSERIAL pc;
rs27 1:8779e76fd4ea 18 extern timer0 down_timer; // definiert in main
rs27 1:8779e76fd4ea 19
rs27 1:8779e76fd4ea 20 //--------------------------------------------------------
rs27 1:8779e76fd4ea 21 // Interruptroutine wird nach 300µs aufgerufen, da das Senden von
rs27 1:8779e76fd4ea 22 // einem Zeichen ca. 100µs Zeit beansprucht, kann die Umschaltung
rs27 1:8779e76fd4ea 23 // auf Empfang erst verzögert erfolgen.
rs27 1:8779e76fd4ea 24
rs27 1:8779e76fd4ea 25 void rs_485::isr_timeout(void)
rs27 1:8779e76fd4ea 26 {
rs27 1:8779e76fd4ea 27 RS485_DIR = 0; // auf Empfang umschalten
rs27 1:8779e76fd4ea 28 send_end_flag = true;
rs27 1:8779e76fd4ea 29 }
rs27 1:8779e76fd4ea 30
rs27 1:8779e76fd4ea 31 /*
rs27 1:8779e76fd4ea 32 // -----------------------------------------------------------------------
rs27 1:8779e76fd4ea 33 // This function is called when TX buffer goes empty
rs27 1:8779e76fd4ea 34 //
rs27 1:8779e76fd4ea 35 void rs_485::txEmpty(MODSERIAL_IRQ_INFO *q)
rs27 1:8779e76fd4ea 36 {
rs27 1:8779e76fd4ea 37 timeout.attach_us(this, &rs_485::isr_timeout, 300); // Zeit für das Umschalten
rs27 1:8779e76fd4ea 38 }
rs27 1:8779e76fd4ea 39 */
rs27 1:8779e76fd4ea 40 //--------------------------------------------------------
rs27 1:8779e76fd4ea 41 // Construktor initialisiert den Timer
rs27 1:8779e76fd4ea 42 rs_485::rs_485()
rs27 1:8779e76fd4ea 43 {
rs27 1:8779e76fd4ea 44 RS485.baud(115200);
rs27 1:8779e76fd4ea 45 //RS485.attach(this, &rs_485::txEmpty);
rs27 1:8779e76fd4ea 46 timeout.stop();
rs27 1:8779e76fd4ea 47 timeout.reset();
rs27 1:8779e76fd4ea 48 msg_in.sm = 0;
rs27 1:8779e76fd4ea 49 msg_out.sm = 0;
rs27 1:8779e76fd4ea 50 rs_aktiv = 0;
rs27 1:8779e76fd4ea 51 rs_aktiv_old = 0;
rs27 1:8779e76fd4ea 52 }
rs27 1:8779e76fd4ea 53 //-------------------------------------------------------------
rs27 1:8779e76fd4ea 54 // Checksum ermitteln
rs27 1:8779e76fd4ea 55
rs27 1:8779e76fd4ea 56 uint8_t rs_485::get_crc(uint8_t *pbuffer, uint8_t count)
rs27 1:8779e76fd4ea 57 {
rs27 1:8779e76fd4ea 58 uint8_t crc_value = 0;
rs27 1:8779e76fd4ea 59 uint8_t temp;
rs27 1:8779e76fd4ea 60
rs27 1:8779e76fd4ea 61 // CheckSum calculation
rs27 1:8779e76fd4ea 62 for(int i=0; i <= count; i++)
rs27 1:8779e76fd4ea 63 {
rs27 1:8779e76fd4ea 64 temp = *pbuffer;
rs27 1:8779e76fd4ea 65 // pc.printf("\n CRC #%02d %02x ^ %02x = ",i,crc_value,temp);
rs27 1:8779e76fd4ea 66 crc_value ^= temp; // XOR from ID to Data
rs27 1:8779e76fd4ea 67 pbuffer++;
rs27 1:8779e76fd4ea 68 // pc.printf("%02x",crc_value);
rs27 1:8779e76fd4ea 69 }
rs27 1:8779e76fd4ea 70 return crc_value;
rs27 1:8779e76fd4ea 71 }
rs27 1:8779e76fd4ea 72
rs27 1:8779e76fd4ea 73 //-------------------------------------------------------------
rs27 1:8779e76fd4ea 74 // zum Testen das Telegramm ausgeben
rs27 1:8779e76fd4ea 75 //
rs27 1:8779e76fd4ea 76 void rs_485::msg_print(Message msg)
rs27 1:8779e76fd4ea 77 {
rs27 1:8779e76fd4ea 78 uint8_t len;
rs27 1:8779e76fd4ea 79
rs27 1:8779e76fd4ea 80 pc.printf(" %02d:%02d:%02d.%03d",msg.h,msg.m,msg.s,msg.ms);
rs27 1:8779e76fd4ea 81
rs27 1:8779e76fd4ea 82 pc.printf(" %02x",msg.STX);
rs27 1:8779e76fd4ea 83 pc.printf(" %02x",msg.source);
rs27 1:8779e76fd4ea 84 pc.printf(" %02x",msg.dest);
rs27 1:8779e76fd4ea 85 pc.printf(" %02x [",msg.len);
rs27 1:8779e76fd4ea 86
rs27 1:8779e76fd4ea 87 len = msg.len;
rs27 1:8779e76fd4ea 88 for (int i = 0; i < len; i++)
rs27 1:8779e76fd4ea 89 {
rs27 1:8779e76fd4ea 90 pc.printf(" %02x",msg.data[i]);
rs27 1:8779e76fd4ea 91 }
rs27 1:8779e76fd4ea 92 pc.printf(" ] %02x",msg.CRC);
rs27 1:8779e76fd4ea 93 pc.printf(" %02x",msg.ETX);
rs27 1:8779e76fd4ea 94
rs27 1:8779e76fd4ea 95 }
rs27 1:8779e76fd4ea 96
rs27 1:8779e76fd4ea 97 // -----------------------------------------------------------------------
rs27 1:8779e76fd4ea 98 // eine Telegramm erzeugen
rs27 1:8779e76fd4ea 99 //
rs27 1:8779e76fd4ea 100 // die Zeichen STX, CRC und ETX werden automatisch erzeugt
rs27 1:8779e76fd4ea 101 // das Telegramm hat folgenden Aufbau
rs27 1:8779e76fd4ea 102 // STX ADR ZIEL Länge [daten] CRC ETX
rs27 1:8779e76fd4ea 103 // Länge ist Anzahl der Zeichen im Datenfeld
rs27 1:8779e76fd4ea 104 //
rs27 1:8779e76fd4ea 105 void rs_485::write(uint8_t *data)
rs27 1:8779e76fd4ea 106 {
rs27 1:8779e76fd4ea 107 uint16_t millis;
rs27 1:8779e76fd4ea 108 uint8_t len;
rs27 1:8779e76fd4ea 109
rs27 1:8779e76fd4ea 110 msg_out.STX = 0x02; // STX
rs27 1:8779e76fd4ea 111
rs27 1:8779e76fd4ea 112 msg_out.source = *data; // Start Adresse
rs27 1:8779e76fd4ea 113 data++;
rs27 1:8779e76fd4ea 114
rs27 1:8779e76fd4ea 115 msg_out.dest = *data; // Ziel Adresse
rs27 1:8779e76fd4ea 116 data++;
rs27 1:8779e76fd4ea 117
rs27 1:8779e76fd4ea 118 msg_out.len = *data; // Länge
rs27 1:8779e76fd4ea 119 len = *data;
rs27 1:8779e76fd4ea 120 data++;
rs27 1:8779e76fd4ea 121
rs27 1:8779e76fd4ea 122 for (int i = 0; i < len; i++)
rs27 1:8779e76fd4ea 123 {
rs27 1:8779e76fd4ea 124 msg_out.data[i] = *data; // Datenbyte
rs27 1:8779e76fd4ea 125 data++;
rs27 1:8779e76fd4ea 126 }
rs27 1:8779e76fd4ea 127
rs27 1:8779e76fd4ea 128 // pc.printf("\n write crc berechnen \n");
rs27 1:8779e76fd4ea 129 msg_out.CRC = get_crc(&msg_out.source,msg_out.len+3); // CRC Summe ermitteln
rs27 1:8779e76fd4ea 130
rs27 1:8779e76fd4ea 131 msg_out.ETX = 0x03; // Telegramm Abschluss
rs27 1:8779e76fd4ea 132
rs27 1:8779e76fd4ea 133 // Zeitstempel schreiben
rs27 1:8779e76fd4ea 134 down_timer.get_time_stamp(t_array,&millis);
rs27 1:8779e76fd4ea 135 msg_out.h = t_array[0];
rs27 1:8779e76fd4ea 136 msg_out.m = t_array[1];
rs27 1:8779e76fd4ea 137 msg_out.s = t_array[2];
rs27 1:8779e76fd4ea 138 msg_out.ms = millis;
rs27 1:8779e76fd4ea 139
rs27 1:8779e76fd4ea 140 // Datenausgabe wird aktiviert, prüfen ob harte Umschaltung hier sinnvoll
rs27 1:8779e76fd4ea 141 msg_out.sm = 0;
rs27 1:8779e76fd4ea 142 rs_aktiv = 2;
rs27 1:8779e76fd4ea 143 }
rs27 1:8779e76fd4ea 144
rs27 1:8779e76fd4ea 145 //-------------------------------------------------------------
rs27 1:8779e76fd4ea 146 // Die Telegramme steuern und überwachen
rs27 1:8779e76fd4ea 147 //
rs27 1:8779e76fd4ea 148 void rs_485::execute(void)
rs27 1:8779e76fd4ea 149 {
rs27 1:8779e76fd4ea 150 // auf timeout testen, falls ein fehler auftritt
rs27 1:8779e76fd4ea 151 // wird das Telegramm über diese Stelle abgebrochen
rs27 1:8779e76fd4ea 152 //
rs27 1:8779e76fd4ea 153
rs27 1:8779e76fd4ea 154 int temp;
rs27 1:8779e76fd4ea 155
rs27 1:8779e76fd4ea 156 temp = timeout.read_ms();
rs27 1:8779e76fd4ea 157 if (temp >= 10)
rs27 1:8779e76fd4ea 158 {
rs27 1:8779e76fd4ea 159 timeout.stop();
rs27 1:8779e76fd4ea 160 timeout.reset();
rs27 1:8779e76fd4ea 161 msg_in.sm = 0;
rs27 1:8779e76fd4ea 162 msg_out.sm = 0;
rs27 1:8779e76fd4ea 163
rs27 1:8779e76fd4ea 164
rs27 1:8779e76fd4ea 165 if (rs_aktiv == 1)
rs27 1:8779e76fd4ea 166 {
rs27 1:8779e76fd4ea 167 pc.printf("\nreceive timeout %02d ms",temp);
rs27 1:8779e76fd4ea 168 pc.printf("\n sm: %02x",msg_in.sm);
rs27 1:8779e76fd4ea 169 pc.printf("\n tel:");
rs27 1:8779e76fd4ea 170 msg_print(msg_out);
rs27 1:8779e76fd4ea 171 }
rs27 1:8779e76fd4ea 172
rs27 1:8779e76fd4ea 173 if (rs_aktiv == 2)
rs27 1:8779e76fd4ea 174 {
rs27 1:8779e76fd4ea 175 pc.printf("\nsende timeout %02d ms",temp);
rs27 1:8779e76fd4ea 176 pc.printf("\n sm: %02x",msg_out.sm);
rs27 1:8779e76fd4ea 177 pc.printf("\n tel:");
rs27 1:8779e76fd4ea 178 msg_print(msg_out);
rs27 1:8779e76fd4ea 179 }
rs27 1:8779e76fd4ea 180
rs27 1:8779e76fd4ea 181 rs_aktiv = 0;
rs27 1:8779e76fd4ea 182 }
rs27 1:8779e76fd4ea 183
rs27 1:8779e76fd4ea 184 // an dieser Stelle wird der Programmablauf gesteuert
rs27 1:8779e76fd4ea 185 // 0 Bus inaktiv auf Empfang
rs27 1:8779e76fd4ea 186 // 1 BUS aktiv auf Empfangsmode
rs27 1:8779e76fd4ea 187 // 2 BUS aktiv im Sendemode
rs27 1:8779e76fd4ea 188
rs27 1:8779e76fd4ea 189 switch (rs_aktiv)
rs27 1:8779e76fd4ea 190 {
rs27 1:8779e76fd4ea 191 case 0:
rs27 1:8779e76fd4ea 192
rs27 1:8779e76fd4ea 193 if (rs_aktiv != rs_aktiv_old)
rs27 1:8779e76fd4ea 194 {
rs27 1:8779e76fd4ea 195 pc.printf("\n\nreceive");
rs27 1:8779e76fd4ea 196 timeout.stop(); // timer starten
rs27 1:8779e76fd4ea 197 timeout.reset(); // timer auf 0 setzen
rs27 1:8779e76fd4ea 198 rs_aktiv_old = rs_aktiv;
rs27 1:8779e76fd4ea 199 }
rs27 1:8779e76fd4ea 200 receive();
rs27 1:8779e76fd4ea 201 break;
rs27 1:8779e76fd4ea 202
rs27 1:8779e76fd4ea 203 case 1:
rs27 1:8779e76fd4ea 204
rs27 1:8779e76fd4ea 205 if (rs_aktiv != rs_aktiv_old)
rs27 1:8779e76fd4ea 206 {
rs27 1:8779e76fd4ea 207 pc.printf("\n\nreceive aktiv");
rs27 1:8779e76fd4ea 208 timeout.reset(); // timer auf 0 setzen
rs27 1:8779e76fd4ea 209 timeout.start();
rs27 1:8779e76fd4ea 210 rs_aktiv_old = rs_aktiv;
rs27 1:8779e76fd4ea 211 }
rs27 1:8779e76fd4ea 212 receive();
rs27 1:8779e76fd4ea 213 break;
rs27 1:8779e76fd4ea 214
rs27 1:8779e76fd4ea 215 case 2:
rs27 1:8779e76fd4ea 216
rs27 1:8779e76fd4ea 217 if (rs_aktiv != rs_aktiv_old)
rs27 1:8779e76fd4ea 218 {
rs27 1:8779e76fd4ea 219 pc.printf("\n\nsende aktiv");
rs27 1:8779e76fd4ea 220 timeout.reset(); // timer auf 0 setzen
rs27 1:8779e76fd4ea 221 timeout.start();
rs27 1:8779e76fd4ea 222 rs_aktiv_old = rs_aktiv;
rs27 1:8779e76fd4ea 223 }
rs27 1:8779e76fd4ea 224 send();
rs27 1:8779e76fd4ea 225 break;
rs27 1:8779e76fd4ea 226 } // end switch
rs27 1:8779e76fd4ea 227
rs27 1:8779e76fd4ea 228 }
rs27 1:8779e76fd4ea 229
rs27 1:8779e76fd4ea 230 // -----------------------------------------------------------------------
rs27 1:8779e76fd4ea 231 // das Telegramm ausgeben
rs27 1:8779e76fd4ea 232 //
rs27 1:8779e76fd4ea 233 void rs_485::send(void)
rs27 1:8779e76fd4ea 234 {
rs27 1:8779e76fd4ea 235
rs27 1:8779e76fd4ea 236 switch(msg_out.sm)
rs27 1:8779e76fd4ea 237 {
rs27 1:8779e76fd4ea 238 case 0:
rs27 1:8779e76fd4ea 239 // das Senden beginnt erst, wenn das eingehende Telegramm abgeschlossen ist
rs27 1:8779e76fd4ea 240
rs27 1:8779e76fd4ea 241 msg_print(msg_out);
rs27 1:8779e76fd4ea 242 pc.printf(" \n");
rs27 1:8779e76fd4ea 243
rs27 1:8779e76fd4ea 244 RS485_DIR = 1; // Bus belegen
rs27 1:8779e76fd4ea 245 msg_out.sm = 1;
rs27 1:8779e76fd4ea 246
rs27 1:8779e76fd4ea 247 break;
rs27 1:8779e76fd4ea 248
rs27 1:8779e76fd4ea 249 case 1: // Startzeichen senden
rs27 1:8779e76fd4ea 250 RS485.putc(msg_out.STX);
rs27 1:8779e76fd4ea 251 msg_out.sm++;
rs27 1:8779e76fd4ea 252 break;
rs27 1:8779e76fd4ea 253
rs27 1:8779e76fd4ea 254 case 2:
rs27 1:8779e76fd4ea 255 RS485.putc(msg_out.source);
rs27 1:8779e76fd4ea 256 msg_out.sm++;
rs27 1:8779e76fd4ea 257 break;
rs27 1:8779e76fd4ea 258
rs27 1:8779e76fd4ea 259 case 3:
rs27 1:8779e76fd4ea 260 RS485.putc(msg_out.dest);
rs27 1:8779e76fd4ea 261 msg_out.sm++;
rs27 1:8779e76fd4ea 262 break;
rs27 1:8779e76fd4ea 263
rs27 1:8779e76fd4ea 264 case 4:
rs27 1:8779e76fd4ea 265 RS485.putc(msg_out.len);
rs27 1:8779e76fd4ea 266 msg_out.sm++;
rs27 1:8779e76fd4ea 267 break;
rs27 1:8779e76fd4ea 268
rs27 1:8779e76fd4ea 269 case 5:
rs27 1:8779e76fd4ea 270 for(int i=0; i < msg_out.len; i++)
rs27 1:8779e76fd4ea 271 {
rs27 1:8779e76fd4ea 272 RS485.putc(msg_out.data[i]);
rs27 1:8779e76fd4ea 273 }
rs27 1:8779e76fd4ea 274 msg_out.sm++;
rs27 1:8779e76fd4ea 275 break;
rs27 1:8779e76fd4ea 276
rs27 1:8779e76fd4ea 277 case 6:
rs27 1:8779e76fd4ea 278 RS485.putc(msg_out.CRC);
rs27 1:8779e76fd4ea 279 msg_out.sm++;
rs27 1:8779e76fd4ea 280 break;
rs27 1:8779e76fd4ea 281
rs27 1:8779e76fd4ea 282 case 7:
rs27 1:8779e76fd4ea 283 RS485.putc(msg_out.ETX);
rs27 1:8779e76fd4ea 284 msg_out.sm++;
rs27 1:8779e76fd4ea 285 break;
rs27 1:8779e76fd4ea 286
rs27 1:8779e76fd4ea 287 case 8:
rs27 1:8779e76fd4ea 288 // hier warten bis alle Zeichen ausgegeben
rs27 1:8779e76fd4ea 289 int n = RS485.txBufferGetCount();
rs27 1:8779e76fd4ea 290 if (n == 0) msg_out.sm = 0;
rs27 1:8779e76fd4ea 291 //tx_timeout1 = timeout.read_us();
rs27 1:8779e76fd4ea 292 break;
rs27 1:8779e76fd4ea 293
rs27 1:8779e76fd4ea 294 case 9:
rs27 1:8779e76fd4ea 295 // hier warten bis alle Zeichen ausgegeben
rs27 1:8779e76fd4ea 296
rs27 1:8779e76fd4ea 297 //tx_timeout2 = timeout.read_us();
rs27 1:8779e76fd4ea 298 //if ((tx_timeout2 - tx_timeout1) >= 100)
rs27 1:8779e76fd4ea 299 //{
rs27 1:8779e76fd4ea 300 msg_out.sm = 0;
rs27 1:8779e76fd4ea 301 RS485_DIR = 0; // Bus frei geben
rs27 1:8779e76fd4ea 302 rs_aktiv = 0; // Bus wieder auf Empfang
rs27 1:8779e76fd4ea 303 //}
rs27 1:8779e76fd4ea 304 break;
rs27 1:8779e76fd4ea 305
rs27 1:8779e76fd4ea 306 default: // wird nie erreicht
rs27 1:8779e76fd4ea 307 pc.printf(" error in sm send %d",msg_out.sm);
rs27 1:8779e76fd4ea 308 break; //
rs27 1:8779e76fd4ea 309 } // end switch
rs27 1:8779e76fd4ea 310 }
rs27 1:8779e76fd4ea 311
rs27 1:8779e76fd4ea 312 // -----------------------------------------------------------------------
rs27 1:8779e76fd4ea 313 // ein Telegramm lesen
rs27 1:8779e76fd4ea 314 //
rs27 1:8779e76fd4ea 315 void rs_485::receive(void)
rs27 1:8779e76fd4ea 316 {
rs27 1:8779e76fd4ea 317 uint8_t ch, pos;
rs27 1:8779e76fd4ea 318
rs27 1:8779e76fd4ea 319 if (RS485.readable()) // prüfen ob Zeichen im buffer vorhanden
rs27 1:8779e76fd4ea 320 {
rs27 1:8779e76fd4ea 321 ch = RS485.getc();
rs27 1:8779e76fd4ea 322 pc.printf(" %02x",ch);
rs27 1:8779e76fd4ea 323 if ((ch == 0x02) && (msg_in.sm == 0))
rs27 1:8779e76fd4ea 324 {
rs27 1:8779e76fd4ea 325 // ein neues Telegramm startet
rs27 1:8779e76fd4ea 326 // ? ein timemout einbauen
rs27 1:8779e76fd4ea 327 msg_in.STX = ch;
rs27 1:8779e76fd4ea 328 msg_in.sm = 1;
rs27 1:8779e76fd4ea 329 }
rs27 1:8779e76fd4ea 330 else
rs27 1:8779e76fd4ea 331 {
rs27 1:8779e76fd4ea 332 switch(msg_in.sm)
rs27 1:8779e76fd4ea 333 {
rs27 1:8779e76fd4ea 334 case 1:
rs27 1:8779e76fd4ea 335 msg_in.source = ch;
rs27 1:8779e76fd4ea 336 msg_in.sm++;
rs27 1:8779e76fd4ea 337 break;
rs27 1:8779e76fd4ea 338
rs27 1:8779e76fd4ea 339 case 2:
rs27 1:8779e76fd4ea 340 msg_in.dest = ch;
rs27 1:8779e76fd4ea 341 msg_in.sm++;
rs27 1:8779e76fd4ea 342 break;
rs27 1:8779e76fd4ea 343
rs27 1:8779e76fd4ea 344 case 3:
rs27 1:8779e76fd4ea 345 msg_in.count = ch;
rs27 1:8779e76fd4ea 346 msg_in.sm++;
rs27 1:8779e76fd4ea 347 pos = 0;
rs27 1:8779e76fd4ea 348 break;
rs27 1:8779e76fd4ea 349
rs27 1:8779e76fd4ea 350 case 4:
rs27 1:8779e76fd4ea 351 msg_in.data[pos] = ch;
rs27 1:8779e76fd4ea 352 pos++;
rs27 1:8779e76fd4ea 353 msg_in.count--;
rs27 1:8779e76fd4ea 354 if (msg_in.count == 0)
rs27 1:8779e76fd4ea 355 {
rs27 1:8779e76fd4ea 356 msg_in.sm++;
rs27 1:8779e76fd4ea 357 }
rs27 1:8779e76fd4ea 358 break;
rs27 1:8779e76fd4ea 359
rs27 1:8779e76fd4ea 360 case 5:
rs27 1:8779e76fd4ea 361 msg_in.CRC = ch;
rs27 1:8779e76fd4ea 362 msg_in.sm++;
rs27 1:8779e76fd4ea 363 break;
rs27 1:8779e76fd4ea 364
rs27 1:8779e76fd4ea 365 case 6:
rs27 1:8779e76fd4ea 366 msg_in.ETX = ch;
rs27 1:8779e76fd4ea 367 msg_in.sm = 0; // auf ein neues Telegramm warten
rs27 1:8779e76fd4ea 368 rs_aktiv = 0;
rs27 1:8779e76fd4ea 369
rs27 1:8779e76fd4ea 370 // CRC prüfen
rs27 1:8779e76fd4ea 371 uint8_t crc = get_crc(&msg_in.source,msg_in.len+3); // CRC Summe ermitteln
rs27 1:8779e76fd4ea 372 if (crc == msg_in.CRC)
rs27 1:8779e76fd4ea 373 {
rs27 1:8779e76fd4ea 374 msg_in.error = 0xFF; // Telegramm korrekt empfangen
rs27 1:8779e76fd4ea 375 }
rs27 1:8779e76fd4ea 376 else
rs27 1:8779e76fd4ea 377 {
rs27 1:8779e76fd4ea 378 msg_in.error |= 0x80; // CRC Fehler
rs27 1:8779e76fd4ea 379 }
rs27 1:8779e76fd4ea 380
rs27 1:8779e76fd4ea 381 // Telegramm ausgeben
rs27 1:8779e76fd4ea 382 pc.printf("\n receive");
rs27 1:8779e76fd4ea 383 msg_print(msg_in);
rs27 1:8779e76fd4ea 384 pc.printf(" stauts: %02x\n",msg_in.error);
rs27 1:8779e76fd4ea 385
rs27 1:8779e76fd4ea 386 break;
rs27 1:8779e76fd4ea 387 }
rs27 1:8779e76fd4ea 388 }
rs27 1:8779e76fd4ea 389 }
rs27 1:8779e76fd4ea 390 }
rs27 1:8779e76fd4ea 391
rs27 1:8779e76fd4ea 392
rs27 1:8779e76fd4ea 393
rs27 1:8779e76fd4ea 394