0

COM ポートに接続された GSM モデムでデータを送受信しようとしています。これが私のコードの重要な部分です:

        SerialPort sp = new SerialPort();
        sp.PortName = "COM1";
        sp.BaudRate = 9600;
        sp.DataBits = 8;
        sp.Parity = Parity.None;
        sp.StopBits = StopBits.One;
        sp.ReadTimeout = 5000;

                sp.Open();
                if (sp.IsOpen)
                {
                    Console.WriteLine(sp.PortName + " is open");

                    Console.WriteLine("Trying to write data");
                    sp.Write("AT");
                    Console.WriteLine("Data has been sent");

                    Console.WriteLine("Trying to read data");
                    char[] read = new char[200];
                    sp.Read(read, 0, 20);
                    foreach (char chr in read)
                    {
                        Console.Write(chr);
                    }
                    Console.WriteLine();

                }

エラーは発生しませんが、GSM デバイスは私が送信したものをそのまま送信しています。この場合AT. 私が「BOO」を送ると、彼は「BOO」を送り返します(最初の文字しか返さないこともありますが、これはデータの読み取り方法によるものだと思います。別のスレッドにすべきではありませんか?これは簡単にできます後で)。

私が彼に「AT」を送ると、彼は私に「OK」を送ってくれることを期待しています。

私が彼に送ったものは何でも、デバイスが私に送り返すことについて、どのような説明があり得るでしょうか。ポート通信が適切に設定されておらず、実際にはデバイスに到達していない可能性があると考えていました。

4

1 に答える 1

2

PuTTYで通信しましたか?まず端末アプリケーション ( PuTTY Download Link ) からデータを送受信して、モデム自体の問題を除外してから、通信するアプリケーションの作成に進む必要があります。

コードに関しては、sp.Write の代わりに sp.WriteLine を使用する必要があります...モデムは、コマンドが終了したことを知るために改行文字を確認する必要があります。sp.NewLine を使用して改行文字を設定し、モデムが表示する必要があるものと一致させることができます。または、作成中の AT コマンドに '\r' を追加することもできます。

私が使用した GSM モデムはすべてデフォルトでエコーがオンになっています。'ATE0' を送信することでエコーを無効にすることができます。エコーがオンの場合、モデムは最初に送信したものをエコーし​​、次に応答を送信します。データの読み取り方法が原因で、エコーが戻ってくるのを見ていると思われますが、応答はありません。データを読み取るには、次の方法を試してください。

//add this just before opening the port
sp.DataReceived += new 
    SerialDataReceivedEventHandler(port_DataReceived);

ポートを設定するメソッドの外に次のメソッドを追加します。

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
  Console.WriteLine(port.ReadExisting());
}
于 2013-03-28T14:02:15.197 に答える