c# - SerialPort_DataReceived 事件的问题

标签 c# events serial-port

我在通信类下有一个函数

    public int SerialCommunciation()
    {
        /*Function for opening a serial port with default settings*/
        InitialiseSerialPort();

        /*This section of code will try to write to the COM port*/   
        WriteDataToCOM();

        /*An event handler */                   
       _serialPort.DataReceived += new SerialDataReceivedEventHandler(_serialPort_DataReceived);

       return readData;
    }

这里

     int readData /*is a global variable*/

_serialPortDataRecieved()根据从串口读取的数据更新变量readData

   /* Method that will be called when there is data waiting in the buffer*/
    private void _serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {

       string text = _serialPort.ReadExisting();
       int.TryParse(text, out readData);

    }

现在当我从另一个类调用这个函数时

   valueReadFromCom=Communication.SerialCommunication()

我需要获取从串行端口读取的值,但我得到的是 0。 当我尝试调试这段代码时,我发现控制首先转到语句

   return readData;

在函数 SerialCommunication 中,只有这样控制权才会转到函数 _serialPort_DataRecieved,该函数由事件触发。我怎样才能使整个过程同步,这意味着只有在执行函数_serial_DataRecieved之后才应该从函数serialCommunication返回readData。

最佳答案

请注意,以下方法不是正确的方法,因为串行端口是异步工作的。另一方面,它无论如何都能完成这项工作。

只需添加一个 bool 属性并在从 SerialCommunication 函数返回之前检查该属性;收到数据时将此属性设置为 true。

private bool dataReceived = false;   

public int SerialCommunciation()
{
    /*Function for opening a serial port with default settings*/
    InitialiseSerialPort();

    /*This section of code will try to write to the COM port*/
    WriteDataToCOM();

    /*An event handler */
    _serialPort.DataReceived += new SerialDataReceivedEventHandler(_serialPort_DataReceived);

    while (!dataReceived)
    {
        Thread.Sleep(1000);
    }
    return readData;
}

private void _serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
   string text = _serialPort.ReadExisting();
   int.TryParse(text, out readData);
   _serialPort_DataReceived = true;
}

关于c# - SerialPort_DataReceived 事件的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10848325/

相关文章:

c# - 使用 AWS SDK 和 Moq 时无法对 Mock 的对象进行类型转换

c# - 使用 IoC 将依赖项注入(inject)基类和子类?

android - 如何检测应用程序编辑文本中的粘贴事件?

ios - 当 iOS 应用程序从应用程序切换器中滑动时调用哪个事件?

C# SerialPort不支持高波特率

c# - 尝试存储 ListView ID

c# - 可以在遍历列表时修改列表吗?

javascript - 如何将事件处理程序绑定(bind)到 jQuery 中的实例?

android - android智能手机3.5mm音频口RS232串口信号输入(android开发)

c++ - 如何将信息从启动器传递到我的程序?