【发布时间】:2021-10-03 07:46:02
【问题描述】:
我想每 4 秒执行一次我的 SetupSerialPort 方法。
在做了一些研究之后,我认为我需要使用计时器。但似乎计时器方法给了我一条错误消息(+ 在评论中突出显示:
Argument 1 : can't convert from "method group" to "Timer Callback"
internal class GetPortTetheredHelper
{
private static int second;
public static void RunTimer()
{
second = 4 * 1000;
var timer = new Timer(SetupSerialPort, null, 0, second);
// Argument 1 : can't convert from "method group" to "Timer Callback"
}
public static void SetupSerialPort(SerialPort sp)
{
sp.PortName = PortCom();
sp.BaudRate = 57600;
sp.DataBits = 8;
sp.StopBits = StopBits.One;
sp.Parity = Parity.None;
sp.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
sp.Open();
}
private static string PortCom()
{
string[] ports = SerialPort.GetPortNames();
return ports[0];
}
private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
if (sp.IsOpen)
{
sp.ReadLine();
}
}
}
【问题讨论】:
-
您希望在哪里创建
SerialPort以传递给您的SetupSerialPort方法? (您没有包含任何using指令,因此我们无法判断您指的是哪个Timer类,这也使得您更难帮助您完成其他操作。我怀疑它是 System.Threading.Timers。) -
请注意,要使
SetupSerialPort可转换为TimerCallback,如果您使用可空引用类型,则需要void SetupSerialPort(object state)或void SetupSerialPort(object? state)的签名。 -
@JonSkeet 对不起,我的意思是我的
SetupSerialPort方法不是SerialPort和这个Timer类我一直在使用System.Threading; -
确实应该这样做 - 如果您将声明更改为
public static void SetupSerialPort(object state),Timer构造函数将编译。 (我刚刚尝试过。)但是你需要在你的方法中声明sp,并在那里创建一个新的SerialPort。 -
@Wavesolid:每 4 秒从串行端口读取数据与每 4 秒打开数据不同。我怀疑你最好打开一次,然后每隔 4 秒调用一次
ReadExisting。
标签: c# serial-port