【问题标题】:Read Serial Port in every X seconds每 X 秒读取一次串口
【发布时间】: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


【解决方案1】:

每次读取后我都会更改代码并关闭端口

internal class GetPortTetheredHelper
    {
        private static int second;
        private static SerialPort sp;
        public static void RunTimer()
        {
            second = 4 * 1000;
            sp = new SerialPort();
            var timer = new Timer(SetupSerialPort, null, 0, second);
        }

        public static void SetupSerialPort()
        {
            sp.PortName = PortCom();
            sp.BaudRate = 57600;
            sp.DataBits = 8;
            sp.StopBits = StopBits.One;
            sp.Parity = Parity.None;
            sp.Open();
            // this code need more check to sp is opened
            if (sp.IsOpen)
            {
                var serailData= sp.ReadLine();
                sp.Close();
            }
            
        }

        private static string PortCom()
        {
            string[] ports = SerialPort.GetPortNames();
            return ports[0];
        }

        
    }

【讨论】:

    猜你喜欢
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 2018-12-19
    • 2018-07-10
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多