如题,小弟做一个读取串口来的数据的程序,串口正常的时候程序都调试通了,偶尔出现串口出现乱七八糟干扰的时候,导致串口短时出问题,不满足串口打开的条件,程序跑飞了。
一直没想到什么好的办法,让程序跑飞以后等几秒钟,利用定时器做比较,然后在定时器的程序中自动恢复正常读取的程序段。
但是一直不会写定时器启动读串口线程的程序段的条件,希望有经验的高手给指点迷津。先谢谢。
下面是小弟的程序大致框架
一直没想到什么好的办法,让程序跑飞以后等几秒钟,利用定时器做比较,然后在定时器的程序中自动恢复正常读取的程序段。
但是一直不会写定时器启动读串口线程的程序段的条件,希望有经验的高手给指点迷津。先谢谢。
下面是小弟的程序大致框架
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来接收并处理很快。
你把你想实现的功能先说一遍吧。
你的ReadSP_writeExcel方法中有一个while,当你的while没跳出来(ReadSP_writeExcel方法还在执行中),假如你的定时器中又触发了一次ReadSP_writeExcel。这时候会出现什么情况真不好说。
串口有一个DataReceived事件很方便。
不清楚你所谓的“不满足串口打开的条件”是什么意思。
又是定时器,又是while还带线程。看着思路不清晰,太混乱了。
首先串口每次过来的数据一般都不多,完全没必要将Data_Process放在线程里面来处理,用DataReceived来接收并处理很快。
你把你想实现的功能先说一遍吧。
20
为何“”设个什么标记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); }