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