【实例简介】
有些下位机通过串口显示交互信息(可能是一次性,可能开机自动触发),上位机需要从中查找指定定关键字。这个时候就需要有一个能够实时接收并显示,并能够实时“等待”某个关键字,TerminalWaiter就是为此而来。
【实例截图】
【核心代码】
private void button1_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(textBox1.Text))
{
richTextBox1.AppendText("Textbox content can not be null!\r\n");
textBox1.Focus();
return;
}
Thread thd = new Thread(new ThreadStart(Test));
thd.Start();
}
private void Test()
{
IsStoppingDataReceive = true;
bool rst = COMWaitStr(textBox1.Text, (int)(numericUpDown1.Value * 1000));
IsStoppingDataReceive = false;
Console.WriteLine("rst: " rst);
}
public bool COMWaitStr(string WaitStr, int ms_TimeOut)
{
MyLib.COMMFunc.AppendText(richTextBox1, "\r\nWAIT " WaitStr " ...\r\n\r\n");
int i = 0;
while (i < ms_TimeOut / 200)
{
string Readrst = "";
if (CHKComPortRead(WaitStr, out Readrst)) return true;
Thread.Sleep(100);
i ;
}
MyLib.COMMFunc.AppendText(richTextBox1, "\r\nWAIT " WaitStr " TimeOut=" ms_TimeOut " ms\r\n\r\n");
return false;
}
internal bool CHKComPortRead(string CHKStr,out string Readrst )
{
Readrst = ""; string temp = "";
if (!EMoudleInstance.CHKComPortOpen()) return false;
while (true)
{
int i = 0;
int n = 0;
while ((n = EMoudleInstance.ComPort.BytesToRead) == 0)
{
Thread.Sleep(50);
i ;
if (i >= 3) break;
}
if ((n = EMoudleInstance.ComPort.BytesToRead) == 0) break;
byte[] buf = new byte[n];
EMoudleInstance.ComPort.Read(buf, 0, n);
temp = Encoding.ASCII.GetString(buf);
MyLib.COMMFunc.AppendText(richTextBox1, temp);
Readrst = temp;
if (temp.Contains(CHKStr))
{
MyLib.COMMFunc.AppendText(richTextBox1, "\r\nWAIT " CHKStr " OK\r\n\r\n");
return true;
}
}
if (Readrst.Contains(CHKStr))
{
MyLib.COMMFunc.AppendText(richTextBox1, "\r\nWAIT " CHKStr " OK\r\n\r\n");
return true;
}else
{
return false;
}
}
网友评论
我要评论