2012-06-10 28 views
0

我保存從控制檯輸出的命令。如何搜索多行字符串變量中的字符串? C#

輸出可以有多行。

如何搜索所有輸出中的特定單詞?

這裏是我當前的代碼:

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所有線好嗎?或只是第一行?我試圖像這樣,似乎他找不到不上SerialPort讀操作輸出

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

[你有什麼試過](http://whathaveyoutried.com)?這並不困難,所以請解釋你嘗試過的以及你卡在哪裏。 – Oded

+0

字符串愛好者,好的; ok =「OK」; p。寫(「AT + CMGL = \」REC UNREAD \「」+「\ r」); System.Threading.Thread.Sleep(1000); buff = p.ReadExisting(); if(buff.Contains(ok)) do smth –

+0

Please _edit_ your question and add the code sample to it。 – Oded

回答

0

p.ReadExisting()「OK」。

MSDN文檔說:

讀取所有立即可用的字節,基於編碼,在這兩種 的流和對象的SerialPort的輸入緩衝器。

這意味着您可能無法在一次調用ReadExisting時獲得所需的所有數據,因爲該數據可能尚未提供。在進行Contains檢查之前,您應該循環並讀取串口上的所有數據。

附註:使用Thread.Sleep特別是在處理串行操作時不是一個好主意。在等待數據時不用睡覺,而是使用SerialPort.DataReceivedevent來讀取可用數據。

試試這個從您的串口讀取正確的數據和擺脫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");

+0

是的,數據是從串口讀取的,是不是足夠的睡眠數據可用? –

+0

@AlexisCimpu沒有,因爲如果睡眠時會收到很多數據,如果內部緩衝區已滿,操作系統將丟棄它們,最終會以數據l結束oss – GETah

+0

我已經添加了所有的代碼,我已經在使用EventHandler了,我用他們錯了嗎? –

0

buff.Contains(ok)將搜索整個字符串(buff)爲您指定的字符串(ok)。

新換行符('\n')的處理方式與字符串中其他任何字符的處理方式相同。 如果您有一個值爲"a\nb\nc"的字符串,並且您要搜索"\nc",則該字符串將包含由字符'\n''c'組成的字符串,並返回true。

所以,如果這不適合你,我會重新檢查buffok的值,因爲這段代碼應該沒問題。