每秒钟读一次串口,偶尔出现程序跑飞,想利用定时器去启动读串口的线程,不知道怎么样写条件

.Net技术 码拜 7年前 (2017-04-29) 1712次浏览
如题,小弟做一个读取串口来的数据的程序,串口正常的时候程序都调试通了,偶尔出现串口出现乱七八糟干扰的时候,导致串口短时出问题,不满足串口打开的条件,程序跑飞了。
一直没想到什么好的办法,让程序跑飞以后等几秒钟,利用定时器做比较,然后在定时器的程序中自动恢复正常读取的程序段。
但是一直不会写定时器启动读串口线程的程序段的条件,希望有经验的高手给指点迷津。先谢谢。
下面是小弟的程序大致框架

public void ReadSP_writeExcel()
        {
 while (com.IsOpen == true)
            {   
                thread_DataProcess = new Thread(new ParameterizedThreadStart(Data_Process));//处理读取串口数据的程序
                try
                {
                         //读串口1                            
                            com.Read(Data, 0, num_combuffer);
                            thread_DataProcess.Start(Data);                                                 
                        }
}
}
定时器的程序
 private void timer1_Tick(object sender, EventArgs e)
        {
            flag1_abnormal3 = flag1_abnormal1;
            if ((button_Acquision.Enabled==false) & (?))//读取串口的按钮已经启动,变成不可按状态,同时还需要隔什么条件才能启动程序;本人个人理解想让定时器,连续读几次状态标记位,判断没有标记变化认为没有读到数据,则需要重新启动ReadSP_writeExcel();
            {
                ReadSP_writeExcel();
            }
        }
解决方案

20

见过在while循环中读取串口数据的,但是从来没见过在while循环中开启线程来读取数据的。
你的ReadSP_writeExcel方法中有一个while,当你的while没跳出来(ReadSP_writeExcel方法还在执行中),假如你的定时器中又触发了一次ReadSP_writeExcel。这时候会出现什么情况真不好说。
串口有一个DataReceived事件很方便。
不清楚你所谓的“不满足串口打开的条件”是什么意思。
又是定时器,又是while还带线程。看着思路不清晰,太混乱了。
首先串口每次过来的数据一般都不多,完全没必要将Data_Process放在线程里面来处理,用DataReceived来接收并处理很快。
你把你想实现的功能先说一遍吧。

20

引用:

由于串口可能出现的问题种类比较多,本人觉得不能简单判断串口能否打开
if ((button_Acquision.Enabled==false) & (com.IsOpen==false))
{
ReadSP_writeExcel();
}
感觉测试的时候,有时候说不清楚什么原因,串口也打开着,但是程序确实跑飞了。
本人想利用定时器定时5s,设个什么标记5s内这个标记没有变化,判断读串口的程序没有运行,然后再启动ReadSP_writeExcel();实在不会写这个判断条件,还请高人给指点,这里怎么样处理

为何“”设个什么标记5s内这个标记没有变化,判断读串口的程序没有运行,然后再启动ReadSP_writeExcel()”?
用DataReceived事件,串口有数据过来它就会触发绑定给它的方法,就会自动去接收。不用操心它多少秒内没有什么什么事情发生。

public static void Main()
    {
        SerialPort mySerialPort = new SerialPort("COM1");
        mySerialPort.BaudRate = 9600;
        mySerialPort.Parity = Parity.None;
        mySerialPort.StopBits = StopBits.One;
        mySerialPort.DataBits = 8;
        mySerialPort.Handshake = Handshake.None;
        mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
        mySerialPort.Open();
        Console.WriteLine("Press any key to continue...");
        Console.WriteLine();
        Console.ReadKey();
        mySerialPort.Close();
    }
    private static void DataReceivedHandler(
                        object sender,
                        SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;
        string indata = sp.ReadExisting();
        Console.WriteLine("Data Received:");
        Console.Write(indata);
    }

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明每秒钟读一次串口,偶尔出现程序跑飞,想利用定时器去启动读串口的线程,不知道怎么样写条件
喜欢 (0)
[1034331897@qq.com]
分享 (0)