0

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

输出可以有多于一行。

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

这是我当前的代码:

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

好的

这会搜索 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());
        }
    }
}
4

2 回答 2

0

p.ReadExisting()对 a 进行读取操作SerialPort

MSDN文档说:

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

这意味着您可能无法在一次调用中获得您期望的所有数据,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");

于 2012-06-10T09:43:32.543 回答
0

buff.Contains(ok)将在整个字符串 ( buff) 中搜索您指定的字符串 ( ok)。

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

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

于 2012-06-10T09:56:49.867 回答