Forum: Mikrocontroller und Digitale Elektronik RS485 Protokoll


von markus (Gast)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.