好的,所以我有一个名为 readSensor 的函数,你猜对了……读取传感器。
但传感器通常需要大约 100 毫秒才能做出响应。所以在 readSensor 函数中,我基本上只是在启动一个计时器。
在定时事件中,我读取了串口并得到了回复。
然而,这意味着当我希望它位于 readSensor 函数中时,我的响应位于 onTimedEvent 中。
基本上从我希望能够做到这一点的主要形式。
值 = 读取传感器()
此刻我所能做的就是 readSensor() ,然后一旦 timedEvent 触发,我就可以通过在消息框中显示响应来看到响应正在返回。
这是我的代码。(我错过了很多串口设置和东西,但希望你能看到我遇到的问题)
我不想在函数中等待 100 毫秒,尽管轮询计时器,因为这会使我的程序变慢..
我想以某种方式将响应返回到 readSensor 函数,然后返回到表单。
using System;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;
using System.Timers;
namespace readSensor
{
public partial class readSens : UserControl
{
public readSens()
{
InitializeComponent();
}
private System.Timers.Timer rTimer;
SerialPort sp = new SerialPort();
private void setupTimer()
{
// Create a timer with a 100ms response.
rTimer = new System.Timers.Timer(100);
rTimer.SynchronizingObject = this;
// Hook up the Elapsed event for the timer.
rTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
}
private void OnTimedEvent(object source, ElapsedEventArgs e)
{
string response = getResponse();
}
public string getResponse()
{
string status = "";
byte[] readBuffer = new byte[255];
if (sp.IsOpen)
{
if (sp.BytesToRead > 0) //there is data to read
{
int length = sp.BytesToRead;
for (int i = 0; i < length; i++)
{
readBuffer[i] = (byte)sp.ReadByte();
status = "pass";
return status;
}
}
}
public void readSensor(byte addr)
{
if (!sp.IsOpen)
{
openPort();
readSensor(addr); // calls itself again once port is opened
}
else if (sp.IsOpen)
{
rTimer.Start();
}
else
{
MessageBox.Show("Port not opened yet");
}
}
}
}
在主要形式中,我基本上只是在说
setupTimer();
readSensor();
单击按钮。