2013-04-25 5 views
8

मैं अपने सीरियल पोर्ट को पढ़ना चाहता हूं लेकिन केवल तभी जब डेटा आता है (मैं मतदान नहीं करना चाहता)।सी # डेटा सीरियल पोर्ट पढ़ता है जब डेटा आता है

इस तरह मैं इसे करता हूं।

   Schnittstelle = new SerialPort("COM3"); 
       Schnittstelle.BaudRate = 115200; 
       Schnittstelle.DataBits = 8; 
       Schnittstelle.StopBits = StopBits.Two; 
      .... 

और फिर मैं एक धागा शुरू

   beginn = new Thread(readCom); 
      beginn.Start(); 

और मेरी readCom मैं निरंतर (मतदान :()

private void readCom() 
    { 

     try 
     { 
      while (Schnittstelle.IsOpen) 
      { 

       Dispatcher.BeginInvoke(new Action(() => 
       { 

        ComWindow.txtbCom.Text = ComWindow.txtbCom.Text + Environment.NewLine + Schnittstelle.ReadExisting(); 
        ComWindow.txtbCom.ScrollToEnd(); 
       })); 

       beginn.Join(10); 

      } 
     } 
     catch (ThreadAbortException) 
     { 

     } 

     catch (Exception ex) 
     { 
      System.Windows.Forms.MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
    } 

मैं yout पढ़ चाहते हैं जब एक इंटरप्ट आ रहा है पढ़ रहा हूँ लेकिन मैं यह कैसे कर सकता हूं?

उत्तर

31

आपको डेटा रिसीव किए गए ईवेंट में एक ईवेंट हैडलर जोड़ना होगा।

नीचे msdn.microsoft.com से एक उदाहरण है, कुछ संपादन के साथ: टिप्पणियों को देखने के:

public static void Main() 
{ 
    SerialPort mySerialPort = new SerialPort("COM1"); 

    mySerialPort.BaudRate = 9600; 
    mySerialPort.Parity = Parity.None; 
    mySerialPort.StopBits = StopBits.One; 
    mySerialPort.DataBits = 8; 
    mySerialPort.Handshake = Handshake.None; 

    mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); 

    mySerialPort.Open(); 

    Console.WriteLine("Press any key to continue..."); 
    Console.WriteLine(); 
    Console.ReadKey(); 
    mySerialPort.Close(); 
} 

private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) 
{ 
    SerialPort sp = (SerialPort)sender; 
    string indata = sp.ReadExisting(); 
    Debug.Print("Data Received:"); 
    Debug.Print(indata); 
} 

हर डेटा में आता है, DataReceivedHandler ट्रिगर किया जाएगा और कंसोल के लिए अपने डेटा प्रिंट करता है। मुझे लगता है कि आप इसे अपने कोड में करने में सक्षम होना चाहिए।

+1

यह उदाहरण कोड .NET 4.5 में उपयोग करने के लिए अधिक सुरक्षित नहीं है। Console.ReadKey() एक लॉक प्राप्त करता है जो Console.Write() को कुछ भी लिखने से रोकता है। डीबग.प्रिंट() ठीक है। –

+0

मैं इसे संपादित कर दूंगा! धन्यवाद! –

+0

@ हंसपैसेंट इसके लिए धन्यवाद। उसने एमएसडीएन पर कई थ्रेडिंग उदाहरणों को तोड़ दिया होगा :) – kenny

5

आपको पोर्ट खोलने से पहले डेटा रिसीव किए गए ईवेंट की सदस्यता लेने की आवश्यकता है, फिर ट्रिगर होने पर उस ईवेंट को सुनें।

private void OpenSerialPort() 
    { 
     try 
     { 
      m_serialPort.DataReceived += SerialPortDataReceived; 
      m_serialPort.Open(); 
     } 
     catch (Exception ex) 
     { 
      System.Diagnostics.Debug.WriteLine(ex.Message + ex.StackTrace); 
     } 
    } 

    private void SerialPortDataReceived(object sender, SerialDataReceivedEventArgs e) 
    { 
     var serialPort = (SerialPort)sender; 
     var data = serialPort.ReadExisting(); 
     ProcessData(data); 
    } 

सीरियल, वहाँ बफर में डेटा मौजूद हो, डेटा प्राप्त घटना शुरू हो रहा है, इसका मतलब यह नहीं है कि आप एक साथ अपने सभी डेटा मिला है। आपको अपने सभी डेटा प्राप्त करने के लिए कई बार इंतजार करना पड़ सकता है; यह वह जगह है जहां आपको अंतिम डेटा को संसाधित करने से पहले प्राप्त डेटा को अलग करने की आवश्यकता होती है, शायद उन्हें कहीं कहीं कैश पर रखें।

+0

मुझे पता है कि यह 3 साल बाद है, लेकिन आपके उदाहरण में क्यों नहीं 'नया सीरियलडाटा रीसेवेडइवेंट हैंडलर (सीरियलपोर्टडाटा रीसाइज्ड) शामिल है, लेकिन उपरोक्त उत्तर क्या करता है? क्या इससे कोई फर्क पड़ता है? –

+0

मेरा वाक्यविन्यास सी # 2.0 और ऊपर से है। यह सी # 1.0 सिंटैक्स के बराबर है जिसमें encapsulating प्रतिनिधि को नए कीवर्ड का उपयोग करके स्पष्ट रूप से बनाया जाना चाहिए। – Jegan

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