我在通信类下有一个函数
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/