0

GSM モデムで実行されたいくつかの AT コマンドの値を確認しようとしています。コマンドの出力にいくつかの値が含まれているかどうかを確認しようとしているときに、真か偽かで行き詰まっています。

次のコードを使用します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;
using System.IO;
using System.Timers;


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();
            Console.WriteLine("buff: \"{0}\"\nok: \"{1}\"", buff, ok);
            p.Write("AT+CMGF=1"+ "\r" );
            buff = p.ReadExisting();
            Console.WriteLine("buff: \"{0}\"\nok: \"{1}\"", buff, ok);
            do
            {
                p.Write("AT+CMGL=\"REC UNREAD\" " + "\r");
                buff = p.ReadExisting(); 
                Console.WriteLine("buff: \"{0}\"\nok: \"{1}\"", buff, ok);
                /*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

1

ReadExisting()余分な呼び出しがあります。メイン メソッドでシリアル ポート出力を読み取るべきではありません。イベント ハンドラーに作業を任せてください。buffまた、バッファをチェックするときにすべてのデータを受信できるように、イベント ハンドラで読み取ったものを変数に追加する必要があります。

代わりにこれを試してください:

public class Program
{
    public static void Main(string[] args)
    {
        ModemReader r = new ModemReader();
        r.StartReading();
    }
    class ModemReader{
        string buff="";
        public void StartReading()
        {
            string ok = "OK";
            SerialPort p = new SerialPort("COM28");
            p.DataReceived += new SerialDataReceivedEventHandler(p_DataReceived);
            p.Open();
            string line = "1";
            p.Write("AT" + "\r");
            Console.WriteLine("buff: \"{0}\"\nok: \"{1}\"", buff, ok);
            p.Write("AT+CMGF=1"+ "\r" );
            Console.WriteLine("buff: \"{0}\"\nok: \"{1}\"", buff, ok);
            do
            {
                // Clear the buffer here
                buff = "";  

                p.Write("AT+CMGL=\"REC UNREAD\" " + "\r");
                Console.WriteLine("buff: \"{0}\"\nok: \"{1}\"", buff, ok);
                if (buff.Contains(ok))
                    Console.WriteLine("Everything is OK");
                else
                    Console.WriteLine("NOK");
                line = Console.ReadLine();
            } while (line != "quit");
            p.Close();
        }
        public void p_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            string s = (sender as SerialPort).ReadExisting();
            buff += s;
            Console.WriteLine(s);
        }
    }
} 
于 2012-06-10T10:56:33.847 に答える
0

ポートデータは1回しか使用できません。ハンドラー内で消費するため、バッファーに入れようとすると存在しなくなります。

于 2012-06-10T10:48:29.093 に答える