MSP430 USART String senden

OP #831406
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
}
#831628
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?
#866045
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren