Cde*_*eez 6 c# multithreading serial-port
我有以下代码,需要从端口读取数据,然后在文本框中显示.我为此目的使用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\"");
    }
Fra*_*ack 13
MSDN包含一篇很好的文章,其中包含有关使用其他线程的控制方法和属性的示例.
简而言之,您需要的是一个委托方法,它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});       
}
| 归档时间: | 
 | 
| 查看次数: | 56671 次 | 
| 最近记录: |