Hallo! ich habe ein Problem mit RS485 bzw. RS232
Als Master µC fungiert ein AT89C51ED2, der einen 17 Byte langen Frame
über RS485 versendet. Der Frame ist folgendermaßen aufgebaut:
1 | typedef union
|
2 | {
|
3 | struct
|
4 | {
|
5 | unsigned char ID;
|
6 | unsigned char slave_adress;
|
7 | unsigned char command;
|
8 | unsigned int temperature;
|
9 | float float_var1;
|
10 | float float_var2;
|
11 | unsigned int uint_var1;
|
12 | unsigned char sys_1;
|
13 | unsigned char checksum;
|
14 | } f;
|
15 |
|
16 | unsigned char byte[17];
|
17 |
|
18 | } RS485_FRAME;
|
dieser Frame wird einfach über die serielle Schnittstelle gesendet.
==> Code für senden eines Bytes
1 | void rs485_transmit(unsigned char zeichen)
|
2 | {
|
3 | while(!TI);
|
4 | TI=0;
|
5 | SBUF=zeichen;
|
6 |
|
7 | }
|
mit der folgenden Funktion wird somit dann der gesamte Frame gesendet
1 | void sendframe(unsigned char *pframe, unsigned char length)
|
2 | {
|
3 | unsigned char i=0;
|
4 | extern unsigned int interframe_gap;
|
5 |
|
6 | TXen=SEND;
|
7 |
|
8 | interframe_gap=0;
|
9 | //wait until minimal interframe gap is reached
|
10 | while(interframe_gap<5);
|
11 |
|
12 | for( i=0;i<length;i++)
|
13 | {
|
14 | rs485_transmit(*pframe);
|
15 | pframe++;
|
16 |
|
17 | }
|
18 |
|
19 | interframe_gap=0;
|
20 |
|
21 | while(!TI);
|
22 |
|
23 | TXen=RECEIVE;
|
24 |
|
25 | }
|
Das Problem:
Wenn ich jetzt die Funktion rs485_sendframe aufrufe
==> sendframe(tx_frame.byte,sizeof(RS485_FRAME));
werden beim 1. mal nur 16 Byte gesendet. Wenn ich die Funktion danach
ein 2. mal aufrufe werden 18 Byte gesendet (das letzte Byte vom vorigen
Frame und die 17 Byte des aktuellen Frame)
Ich suche den Fehler schon wirklich lange. Vielleicht kann mir ja von
euch jemand helfen. Danke schon für eure Bemühungen.
lg Markus