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 を検索しますか? または最初の行だけですか?私はこのように試してみましたが、出力に「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

buff.Contains(ok)buff指定した文字列 ( ) の文字列全体 ( ) を検索しますok

改行文字 ( '\n') は、文字列内の他の文字と同じように扱われます。値を持つ文字列が"a\nb\nc"あり、 を検索する場合、文字列には と の文字で構成される文字列が含まれているため、"\nc"true が返されます。'\n''c'

したがって、これが機能しない場合は、buffandの値を再確認しますok。このコードは問題ないはずです。

于 2012-06-10T09:56:49.867 に答える
0

p.ReadExisting()に対する読み取り操作を行いますSerialPort

MSDNのドキュメントには次のように書かれています。

SerialPort オブジェクトのストリームと入力バッファーの両方で、エンコーディングに基づいて、すぐに利用可能なすべてのバイトを読み取ります。

ReadExistingこれは、データがまだ利用できない可能性があるため、1 回の呼び出しで期待するすべてのデータを取得できない可能性があることを意味します。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 に答える