2012-07-21 13 views
5

के डेटा रिसीव किए गए ईवेंट हैंडलर में डेटा को कैसे प्रदर्शित किया जाए, मेरे पास निम्न कोड है जिसे पोर्ट से पढ़ने के लिए डेटा की आवश्यकता होती है और फिर टेक्स्टबॉक्स में प्रदर्शित होती है। मैं इस उद्देश्य के लिए DataReceived ईवेंट हैंडलर का उपयोग कर रहा हूं लेकिन यह नहीं पता कि टेक्स्टबॉक्स में इस डेटा को कैसे प्रदर्शित किया जाए। विभिन्न स्रोतों से मैंने सीखा कि इसके लिए Invoke विधि का उपयोग किया जाना चाहिए, लेकिन यह नहीं पता कि इसका उपयोग कैसे किया जाए। सुझाव कृपया ...सीरियलपोर्ट

private void Form1_Load(object sender, EventArgs e) 
    { 
     //SerialPort mySerialPort = new SerialPort("COM3"); 
     mySerialPort.PortName = "COM3"; 
     mySerialPort.BaudRate = 9600; 
     mySerialPort.Parity = Parity.None; 
     mySerialPort.StopBits = StopBits.One; 
     mySerialPort.DataBits = 8; 
     mySerialPort.Handshake = Handshake.None; 
     mySerialPort.DataReceived += new SerialDataReceivedEventHandler(mySerialPort_DataReceived); 
     mySerialPort.Open(); 
    } 

    private void mySerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) 
    { 
     SerialPort sp = (SerialPort)sender; 
     string s= sp.ReadExisting(); 
     // next i want to display the data in s in a textbox. textbox1.text=s gives a cross thread exception 
    } 
    private void button1_Click(object sender, EventArgs e) 
    { 

     mySerialPort.WriteLine("AT+CMGL=\"ALL\""); 

    } 
+0

मैंने आपके नमूना कोड का प्रयास किया है और इस धागे के आधार पर सरल सी # समाधान बनाया है। मैं अपने मॉडेम में 'डेटा रिसीव' नहीं पढ़ सका। मैं संतुलन की जांच के लिए वेवकोम मॉडेम का उपयोग कर रहा हूँ। कृपया इसे ठीक करने में मेरी मदद करें? – aminvincent

उत्तर

10

MSDN अन्य धागे से नियंत्रण के तरीकों और गुण का उपयोग कर के बारे में उदाहरण के साथ एक अच्छा article शामिल हैं।

संक्षेप में, आपको जो चाहिए वह एक प्रतिनिधि विधि है जो किसी दिए गए स्ट्रिंग के साथ आपके टेक्स्ट बॉक्स की Text प्रॉपर्टी सेट करती है। फिर आप mySerialPort_DataReceived हैंडलर के भीतर TextBox.Invoke() विधि के माध्यम से उस प्रतिनिधि को कॉल करें। कुछ ऐसा:

public delegate void AddDataDelegate(String myString); 
public AddDataDelegate myDelegate; 

private void Form1_Load(object sender, EventArgs e) 
{ 
    //... 
    this.myDelegate = new AddDataDelegate(AddDataMethod); 
} 

public void AddDataMethod(String myString) 
{ 
    textbox1.AppendText(myString); 
} 

private void mySerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
    SerialPort sp = (SerialPort)sender; 
    string s= sp.ReadExisting(); 

    textbox1.Invoke(this.myDelegate, new Object[] {s});  
} 
+0

यह काम किया .. धन्यवाद फ्रैंक !! – Cdeez

2

इस (मेरे लिए काम करता है) का प्रयास करें:

private delegate void UpdateUiTextDelegate(string text); 

private void Receive(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 
{ 
    if (mySerialPort.IsOpen) 
    { 
     RxString = mySerialPort.ReadLine(); 
     Dispatcher.Invoke(DispatcherPriority.Send, new UpdateUiTextDelegate(DisplayText), RxString); 
    } 
} 

private void DisplayText(string RxString) 
{ 
    myTextBox.Text = RxString; 
} 
1

मैं यूएसबी COM पोर्ट्स के लिए एक जीयूआई "फॉर्म" बना रहा हूं। इस प्रकार मैं "क्रॉस-थ्रेड" त्रुटि प्राप्त किए बिना विंडो में डेटा भेजता हूं।

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
    string inData = serialPort1.ReadLine(); // ReadLine includes the + "\n" 
    displayToWindow(inData); 
} 

private void displayToWindow(string inData) 
{ 
    BeginInvoke(new EventHandler(delegate 
    { 
     richTextBox1.AppendText(inData); 
     richTextBox1.ScrollToCaret(); 
    })); 
} 
संबंधित मुद्दे