无法点击Serial DataReceived Event?

时间:2015-03-27 03:06:55

标签: c# serial-port

所有这些都来自我想在.Net中使用 SerialPort类的想法,但唯一的方法是调用dll。因为我只能从调用此dll的程序中获取接口。 mycode在下面。

我写了一篇关于serialport的课程,

public class CommClass
{
    public SerialPort _port;
    private string _receivedText;
    public string receivedText
    {
        get { return _receivedText; }
        set
        {
            _receivedText = value;
        }
    }
    public CommClass(string _pname)
    {
        portList = SerialPort.GetPortNames();
        _port = new SerialPort(portList[0]);
        if (portList.Length < 1)
            _port= null;
        else
        {
            if(portList.Contains(_pname.ToUpper()))
            { 
                _port = new SerialPort(_pname);
                _port.DataReceived += new SerialDataReceivedEventHandler(com_DataReceived);
             }
        }
    }
    private  void com_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        string indata = _port.ReadExisting();
        receivedText = indata;
    }
}

来自 Bytestoread 我可以看到有数据进来,我可以从端口获取数据。 ReadExisting(),但是receiveText没有改变,它没有点击 SerialDataReceived事件。我的方式错了吗?有什么建议吗?谢谢

我从CommClass创建了一个dll,然后我在我的winform程序中调用它,该程序有一个按钮和一个文本框。单击按钮,然后初始化端口

public Form1()
    {
        InitializeComponent();
    }

    public CommClass mycom;
private void button1_Click(object sender, EventArgs e)
    {
       mycom = new CommClass("com3");
       mycom._port.Open();
       textbox.Text=mycom.receivedText;//i add a breakpoint at this line ,
    }
点击它时,我检查mycom._port.PortName是“com3”,它的IsOpen()是“打开”,我使用虚拟端口发送数据。我发送“1111”,然后检查mycom._port.BytestoRead是4,mycom._port.ReadExisting()是“1111”,但mycom.receivedText为空。我的难题是我不知道数据何时到来。如何在我的winform中使用DataReceived事件而不使用代码“使用System.Io.Ports ”,只需使用参考CommClass.dll。我说清楚了吗?谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

   mycom._port.Open();
   textbox.Text=mycom.receivedText;//i add a breakpoint at this line ,

该代码无法正常工作,它是一个线程竞争错误。打开端口后,DataReceived事件不会立即触发 。它需要一微秒左右,给予或接受。线程池线程必须开始触发事件。当然,设备实际上必须发送一些东西,它们通常只在你首先发送东西时这样做。

显然没有发生,您的DataReceived事件处理程序也有错误。由于它在工作线程上运行,因此不允许更新该事件中控件的Text属性。您的程序将使用InvalidOperationException进行轰炸。

你必须写下这样的东西:

private void com_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    string indata = _port.ReadExisting();
    this.BeginInvoke(new Action(() => {
         textbox.AppendText(indata);
    }));
}

有了额外的规定,你不能这样做,更新TextBox的Text属性并使其在屏幕上可见是一项昂贵的操作,当设备启动时,它会使你的用户界面紧张变通以高速率传输数据。