求教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 "";
}
}

//--------------------------短信解码部分开始-------------------------
...全文
131 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
DoYouSelf 2012-07-20
  • 打赏
  • 举报
回复
最近遇到问题,不会收短信,恳请各位高手能移驾指点一二
http://topic.csdn.net/u/20120720/09/34ca022e-24ea-46a1-9bac-4cf81f8b5c0c.html
100分的帖子
lifeixie 2010-10-23
  • 打赏
  • 举报
回复
用延迟的方法 接收一下
yangjiexiazai 2010-10-23
  • 打赏
  • 举报
回复
现在我也碰到这样的问题啦
myfnbastar 2010-10-18
  • 打赏
  • 举报
回复
楼主 解决了吗 分享下...
ycagri 2010-08-27
  • 打赏
  • 举报
回复
在DataReceived里面将收到的数据先全部append到一个stringBuilder里面
然后在IndexOf或是substring的方法,来判定是不是你要的字符串,是就处理,不是就remove


总之stringBuilder是用来存你收到的每一个字符的
huwen7565833 2010-08-27
  • 打赏
  • 举报
回复
关注一下,帮顶!!
amwjtg5156 2010-08-18
  • 打赏
  • 举报
回复
顶,
实现后能否发份给我。120253707@qq.com
谢谢。。
txt_paul 2009-04-22
  • 打赏
  • 举报
回复
友情一顶,
赤果果的接分。

回帖是一种美德!每天回帖即可获得 10 分可用分! 小技巧:教您如何更快获得可用分
SK_Aqi 2009-04-21
  • 打赏
  • 举报
回复
帮你顶了
我不懂电脑 2009-04-21
  • 打赏
  • 举报
回复
用同步方式开个线程再while里读
ericzhangbo1982111 2009-04-21
  • 打赏
  • 举报
回复


在外面定义一个stringbuiler
+起来
判断一下是不是短信息的结尾。
pbpb 2009-04-21
  • 打赏
  • 举报
回复
代码全粘进去,放不开,删了好多,帮忙提个建议,谢谢!

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧