2014-07-21 19 views
6

Sto cercando di inviare/ricevere una stringa tramite C#, in C# Io proprio:SerialPort & CCS stringa di comunicazione

SerialPort.WriteLine("A6"); 

ma in CCS, se provo l'invio di un char stringa dopo char non lo fa funziona affatto, né con ReadLine né con ReadExisting! Questo è quello che ho provato a creare un array, così ogni volta che inseriamo il prax RXBUFF, aggiungiamo il char ricevuto all'array, fino a quando l'array è pieno (ho definito a caso la dimensione dell'array per essere 2, il che significa che ci occuperemo di 2 -char stringhe di lunghezza), ed eventualmente inviare la stringa con l'invio di char dopo char:

#pragma vector = USCI_A1_VECTOR 
__interrupt void USCI_A1_ISR(void) 

if(__even_in_range(UCA1IV,18) == 0x02){   // Vector 2 - RXIFG 
    if(counter==0) 
    { 
     Data[0]=UCA1RXBUF; 
     counter++; 
    } 
    else 
    { 
     Data[1]=UCA1RXBUF; 
     counter=0; 
     UCA1TXBUF=Data[0]; 
     while(!(UCA1IFG & UCTXIFG)); // until UCTXBUF1 is empty 
     UCA1TXBUF=Data[1]; 
    } 
} 

in C#:

listBox2.Items.Add(SerialPort.ReadExisting()); 

ottengo il testo non-senso, come: ?? a ??? a volte: ???? A? ecc .., ma con:

listBox2.Items.Add(SerialPort.ReadLine()); 

in un primo tempo i premere il pulsante Invia che invia il "A6", ottengo nulla, la seconda volta che ottengo non-senso aswell, proprio come il comportamento ReadExisting.

tra l'altro, anche se cerco di inviare la stringa nel modo più semplice (senza matrice e condizioni), voglio dire in questo modo:

#pragma vector = USCI_A1_VECTOR 
__interrupt void USCI_A1_ISR(void) 
     UCA1TXBUF='A'; 
     while(!(UCA1IFG & UCTXIFG)); // until UCTXBUF1 is empty 
     UCA1TXBUF='6'; 

Ho anche elementi inconsistenti nella casella di riepilogo.

Tuttavia, se faccio questo:

#pragma vector = USCI_A1_VECTOR 
__interrupt void USCI_A1_ISR(void) 
UCA1TXBUF=UCA1RXBUF; 

io capisco "A6" nella casella di riepilogo e tutto solo funzionano bene (con ReadLine e ReadExisting)! qualcuno potrebbe dirmi semplicemente perché questo sta accadendo?

+0

http://electronics.stackexchange.com/questions/71810/uart-is-garbled-when-running-at-more-than-9600-bps –

+0

Hai confermato che il Baud Rate e altre proprietà sono abbinate su? –

+0

Sì! se le proprietà non sono state abbinate, credo che l'ultimo tentativo non avrebbe funzionato, ma funziona. non sei d'accordo con me? –

risposta

1

I'v appena neutralizzato il bit di parità, tutto funziona ora, grazie a tutti!

0

Ciò indica che non si deve attendere il flag TX all'interno dell'ISR RX. La routine di interrupt RX dovrebbe semplicemente riempire un buffer FIFO (una coda di byte), in modo da poterne analizzare il contenuto da qualche altra parte (routine principale?), E quindi creare una risposta quando necessario.

pseudo codice per la RX ISR dovrebbe essere qualcosa di simile:

#pragma vector = USCI_A1_VECTOR 
__interrupt void USCI_A1_ISR(void) 
FIFO_Enqueue(&RxBuffer, UCA1RXBUF); 

E da qualche parte all'interno del ciclo main() è possibile analizzare il suo contenuto:

while (1) 
{ 
    // find the first occurrence of "A6" and dequeue it 
    if (FIFO_StartsWith(&RxBuffer, "A6") 
     SendResponse(); 
} 
+1

Hai ragione, riempie un buff FIFO, ed è quello che sto facendo usando l'array, che non penso sia il problema, ma non riesco ancora a capire qual è la differenza tra inviando i caratteri nell'ISR o in main!comunque ho provato come hai detto: http://postimg.org/image/cggftjfdl/ ma non funziona bene. –

+0

dopo aver neutralizzato il bit Parity tutto funziona bene ma solo in routine ISR e non in main (anche solo con ReadExisting ma non con ReadLine), che strano! –