serialPort_DataReceived事件的问题

本文关键字:问题 事件 DataReceived serialPort | 更新日期: 2023-09-27 18:36:11

>我在类通信下有一个函数

    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;

在函数串行通信中,然后控制才转到函数_serialPort_DataRecieved,函数由事件触发。如何使整个过程同步,这意味着只有在执行函数_serial_DataRecieved后,才应该从函数 serialCommunication 返回 readData。

serialPort_DataReceived事件的问题

请注意

,由于串行端口异步工作,因此以下方法不正确。另一方面,无论如何它都可以完成这项工作。

只需添加一个 boolen 属性并在从 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;
}