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