Zeitsteuerung
Fork of timer0 by
rs_485.cpp@1:8779e76fd4ea, 2016-02-05 (annotated)
- Committer:
- rs27
- Date:
- Fri Feb 05 14:39:43 2016 +0000
- Revision:
- 1:8779e76fd4ea
RS485 driver
Who changed what in which revision?
User | Revision | Line number | New 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 |