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

本文关键字:程序 处理 GSM 消息 调制解调器 数据 控制台 应用程序 | 更新日期: 2023-09-27 18:26:11

我想接收从控制台上的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();
        }
    }
}

请帮帮我,我已经被这件事困扰了好几天了。

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

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

如果没有按键,DataReceivedHandler将永远不会返回。我想这就是你问题的原因。将它们从DataReceivedHandler中删除,看看这是否解决了您的问题。

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