我从控制台保存命令的输出。
输出可以有多行。
如何在所有输出中搜索特定单词?
这是我目前的代码:
string buff, ok;
ok = "OK";
SerialPort p = ...
// p initialization...
p.Write("AT+CMGL=\"REC UNREAD\" " + "\r");
System.Threading.Thread.Sleep(1000);
buff = p.ReadExisting();
if (buff.Contains(ok))
// do smth
输出的一个例子:
+CMGL: 10,"REC READ","0372022244",,"12/02/22,08:08:58+08" 2073692066616374757261207661206669206163686974617461206C612074696D702120446574616C696920696E206D6167617A696E656C6520566F6461666F6E6520736175206C612062616E6361206476732E OK
这会搜索来自buff的所有行吗?还是只是第一行?我试着这样,似乎他在输出中找不到“OK”
namespace SerialTest
{
public class Program
{
public static void Main(string[] args)
{
string buff="0";
string ok = "OK";
SerialPort p = new SerialPort("COM28");
p.DataReceived += new SerialDataReceivedEventHandler(p_DataReceived);
p.Open();
string line = "1";
p.Write("AT" + "\r");
buff = p.ReadExisting();
p.Write("AT+CMGF=1"+ "\r" );
buff = p.ReadExisting();
do
{
p.Write("AT+CMGL=\"REC UNREAD\" " + "\r");
buff = p.ReadExisting();
if (buff.Contains(ok))
Console.WriteLine("Everything is OK");
else
Console.WriteLine("NOK");
line = Console.ReadLine();
} while (line != "quit");
p.Close();
}
public static void p_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Console.WriteLine((sender as SerialPort).ReadExisting());
}
}
}
答案 0 :(得分:0)
p.ReadExisting()
会对SerialPort
读取操作。
MSDN文档说:
根据编码读取所有立即可用的字节 SerialPort对象的流和输入缓冲区。
这意味着您可能无法在一次调用ReadExisting
时获得所需的所有数据,因为这些数据可能尚未提供。在进行Contains
检查之前,您应该遍历并读取串行端口中的所有数据。
旁注:使用Thread.Sleep
尤其是在处理串行操作时不是一个好主意。在等待数据时不要睡觉,而是使用SerialPort.DataReceived
event来读取可用数据。
尝试此操作以正确读取串行端口中的数据并删除Sleep
String data = "";
p.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();
data += indata;
}
然后设置一个定时器,在1秒后检查输出。
在计时器事件处理程序中,检查data.Contains("OK");
答案 1 :(得分:0)
buff.Contains(ok)
会在整个字符串(buff
)中搜索您指定的字符串(ok
)。
新行字符('\n'
)的处理方式与字符串中任何其他字符的处理方式相同。
如果您有一个值为"a\nb\nc"
的字符串并且您要搜索"\nc"
,则它将返回true,因为该字符串包含由字符'\n'
和{{1}组成的字符串}。
因此,如果这不适合您,我会重新检查'c'
和buff
的值,因为此代码应该没问题。