如何在多行字符串变量中搜索字符串?C#.

本文关键字:字符串 搜索 变量 | 更新日期: 2023-09-27 18:36:37

我从控制台保存命令的输出。

输出可以有多个行。

如何在所有输出中搜索特定单词?

这是我当前的代码:

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,"记录读取","0372022244",,"12/02/22,08:08:58+08"2073692066616374757261207661206669206163686974617461206C612074696D702120446574616C696920696E206D6167617A696E656C6520566F6461666F6E6520736175206C612062616E6361206476732E还行

这会从 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());
        }
    }
}

如何在多行字符串变量中搜索字符串?C#.

p.ReadExisting()SerialPort执行读取操作。

MSDN 文档说:

根据编码读取所有立即可用的字节,在两者中 串行端口对象的流和输入缓冲区。

这意味着您可能无法在一次调用ReadExisting中获得所需的所有数据,因为该数据可能尚不可用。在进行Contains检查之前,您可能应该遍历并从串行端口读取所有数据。

附带说明:尤其是在处理串行操作时,使用 Thread.Sleep 不是一个好主意。不要在等待数据时休眠,而是使用 SerialPort.DataReceived 事件读取可用数据。

尝试此操作以正确从串行端口读取数据并摆脱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");

buff.Contains(ok)将搜索整个字符串(buff)以查找您指定的字符串(ok)。

换行符 (''n') 的处理方式与字符串中的任何其他字符相同。如果你有一个值为 "a'nb'nc" 的字符串,并且你要搜索 "'nc" ,它将返回 true,因为该字符串包含一个由字符 ''n''c' 组成的字符串。

因此,如果这对您不起作用,我会重新检查 buffok 的值,因为这段代码应该没问题。