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

时间:2012-06-10 09:30:17

标签: c# serial-port

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

输出可以有多行。

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

这是我目前的代码:

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

2 个答案:

答案 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的值,因为此代码应该没问题。