2012-07-20 15 views
10

में बफर प्राप्त करें बस यह जानना चाहते हैं कि हम सी # में अपने सीरियल पोर्ट के प्राप्त बफर को कैसे साफ़ करते हैं। ऐसा लगता है कि प्राप्त बफर में डेटा जमा हो रहा है। उदाहरण के लिए, आने वाले डेटा का प्रवाह है: [डेटा ए], [डेटा बी], [डेटा सी]। जो डेटा मैं चाहता हूं वह सिर्फ [डेटा सी] है। मैं ऐसा करने की सोच रहा हूं, जब मुझे [डेटा ए] और [डेटा बी] प्राप्त होता है, तो मैं एक स्पष्ट बफर करता हूं। केवल जब [डेटा सी] प्राप्त होता है, मैं प्रक्रिया जारी रखता हूं। क्या यह सी # में ऐसा करने का तरीका है?साफ़ सीरियल पोर्ट सी #

+0

आप धारावाहिक बंदरगाह का उपयोग कैसे कर रहे हैं? क्या आप 'System.IO.Ports.SerialPort' का उपयोग कर रहे हैं? – Dai

उत्तर

12

आप System.IO.Ports.SerialPort उपयोग कर रहे हैं तो आपके पास दो तरीकों का उपयोग कर सकते हैं:

DiscardInBuffer() और DiscardOutBuffer() बफ़र्स फ्लश करने के लिए।

आप एक सीरियल पोर्ट से डाटा पढ़ने कर रहे हैं:

private void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
    if (!this.Open) return; // We can't receive data if the port has already been closed. This prevents IO Errors from being half way through receiving data when the port is closed. 
    string line = String.empty; 
    try 
    { 
     line = _SerialPort.ReadLine(); 
     line = line.Trim(); 
     //process your data if it is "DATA C", otherwise ignore 
    } 
    catch (IOException ex) 
    { 
     //process any errors 
    } 
} 
+0

सहायता के लिए धन्यवाद। मेरा ट्रांसमीटर हमेशा डेटा संचारित करेगा। क्या यह है कि मेरा सी # प्रोग्राम प्राप्तकर्ता हमेशा प्रक्रिया के लिए डेटा प्राप्त नहीं कर रहा है। यदि मैंने डेटा को संसाधित नहीं किया है, तो प्राप्त बफर डेटा को सही तरीके से जमा करेगा? तो क्या यह है कि जब मैं प्राप्त डेटा संसाधित नहीं कर रहा हूं तो मुझे हमेशा DiscardInBuffer() करना होगा? – maniac84

+0

@ maniac84 हां यह ठीक होना चाहिए। वैकल्पिक रूप से आप बफर पढ़ सकते हैं, और अपने एप्लिकेशन तर्क में, प्राप्त डेटा को अनदेखा कर सकते हैं। क्या हमेशा एक समान समाप्ति चरित्र होता है? मेरा संपादन देखें। – Simon

7

उपयोग port.DiscardOutBuffer(); and port.DiscardInBuffer(); सीरियल पोर्ट बफ़र्स

2

स्पष्ट करने के लिए आप की तरह

port.DiscardOutBuffer(); 
port.DiscardInBuffer(); 
port.Close(); 
port.DataReceived -= new SerialDataReceivedEventHandler(onDataReceived); 
port = null; 
2

उपयोग कर सकते हैं दो बफ़र्स रहे हैं। एक बफर सीरियल पोर्ट से जुड़ा होता है और दूसरा इसकी बेस स्ट्रीम के साथ होता है, जहां पोर्ट बफर से डेटा स्ट्रीम किया जाता है। डिस्कार्ड इन बफर() को केवल सीरियल पोर्ट बफर से डेटा हटा दिया जाता है। बेस स्ट्रीम में अभी भी डेटा है जिसे आप पढ़ेंगे। तो, DiscardInBuffer का उपयोग करने के अलावा, SP.BaseStream.Flush() का भी उपयोग करें। अब आपके पास एक साफ स्लेट है! यदि आपको बहुत अधिक डेटा नहीं मिल रहा है, तो बस बेस स्ट्रीम से छुटकारा पाएं: SP.BaseStream.Dispose()।

चूंकि आपको अभी भी डेटा प्राप्त होने वाला ईवेंट मिल रहा है, इसलिए आप इसे पढ़ सकते हैं और खुद को डेटा खोने की खतरे में डाल सकते हैं।

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