2014-07-21 12 views
6

मैं भेजने के लिए/सी # के माध्यम से एक स्ट्रिंग प्राप्त करते हैं, सी # में कोशिश कर रहा हूँ मैं सिर्फ कार्य करें:serialport और सीसीएस स्ट्रिंग संचार

SerialPort.WriteLine("A6"); 

लेकिन सीसीएस में, अगर मैं चार के बाद एक स्ट्रिंग चार भेजने की कोशिश यह नहीं है बिल्कुल काम करें, न तो रीडलाइन के साथ और न ही ReadExisting के साथ! यही वह है जिसे मैंने एक सरणी बनाने की कोशिश की है, ताकि जब भी हम आरएक्सबीयूएफएफ प्रज्ञा में प्रवेश करेंगे, हम सरणी को प्राप्त होने तक सरणी में प्राप्त char जोड़ते हैं (मैंने यादृच्छिक रूप से सरणी आकार को 2 होने के लिए परिभाषित किया है, जिसका अर्थ है कि हम 2 से निपटते हैं सी # में

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

: -char-लंबाई तार), और अंततः चार के बाद चार भेजकर स्ट्रिंग भेज

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

मैं प्राप्त गैर भावना पाठ, जैसे: ?? एक ??? कभी-कभी: ???? ए? आदि .., लेकिन साथ:

listBox2.Items.Add(SerialPort.ReadLine()); 
पहली बार मैं भेजें बटन जो "ए 6" भेजता प्रेस में

, मैं कुछ भी नहीं मिलता है, दूसरी बार मैं अच्छी तरह से गैर भावना मिलता है, बस ReadExisting व्यवहार की तरह।

वैसे, भले ही मैं (सरणी और शर्तों के बिना) सबसे आसान तरीका में स्ट्रिंग भेजने का प्रयास करें, मैं इस तरह मतलब है:

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

मैं भी लिस्टबॉक्स में असंगत आइटम मिलता है।

हालांकि, अगर मैं ऐसा करते हैं:

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

मैं "ए 6" लिस्टबॉक्स में मिलता है और सब कुछ ठीक काम (ReadLine और ReadExisting के साथ)! क्या कोई मुझे बता सकता है कि यह क्यों हो रहा है?

+0

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

+0

क्या आपने पुष्टि की है कि बाउड दर, और अन्य गुणों का मिलान किया गया है ऊपर? –

+0

हां! अगर गुणों का मिलान नहीं हुआ था, तो मुझे लगता है कि अंतिम प्रयास काम नहीं करेगा, लेकिन यह काम करता है। क्या तुम मुझसे सहमत नहीं हो? –

उत्तर

1

I'v बस समानता बिट neutralized, सब कुछ अब काम करता है, सबको धन्यवाद!

0

यह इंगित करता है कि आपको आरएक्स आईएसआर के अंदर TX ध्वज की प्रतीक्षा नहीं करनी चाहिए। आरएक्स इंटरप्ट दिनचर्या को केवल एक फीफो बफर (एक बाइट कतार) भरना चाहिए, ताकि आप कहीं और सामग्री (मुख्य दिनचर्या) को पार्स कर सकें, और फिर आवश्यक होने पर प्रतिक्रिया बना सकें।

RX ISR के लिए छद्म कोड होना चाहिए कुछ की तरह:

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

और कहीं main() पाश अंदर आप इसकी सामग्री पार्स कर सकते हैं:

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

आप सही हैं, यह एक फीफो बफ भरता है, और यही वह है जो मैं सरणी का उपयोग कर कर रहा हूं, जिसे मैं अपनी समस्या नहीं सोचता, लेकिन मुझे अभी भी समझ में नहीं आता कि बीच क्या अंतर है आईएसआर में या मुख्य में वर्ण भेजना!वैसे भी मैंने कोशिश की जैसा आपने कहा: http://postimg.org/image/cggftjfdl/ लेकिन यह भी काम नहीं करता है। समानता को बेअसर करने के बाद –

+0

सबकुछ ठीक काम करता है लेकिन केवल आईएसआर रूटीन में और मुख्य में नहीं (केवल पढ़ने के साथ लेकिन रीडलाइन के साथ नहीं), कितना अजीब है! –

संबंधित मुद्दे