求教serialport类如何得到新收到的短信?
pbpb 2009-04-21 11:00:42 各位老大:
在做一个通过串口连接手机西门子3508进行收发短信的程序,使用serialport发送和接收短信均能实现,就是当手机收到新的短信的时候,如何迅速把新短信读出来?
我设想的是使用serialport的datareceived事件读,可这个事件被触发的时机总不是那么可巧,在发送短信的时候,由于收到手机返回的信息也被触发,所以要对收到的信息判断,正常新到短信后应该收到:+cmti:"sm","21"这样的信息,可有时只收到不完整的字符串就被触发了,感觉很不好控制。
主要有两个问题:
1、如何设定datareceived事件触发时机?
2、如何从接收缓冲区里各类字符中【包括发送和读短信时手机返回的一些提示信息】分辨出新短信指示信息呢?
下面的代码是从网上找的,忘了出处了,对作者表示感谢。大家帮忙给分析一下,谢谢!!
namespace SMSdemo
{
public class MYSMS
{
public MYSMS()
{ }
#region Initialize Drive
public void IniDrv(string sPort, int nBaud)
{
string sBack = "";
try
{
bool bOpen = false;
bOpen = InitCom(sPort, nBaud);
if (bOpen)
{
//GET Modem Model
sBack = WriteAtCommand("AT+CGMI");
MessageBox.Show(sBack);
//check drive run status
if (sBack.IndexOf("ERROR") < 0 && sBack.Length > 17)
{
for (int i = 0; i <= 60; i++)
{
sBack = WriteAtCommand("AT+CMGF=0");
if (sBack.IndexOf("ERROR") < 0)
{
break;
}
else
{
System.Threading.Thread.Sleep(1000);
if (i == 60)
{
throw new Exception("Initialize SMS Modem Fail!");
}
}
}
WriteAtCommand("at+cnmi=1,1,0,0,1");
//set sms center number;
GetMsgCenterNumber();
//MessageBox.Show(sMsgCenterNumber);
sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
sp.ReceivedBytesThreshold = 10;
}
else
{
throw new Exception("Initialize SMS Modem Fail!");
}
}
}
catch (Exception e)
{
FreeDrv();
throw e;
}
}
private bool InitCom(string PortName, int PortNum)//初始化建串口类实例
{
try
{ sp = new SerialPort(PortName, PortNum, Parity.None, 8);
sp.Handshake = Handshake.None;
sp.Parity = Parity.None;
sp.ReadTimeout = 600;
sp.WriteTimeout = 600;
if (!sp.IsOpen)
{
sp.Open();
}
// MessageBox.Show("sp建立成功!");
return true;
}
catch
{
throw new Exception("Serial Port Can't Open!");
}
}
public void sp_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
string aa = sp.ReadExisting();
//byte[] buffer = new byte[sp.BytesToRead];
//sp.Read(buffer, 0, buffer.Length);
//string aa= System.Text.Encoding.ASCII.GetString(buffer);
//string aa = sp.ReadLine();
MessageBox.Show("事件响应获得数据:"+aa);
//MessageBox.Show(aa.Substring(0, 5));
//if ((aa.Substring(0, 5) == "+CMTI"))
//{
// MessageBox.Show(ReadMsg(aa.Substring(12)));
//}
}
#endregion
#region Send AT command to modem
private string WriteAtCommand(string sAtCommand)
{
sp.Write(sAtCommand + "\r");
System.Threading.Thread.Sleep(1000);
byte[] buffer = new byte[sp.BytesToRead];
sp.Read(buffer, 0, buffer.Length);
return System.Text.Encoding.ASCII.GetString(buffer);
}
#endregion
#region Send Message
public bool SendMessage(string sReceieveNo, string sMsgContent)
{
string PduData = "";
sp.DiscardInBuffer();
sp.DiscardOutBuffer();
PduData = smsDecodedsms(sReceieveNo, sMsgContent);
int j = PduData.Length;
j /= 2;
j--;
sp.Write("AT+CMGS=" + j.ToString() + "\r");
//System.Threading.Thread.Sleep(500);
sp.Write(PduData);
sp.Write(((char)26).ToString() + "\r");
sp.DiscardInBuffer();
sp.DiscardOutBuffer();
return true;
}
#endregion
#region Read Sms
public string ReadMsg(string msgIndex)//读取信息
{
try
{
string str = WriteAtCommand("AT+CMGR =" + msgIndex);
if (str.Contains("OK"))
{
int index1 = str.IndexOf("\r\n");
int index2 = str.IndexOf("\r\n", index1 + 2);
int index3 = str.IndexOf("\r\n", index2 + 2);
string pdu = str.Substring(index2 + 2, index3 - index2 - 2);
if (pdu.Substring(40, 2) == "08")
{
//return GetTextFromPdu_UCS2(pdu) + "---发送者:" + GetTeleFromPdu(pdu) + "---接收时间:" + GetTimeFromPdu(pdu);
return GetTextFromPdu_UCS2(pdu) + "|" + GetTeleFromPdu(pdu);
}
else if (pdu.Substring(40, 2) == "00")
{
//return "内容:" + GetTextFromPdu_7Bit(pdu);
return GetTextFromPdu_7Bit(pdu).Replace("\0", "") + "|" + GetTeleFromPdu(pdu);
}
else
{
return "";
}
}
else
{
return "";
}
}
catch
{
return "";
}
}
//--------------------------短信解码部分开始-------------------------