如何使用数据接收处理程序从GSM调制解调器接收控制台应用程

时间:2014-10-11 10:26:40

标签: c# sms handler modem

我想接收从控制台上的GSM调制解调器发送的每条消息,因为我使用了DataReceivedHandler。我的问题是在控制台上总是收到一次消息,以便接收另一条消息我必须调试我的控制台应用程序,这意味着我的处理程序无法正常工作。 还有一个问题是我已经使用pduconverter.dll将接收的pdu格式消息转换为文本格式,来自pduconverter.dll的例程我得到时间戳,消息文本但无法获取发件人的号码。这是我的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;
using System.Data.Sql;
using System.Data.SqlClient;
using GsmComm.PduConverter;


namespace readSerialData
{
class Program
{
    static void Main(string[] args)
    {
        SerialPort serialport = new SerialPort();
        int mSpeed = 1;
        serialport.PortName = "COM16";
        serialport.BaudRate = 9600;
        serialport.Parity = Parity.None;
        serialport.DataBits = 8;
        serialport.StopBits = StopBits.One;
        serialport.Handshake = Handshake.XOnXOff;
        serialport.DtrEnable = true;
        serialport.RtsEnable = true;
        serialport.NewLine = Environment.NewLine;
        serialport.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
        serialport.Open();
        Console.ReadKey();
        serialport.Close();

    }

    private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
    {           

            SerialPort sp = (SerialPort)sender;            
            sp.WriteLine("AT+CNMI=1,2,0,0\r");
            sp.WriteLine("AT+CMGL=4\r");
            string indata = sp.ReadExisting();
            Console.WriteLine("Data Received:");
           string sub = indata.Substring(indata.IndexOf('0'), indata.Length -     indata.IndexOf('0'));

           IncomingSmsPdu sms = GsmComm.PduConverter.IncomingSmsPdu.Decode(sub, true);
           Console.WriteLine(sms.SmscAddress);
        Console.WriteLine(sms.UserDataText);
            Console.WriteLine(sms.GetTimestamp());
            Console.ReadKey();

            Console.ReadKey();
        }
    }
}

请帮助,我已经被困住了很多天。

1 个答案:

答案 0 :(得分:0)

Main方法中,Console.ReadKey()用于接受键击以退出程序,但为什么在DataReceivedHandler中使用它?

如果没有按键,DataReceivedHandler将永远不会返回。我猜这是你问题的原因。从DataReceivedHandler中移除它们以查看是否可以解决您的问题。

private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{ 
    ...
    Console.WriteLine(sms.GetTimestamp());
    //Console.ReadKey();

    //Console.ReadKey();
}