问题1:
通过AT+CMGS连续发短信时,发现手机返回状态从OK变为ERROR,或从ERROR变为OK时相当的慢,如何解决才能保持稳定并维持在3秒/每条左右!
问题2:
通过AT+CMGW先将短信内容存入SIM卡,然后发送,结果竟然比直接从PC发送还慢,是不是手机读SIM卡的速度很慢?还是本人实验有问题?有没有命令将短信存到手机的内存而不是SIM卡?
---------------------------------------------------------------
设置一个发送超时变量,例如等于3秒,当通过串口发送AT+CMGS,在3秒内没有OK或ERROR返回,则也结束发送线程。
---------------------------------------------------------------
你的两个问题是一样的。
OK和ERROR要等短信发送后才返回,这段时间不是你的问题,而是网络的问题。要保持稳定在3秒/个在目前的网络是不可能的!一般的发送会在3-17秒之间,短信高峰期会更慢或者超时,不信你用手机试试。
从SIM发送会慢,但那个毫秒级的,两个差异是因为网络的不确定性导致的,没有直接的差异。
---------------------------------------------------------------
我试了一下,问题在这里,你如果还没有等+CMGS返回的时候就发送,后面送的这些数据会被当做PDU编码的一部分,所以不会返回OK和ERROR,你这样试,如果他不响应你先发送个Ctrl+Z的指令,表示PDU的结束,它会告诉你ERROR,你再试AT应该就可以我,我用WAVECOM试了一下没问题,你试试看,如果还不返回的话,那就真的是死了,只有关机或断电了。
---------------------------------------------------------------
临时将COM和测试程序打包,放在以下地址,解压后,直接安装即可;
在安装使用过程中有任何问题,请和我联系:nlnc@163.com
http://user.7host.com/nlnccn/smscom/smscom.rar
---------------------------------------------------------------
问题1:
通过AT+CMGS连续发短信时,发现手机返回状态从OK变为ERROR,或从ERROR变为OK时相当的慢,如何解决才能保持稳定并维持在3秒/每条左右!
是红外连接还是数据线连接?
我也曾遇到该问题,测试环境是WIN98+VB6,Cyrix 5x86,红外连接。发送数量在300条以下时,迟缓不明显。如果运行VB前没运行OFFICE,没有迟缓。
测试环境换在奔腾时,手机跟PC的交换数据速率有差异,这时手机没反应PC就处理完了。不同手机的最高速率是不同的,有AT指令测试手机的速率,将MSCOMM控件的速率设为一致。大概一秒每条上下。前五条较快,之后的就稳定。
你可先测试AT+CMGS=<Length>,不测试PDU部份。
问题2:
通过AT+CMGW先将短信内容存入SIM卡,然后发送,结果竟然比直接从PC发送还慢,是不是手机读SIM卡的速度很慢?还是本人实验有问题?有没有命令将短信存到手机的内存而不是SIM卡?
要把信息写到手机,先选择存储器为手机,然后保存。
短信好象不能存储在手机中。
不管存储器是手机还是SIM卡,他们存储的信息是不连续的。比如说,手机电话簿有2条记录,存储在第1和第5个位置,新增电话时一般他保存在第2个位置。如果第2个位置删除的话,第3个位置的记录不会向前移,第2个位置还是空的。
我读取SIM卡的电话簿时,尚未遇到速度慢的情况,都是平稳的速率。
---------------------------------------------------------------
所以我总觉得GSM的网络里,达到平均1秒/条的速度是不太可能的.有人说用CDMA的机速度飞快,不知道是不是这样,可能CDMA的短信网络不一样吧.不过就算速度快又会有另外一个问题,那就是"互联互通"的问题,发是发出去了,但移动的不一定收到,得不偿失,呵呵.
另外还有一个问题,不知道你注意到没有,当你连续大量发送的时候,发个几百条之后,就会连续失败,你要停止操作很久时间,比如说1个小时,才能够继续发送,否则会持续返回ERROR!
---------------------------------------------------------------
nlnc(风之8号) :
>"AT+CMGS指令PDU编码中必须将短信中心号码编码进去"
不是的,如果你把PDU中的SMSC设置空值,就可以用手机中设置的号码直接发送,编码长度短一些.
zhhuang2002(老兵) :
ctrl-z的问题,还是在于AT+CMGS和AT+CMGW之类的指令,所以以后遇到通讯不到就先Ctrl-Z然后AT,还不返回就是完蛋了,呵呵.
另外如果想要详细的返回信息可以打开错误提示,会给出代码的,比如512之类的,你查错误表就知道错误原因了.
发送速度只能依赖于网络.3秒/条是极限了.
---------------------------------------------------------------
我做的最快是3秒钟发送一条短信;如果短信比较长,那么可能发送一条需要5到6秒钟
由于模块的反应速度慢,如果间隔时间太短会造成模块死掉;一般间隔4到5秒钟比较保险
一秒钟发送一条真是令我惊讶,是什么模块的??
---------------------------------------------------------------
3s基本可以的
我做过一个采用多线程来实现的
对与连续发送将标志位设为这样一来发送完一条MN层链路不会立即断,可以减短连续发送的时间
---------------------------------------------------------------
zhhuang2002(老兵) :我的错误代码,不完全,但够用了。
long CMobile::ParseError(CString strResult)
{
long lCode=0;
CString strTemp;
if(strResult.Find("OK")>=0)
return ERR_SUCCEED;
if(strResult.IsEmpty())
m_lLastError=ERR_NO_RESPOND;
else if(strResult.Find("+CME ERROR:")>=0 ¦ ¦strResult.Find("+CMS ERROR:")>=0 ¦ ¦strResult.Find("+CEER ERROR:")>=0)
{
if(strResult.Find("+CME ERROR:")>=0)
{
strTemp="+CME ERROR:";
ParseResult(strResult,strTemp);
if(RC>=1)
{
lCode=atoi(RD[0]);
if(3==lCode ¦ ¦4==lCode)
m_lLastError=ERR_NOT_SUPPORT;
else if(5==lCode ¦ ¦6==lCode)
m_lLastError=ERR_SIM_PIN_REQUIRED;
else if(7==lCode)
m_lLastError=ERR_SIM_PUK_REQUIRED;
else if(lCode==10)
m_lLastError=ERR_SIM_NOT_INSERTED;
else if(11==lCode)
m_lLastError=ERR_SIM_PIN_REQUIRED;
else if(12==lCode)
m_lLastError=ERR_SIM_PUK_REQUIRED;
else if(13==lCode ¦ ¦14==lCode ¦ ¦15==lCode)
m_lLastError=ERR_SIM_COMMUNICATION;
else if(16==lCode)
m_lLastError=ERR_INCORRECT_PASSWORD;
else if(17==lCode)
m_lLastError=ERR_SIM_PIN2_REQUIRED;
else if(18==lCode)
m_lLastError=ERR_SIM_PUK2_REQUIRED;
else if(20==lCode)
m_lLastError=ERR_MEMORY_FULL;
else if(21==lCode)
m_lLastError=ERR_INVALID_INDEX;
else if(22==lCode)
m_lLastError=ERR_LOCATION_EMPTY;
else if(23==lCode)
m_lLastError=ERR_MEMORY_FAIL;
else if(24==lCode)
m_lLastError=ERR_TEXT_TOO_LONG;
else if(25==lCode)
m_lLastError=ERR_INVALID_CHARACTERS;
else if(26==lCode)
m_lLastError=ERR_NUMBER_TOO_LONG;
else if(27==lCode)
m_lLastError=ERR_INVALID_CHARACTERS;
else if(30==lCode)
m_lLastError=ERR_NETWORK_SERVICE;
else if(31==lCode)
m_lLastError=ERR_NETWORK_TIMEOUT;
else if(32==lCode)
m_lLastError=ERR_NETWORK_SERVICE;
else if(42==lCode ¦ ¦44==lCode ¦ ¦46==lCode)
m_lLastError=ERR_SIM_PIN_REQUIRED;
else if(43==lCode ¦ ¦45==lCode ¦ ¦47==lCode)
m_lLastError=ERR_SIM_PUK_REQUIRED;
else
m_lLastError=ERR_UNKNOWN_CODE;
}
}
else if(strResult.Find("+CMS ERROR:")>=0)
{
strTemp="+CMS ERROR:";
ParseResult(strResult,strTemp);
if(RC>=1)
{
lCode=atoi(RD[0]);
if(lCode<128)
m_lLastError=ERR_NETWORK_RP;
else if(lCode<256)
m_lLastError=ERR_NETWORK_TP;
else if(lCode==301)
m_lLastError=ERR_SMS_SERVICE;
else if(lCode==302 ¦ ¦lCode==302)
m_lLastError=ERR_NOT_SUPPORT;
else if(lCode=304 ¦ ¦lCode==305)
m_lLastError=ERR_SMS_PDU_PARAMETER;
else if(lCode==310)
m_lLastError=ERR_SIM_NOT_INSERTED;
else if(lCode==311 ¦ ¦lCode==312)
m_lLastError=ERR_SIM_PIN_REQUIRED;
else if(lCode==313 ¦ ¦lCode==314 ¦ ¦lCode==314)
m_lLastError=ERR_SIM_COMMUNICATION;
else if(lCode==316)
m_lLastError=ERR_SIM_PUK_REQUIRED;
else if(lCode==317)
m_lLastError=ERR_SIM_PIN2_REQUIRED;
else if(lCode==318)
m_lLastError=ERR_SIM_PUK2_REQUIRED;
else if(lCode==320)
m_lLastError=ERR_MEMORY_FAIL;
else if(lCode==321)
m_lLastError=ERR_INVALID_INDEX;
else if(lCode==322)
m_lLastError=ERR_MEMORY_FULL;
else if(lCode==330)
m_lLastError=ERR_SMSC_NOT_FOUND;
else if(lCode==331)
m_lLastError=ERR_NETWORK_SERVICE;
else if(lCode==332)
m_lLastError=ERR_NETWORK_TIMEOUT;
else
m_lLastError=ERR_UNKNOWN_CODE;
}
}
else if(strResult.Find("+CEER ERROR:")>=0)
{
strTemp="+CEER ERROR:";
ParseResult(strResult,strTemp);
if(RC>=1)
{
lCode=atoi(RD[0]);
if(atoi(RD[0])<128)
m_lLastError=ERR_NETWORK_RP;
else
m_lLastError=ERR_NETWORK_TP;
}
}
}
else if(strResult.Find("ERROR")>=0)
m_lLastError=ERR_NOT_SUPPORT;
else
m_lLastError=m_Con.m_lLastError;
retu。。。
通过AT+CMGS连续发短信时,发现手机返回状态从OK变为ERROR,或从ERROR变为OK时相当的慢,如何解决才能保持稳定并维持在3秒/每条左右!
问题2:
通过AT+CMGW先将短信内容存入SIM卡,然后发送,结果竟然比直接从PC发送还慢,是不是手机读SIM卡的速度很慢?还是本人实验有问题?有没有命令将短信存到手机的内存而不是SIM卡?
---------------------------------------------------------------
设置一个发送超时变量,例如等于3秒,当通过串口发送AT+CMGS,在3秒内没有OK或ERROR返回,则也结束发送线程。
---------------------------------------------------------------
你的两个问题是一样的。
OK和ERROR要等短信发送后才返回,这段时间不是你的问题,而是网络的问题。要保持稳定在3秒/个在目前的网络是不可能的!一般的发送会在3-17秒之间,短信高峰期会更慢或者超时,不信你用手机试试。
从SIM发送会慢,但那个毫秒级的,两个差异是因为网络的不确定性导致的,没有直接的差异。
---------------------------------------------------------------
我试了一下,问题在这里,你如果还没有等+CMGS返回的时候就发送,后面送的这些数据会被当做PDU编码的一部分,所以不会返回OK和ERROR,你这样试,如果他不响应你先发送个Ctrl+Z的指令,表示PDU的结束,它会告诉你ERROR,你再试AT应该就可以我,我用WAVECOM试了一下没问题,你试试看,如果还不返回的话,那就真的是死了,只有关机或断电了。
---------------------------------------------------------------
临时将COM和测试程序打包,放在以下地址,解压后,直接安装即可;
在安装使用过程中有任何问题,请和我联系:nlnc@163.com
http://user.7host.com/nlnccn/smscom/smscom.rar
---------------------------------------------------------------
问题1:
通过AT+CMGS连续发短信时,发现手机返回状态从OK变为ERROR,或从ERROR变为OK时相当的慢,如何解决才能保持稳定并维持在3秒/每条左右!
是红外连接还是数据线连接?
我也曾遇到该问题,测试环境是WIN98+VB6,Cyrix 5x86,红外连接。发送数量在300条以下时,迟缓不明显。如果运行VB前没运行OFFICE,没有迟缓。
测试环境换在奔腾时,手机跟PC的交换数据速率有差异,这时手机没反应PC就处理完了。不同手机的最高速率是不同的,有AT指令测试手机的速率,将MSCOMM控件的速率设为一致。大概一秒每条上下。前五条较快,之后的就稳定。
你可先测试AT+CMGS=<Length>,不测试PDU部份。
问题2:
通过AT+CMGW先将短信内容存入SIM卡,然后发送,结果竟然比直接从PC发送还慢,是不是手机读SIM卡的速度很慢?还是本人实验有问题?有没有命令将短信存到手机的内存而不是SIM卡?
要把信息写到手机,先选择存储器为手机,然后保存。
短信好象不能存储在手机中。
不管存储器是手机还是SIM卡,他们存储的信息是不连续的。比如说,手机电话簿有2条记录,存储在第1和第5个位置,新增电话时一般他保存在第2个位置。如果第2个位置删除的话,第3个位置的记录不会向前移,第2个位置还是空的。
我读取SIM卡的电话簿时,尚未遇到速度慢的情况,都是平稳的速率。
---------------------------------------------------------------
所以我总觉得GSM的网络里,达到平均1秒/条的速度是不太可能的.有人说用CDMA的机速度飞快,不知道是不是这样,可能CDMA的短信网络不一样吧.不过就算速度快又会有另外一个问题,那就是"互联互通"的问题,发是发出去了,但移动的不一定收到,得不偿失,呵呵.
另外还有一个问题,不知道你注意到没有,当你连续大量发送的时候,发个几百条之后,就会连续失败,你要停止操作很久时间,比如说1个小时,才能够继续发送,否则会持续返回ERROR!
---------------------------------------------------------------
nlnc(风之8号) :
>"AT+CMGS指令PDU编码中必须将短信中心号码编码进去"
不是的,如果你把PDU中的SMSC设置空值,就可以用手机中设置的号码直接发送,编码长度短一些.
zhhuang2002(老兵) :
ctrl-z的问题,还是在于AT+CMGS和AT+CMGW之类的指令,所以以后遇到通讯不到就先Ctrl-Z然后AT,还不返回就是完蛋了,呵呵.
另外如果想要详细的返回信息可以打开错误提示,会给出代码的,比如512之类的,你查错误表就知道错误原因了.
发送速度只能依赖于网络.3秒/条是极限了.
---------------------------------------------------------------
我做的最快是3秒钟发送一条短信;如果短信比较长,那么可能发送一条需要5到6秒钟
由于模块的反应速度慢,如果间隔时间太短会造成模块死掉;一般间隔4到5秒钟比较保险
一秒钟发送一条真是令我惊讶,是什么模块的??
---------------------------------------------------------------
3s基本可以的
我做过一个采用多线程来实现的
对与连续发送将标志位设为这样一来发送完一条MN层链路不会立即断,可以减短连续发送的时间
---------------------------------------------------------------
zhhuang2002(老兵) :我的错误代码,不完全,但够用了。
long CMobile::ParseError(CString strResult)
{
long lCode=0;
CString strTemp;
if(strResult.Find("OK")>=0)
return ERR_SUCCEED;
if(strResult.IsEmpty())
m_lLastError=ERR_NO_RESPOND;
else if(strResult.Find("+CME ERROR:")>=0 ¦ ¦strResult.Find("+CMS ERROR:")>=0 ¦ ¦strResult.Find("+CEER ERROR:")>=0)
{
if(strResult.Find("+CME ERROR:")>=0)
{
strTemp="+CME ERROR:";
ParseResult(strResult,strTemp);
if(RC>=1)
{
lCode=atoi(RD[0]);
if(3==lCode ¦ ¦4==lCode)
m_lLastError=ERR_NOT_SUPPORT;
else if(5==lCode ¦ ¦6==lCode)
m_lLastError=ERR_SIM_PIN_REQUIRED;
else if(7==lCode)
m_lLastError=ERR_SIM_PUK_REQUIRED;
else if(lCode==10)
m_lLastError=ERR_SIM_NOT_INSERTED;
else if(11==lCode)
m_lLastError=ERR_SIM_PIN_REQUIRED;
else if(12==lCode)
m_lLastError=ERR_SIM_PUK_REQUIRED;
else if(13==lCode ¦ ¦14==lCode ¦ ¦15==lCode)
m_lLastError=ERR_SIM_COMMUNICATION;
else if(16==lCode)
m_lLastError=ERR_INCORRECT_PASSWORD;
else if(17==lCode)
m_lLastError=ERR_SIM_PIN2_REQUIRED;
else if(18==lCode)
m_lLastError=ERR_SIM_PUK2_REQUIRED;
else if(20==lCode)
m_lLastError=ERR_MEMORY_FULL;
else if(21==lCode)
m_lLastError=ERR_INVALID_INDEX;
else if(22==lCode)
m_lLastError=ERR_LOCATION_EMPTY;
else if(23==lCode)
m_lLastError=ERR_MEMORY_FAIL;
else if(24==lCode)
m_lLastError=ERR_TEXT_TOO_LONG;
else if(25==lCode)
m_lLastError=ERR_INVALID_CHARACTERS;
else if(26==lCode)
m_lLastError=ERR_NUMBER_TOO_LONG;
else if(27==lCode)
m_lLastError=ERR_INVALID_CHARACTERS;
else if(30==lCode)
m_lLastError=ERR_NETWORK_SERVICE;
else if(31==lCode)
m_lLastError=ERR_NETWORK_TIMEOUT;
else if(32==lCode)
m_lLastError=ERR_NETWORK_SERVICE;
else if(42==lCode ¦ ¦44==lCode ¦ ¦46==lCode)
m_lLastError=ERR_SIM_PIN_REQUIRED;
else if(43==lCode ¦ ¦45==lCode ¦ ¦47==lCode)
m_lLastError=ERR_SIM_PUK_REQUIRED;
else
m_lLastError=ERR_UNKNOWN_CODE;
}
}
else if(strResult.Find("+CMS ERROR:")>=0)
{
strTemp="+CMS ERROR:";
ParseResult(strResult,strTemp);
if(RC>=1)
{
lCode=atoi(RD[0]);
if(lCode<128)
m_lLastError=ERR_NETWORK_RP;
else if(lCode<256)
m_lLastError=ERR_NETWORK_TP;
else if(lCode==301)
m_lLastError=ERR_SMS_SERVICE;
else if(lCode==302 ¦ ¦lCode==302)
m_lLastError=ERR_NOT_SUPPORT;
else if(lCode=304 ¦ ¦lCode==305)
m_lLastError=ERR_SMS_PDU_PARAMETER;
else if(lCode==310)
m_lLastError=ERR_SIM_NOT_INSERTED;
else if(lCode==311 ¦ ¦lCode==312)
m_lLastError=ERR_SIM_PIN_REQUIRED;
else if(lCode==313 ¦ ¦lCode==314 ¦ ¦lCode==314)
m_lLastError=ERR_SIM_COMMUNICATION;
else if(lCode==316)
m_lLastError=ERR_SIM_PUK_REQUIRED;
else if(lCode==317)
m_lLastError=ERR_SIM_PIN2_REQUIRED;
else if(lCode==318)
m_lLastError=ERR_SIM_PUK2_REQUIRED;
else if(lCode==320)
m_lLastError=ERR_MEMORY_FAIL;
else if(lCode==321)
m_lLastError=ERR_INVALID_INDEX;
else if(lCode==322)
m_lLastError=ERR_MEMORY_FULL;
else if(lCode==330)
m_lLastError=ERR_SMSC_NOT_FOUND;
else if(lCode==331)
m_lLastError=ERR_NETWORK_SERVICE;
else if(lCode==332)
m_lLastError=ERR_NETWORK_TIMEOUT;
else
m_lLastError=ERR_UNKNOWN_CODE;
}
}
else if(strResult.Find("+CEER ERROR:")>=0)
{
strTemp="+CEER ERROR:";
ParseResult(strResult,strTemp);
if(RC>=1)
{
lCode=atoi(RD[0]);
if(atoi(RD[0])<128)
m_lLastError=ERR_NETWORK_RP;
else
m_lLastError=ERR_NETWORK_TP;
}
}
}
else if(strResult.Find("ERROR")>=0)
m_lLastError=ERR_NOT_SUPPORT;
else
m_lLastError=m_Con.m_lLastError;
retu。。。