Forum: Mikrocontroller und Digitale Elektronik MSP430 USART String senden


von Rotschi H. (hoschis)


Lesenswert?

Servus, habe folgendes Problem. Mein USART läuft RX/TX Interrupts, beim 
Senden von mehreren Symbolen, klappt leider immer nur eines. Ich kann ja 
nicht die Abfrage
1
while(!(IFG2 & UTXIFG1));
 machen wann ich was ins TX Sende Register schreiben kann, denn das 
funktioniert bei INterrupts ja nicht.

Daher sende ich über meine funktion SendUSART:
1
void SendUSART1(char* str)             // einen string über die serielle schnittstelle (USART1) senden
2
{
3
  for(int zaehl = 0; zaehl < sizeof str; zaehl++)
4
  {
5
    send_tx[zaehl] = str[zaehl];
6
  }
7
  TXBUF1 = send_tx[0];
8
}
Und zähle dann in meiner interrupt senderoutine das array durch, und 
lasse den ersten wert weg. leider funktioniert das nicht ?!?
1
#pragma vector=UART1TX_VECTOR           //Transmitting - Interrupt-Routine
2
__interrupt void usart1_tx (void)
3
{
4
    for(int zaehl = 1; zaehl < sizeof send_tx; zaehl++)
5
  {
6
    TXBUF1 = send_tx[zaehl];
7
  }
8
}

von Johnny Maxwell (Gast)


Lesenswert?

Wozu brauchst du denn eigentlich TX Interrupts?

von Christian R. (supachris)


Lesenswert?

Kann ja nicht klappen. Du sendest ja alle Zeichen gleich hintereinander 
weg, wenn du per TX-Int benachrichtigt wurdest, dass du ein Zeichen 
senden darfst. Wenn schon mit TX-Int, dann musst du dir eine globale 
volatile Variable anlegen, die die Position im Sende-Array anzeigt, und 
dann per TX-ISR immer nur ein zeichen senden und diese Variable 
hochzählen.

Aber warum TX-ISR? Hast du in der Zwischenzeit so viel anderes mit der 
CPU zu tun?

von Christian R. (supachris)


Lesenswert?

Übrigens noch ein 2. Fauxpas: Du sendest, abgesehn von dem Fehler, den 
ich beschrieben habe, immer das gesamte Array, egal wieviele Zeichen die 
USART_Send reingeschrieben hat.

von Tom D. (toolmmy)


Lesenswert?

Hi,

ich versteh nich so ganz warum deine Funktion mit nem Pointer arbeitet, 
wenn du ihn nie verwendest. So wie deine Funktion ausschaut kannste 
einfach mit dem Pointer arbeiten. z.B so:
1
void SendUSART1(char* str)             // einen string über die serielle schnittstelle (USART0) senden
2
{
3
  while (*str != 0)
4
  {
5
    while (!(IFG2 & UTXIFG1));         // warten, bis USART0 TX-buffer sendebereit
6
    TXBUF1 = *str++;                   //senden des aktuellen wertes, auf dem der Pointer zeigt und anschliessend addieren um 1 (naechster wert)
7
  } 
8
}

und als test, lässt du ueber dein ISR von der URXD immer was ausgeben. 
z.b.:
1
#pragma vector = UART1RX_VECTOR
2
__interrupt void usart1_rx(void)
3
{
4
   sendUSART1("Ich bin ein UART1RX_ISR");
5
}
so läuft das meiner meinung nach wunderbar :)

mfg

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.