如何在控制台应用程序中使用数据接收处理程序从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();
}
}
}
请帮帮我,我已经被这件事困扰了好几天了。
在Main
方法Console.ReadKey()用于接受按键退出程序,但为什么在DataReceivedHandler
中使用它??
如果没有按键,DataReceivedHandler将永远不会返回。我想这就是你问题的原因。将它们从DataReceivedHandler
中删除,看看这是否解决了您的问题。
private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
...
Console.WriteLine(sms.GetTimestamp());
//Console.ReadKey();
//Console.ReadKey();
}