2014-07-21 16 views
6
C#, göndermek/C# ile bir dize almaya çalışıyorum

ben sadece do i Char sonra bir dize kömürü göndermeyi deneyin eğer SerialPort & CCS dize Haberleşme

SerialPort.WriteLine("A6"); 

ama CCS içinde

, öyle değil ReadLine veya ReadExisting ile hiç çalışmayın! RXBUFF pragma'ya her girdiğimizde bu, diziyi doldurana kadar diziye alınan char'i ekledik (dizi boyutu 2'ye rastgele tanımladım, yani 2 ile başa çıkacağız demektir) -Char uzunlukta dizeler) ve sonunda Char sonra kömürü göndererek dize gönderin:

#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]; 
    } 
} 

C#:

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

i almak gibi non-sense metin,: ?? A ??? bazen: ???? vs .. ama birlikte i "A6" gönderir Gönder düğmesine basın ilk kez

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

i hiçbir şey elde, sadece ReadExisting davranışı gibi, lutfen olmayan fikir edinmek ikinci kez. i (dizide ve şartlar olmaksızın) en kolay şekilde dize göndermeyi deneyin bile arada

, ben böyle demek: ben de liste kutusunda tutarsız öğeleri almak

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

.

Ancak, ben yaparsam:

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

i liste kutusunda "A6" olsun ve herşey (taleb ve ReadExisting ile) iyi çalışır! kimse bunun neden olduğunu bana söyleyebilir mi?

+0

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

+0

Baud Oranının ve diğer özelliklerin eşleştirildiğini onayladınız mı? yukarı? –

+0

Evet! özellikler eşleşmediyse, sanırım son deneme işe yaramazdı, ama işe yarıyor. benimle aynı fikirde değil misin? –

cevap

1

, şimdi her şey çalışıyor, hepinize teşekkür ederim!

0

Bu, RX ISR içindeki TX bayrağını beklememeniz gerektiğini belirtir. RX kesme rutini sadece bir FIFO arabelleğini (bir bayt kuyruğu) doldurmalı, böylece içeriğini başka bir yerde (ana rutin?) Ayrıştırıp gerektiğinde bir yanıt oluşturabilirsiniz. RX ISR için

Sözde kodu olması gereken bir şey gibi:

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

Ve bir yerlerde main() döngü içinde içindekileri ayrıştırabileceğiniz:

while (1) 
{ 
    // find the first occurrence of "A6" and dequeue it 
    if (FIFO_StartsWith(&RxBuffer, "A6") 
     SendResponse(); 
} 
I'v sadece Parite biti nötralize
+1

Haklısınız, bir FIFO buff'ını dolduruyor, ve ben de bu problemi düşünmüyorum diziyi kullanarak yapıyorum, ama hala aradaki farkın ne olduğunu anlamıyorum. charları ISR'ye veya ana yola göndermek!Her neyse dediğin gibi denedim: http://postimg.org/image/cggftjfdl/ ama işe yaramıyor. –

+0

Parite biti nötralize ettikten sonra her şey gayet iyi çalışıyor, ama sadece ISR rutininde ve ana değil de (sadece ReadExisting ile fakat ReadLine ile değil), ne kadar tuhaf! –