Search code examples
c#smshandlermodem

how to receive messages in console application from GSM modem using data received handler


I want to receive every message that is sent from GSM modem on console for that I have used DataReceivedHandler. My problem is message is always received once on the console for another message to receive I have to debug my console application that means my handler is not working properly. One more problem is I have converted received pdu format message into text format using pduconverter.dll,from routines of pduconverter.dll I get timestamp,message text but unable to get sender's number. Here is my code

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();
        }
    }
}

Please help, I have been stuck on this from many days.


Solution

  • In the Main method Console.ReadKey() is used to accept keystroke to exit the program, but why it is used in DataReceivedHandler??

    Without a keystroke, DataReceivedHandler will never return. I guess this is the cause of your problem. Remove them from DataReceivedHandler to see if that fix your problem.

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