2012-07-21 22 views
5

Tôi có mã sau cần dữ liệu được đọc từ cổng và sau đó hiển thị trong hộp văn bản. Tôi đang sử dụng xử lý sự kiện DataReceived cho mục đích này nhưng donot biết làm thế nào để hiển thị dữ liệu này trong hộp văn bản. Từ nhiều nguồn khác nhau, tôi đã học được rằng phương thức Invoke nên được sử dụng cho điều này nhưng donot biết cách sử dụng nó. Gợi ý xin vui lòng ...Cách hiển thị dữ liệu đã đọc trong trình xử lý sự kiện được nhận dữ liệu của cổng nối tiếp

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

tôi đã thử mã mẫu của bạn và xây dựng giải pháp C# đơn giản dựa trên chủ đề này. tôi không thể đọc 'DataReceived 'trong modem của mình. Tôi đang sử dụng modem wavecom để kiểm tra số dư. Giúp tôi để sửa nó? – aminvincent

Trả lời

10

MSDN chứa một tốt article với các ví dụ về việc sử dụng phương pháp kiểm soát và tài sản từ chủ đề khác.

Tóm lại, những gì bạn cần là phương thức đại biểu đặt thuộc tính Text của hộp văn bản của bạn bằng một chuỗi nhất định. Sau đó, bạn gọi đại biểu đó từ bên trong trình xử lý mySerialPort_DataReceived của bạn qua phương thức TextBox.Invoke(). Một cái gì đó như thế này:

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

Nó hoạt động .. Cảm ơn thẳng thắn !! – Cdeez

2

Hãy thử điều này (chỉ hoạt động đối với tôi):

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

Tôi đang tạo GUI "Biểu mẫu" cho cổng USB COM. Đây là cách tôi gửi dữ liệu đến cửa sổ mà không nhận được lỗi "Cross-Thread".

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(); 
    })); 
} 
Các vấn đề liên quan