串口助手+GSM猫 怎么发不了短信 很着急!!!!
AT+CSCA="+8613800290500" 设置短信中心AT+CMGF=1 设置为TEXT格式
AT+CMGS="手机号码" 发送的手机号码
到发短信的时候就发不出去 为什么?
手机收不到? 现在收到了 可是发不了 汉字 那就是编码的问题了,研究一下通信资料。是编码问题。
'以下为MSComm1的设置,非常重要
MSComm1.RThreshold = 1 '若 Rthreshold 属性设置为 0(缺省值)则不产生 OnComm 事件,如果设置 Rthreshold 为 1,接收缓冲区收到每一个字符都会使 MSComm 控件产生 OnComm 事件。
MSComm1.RTSEnable = True '确定是否使 Request To Send (RTS) 线有效。一般情况下,由计算机发送 Request To Send 信号到联接的调制解调器,以请示允许发送数据。
'当 RTSEnable 设置为 True,端口打开时,Request To Send 线设置为高电平,端口关闭时,设置为低电平。
'Request To Send 线用在 RTS/CTS 硬件握手。RTSEnable 属性允许手动检测 Request To Send 线以确定其状态。
MSComm1.SThreshold = 1 '在 MSComm 控件设置 CommEvent 属性为 comEvSend 并产生 OnComm 事件之前,设置并返回传输缓冲区中允许的最小字符数。
'若设置 Sthreshold 属性为 0(缺省值),数据传输事件不会产生 OnComm 事件。
'若设置 Sthreshold 属性为 1,当传输缓冲区完全空时,MSComm 控件产生 OnComm 事件。
'如果在传输缓冲区中的字符数小于 value,CommEvent 属性设置为 comEvSend,并产生 OnComm 事件。
'comEvSend 事件仅当字符数与 Sthreshold 交叉时被激活一次。
'例如,如果 Sthreshold 等于 5,仅当在输出队列中字符数从 5 降到 4 时,comEvSend 才发生。
'如果在输出队列中从没有比 Sthreshold 多的字符,comEvSend 事件将绝不会发生。
'没有以上三行(默认设置)就不能收到返回的信息,也不能接收短信
MSComm1.CommPort = 4 '设置端口号码,控件手工设置无效,必须重新指定
MSComm1.Settings = "9600,N,8,1" '9600波特,无奇偶校验,8位数据,一个停止位,可省略
MSComm1.PortOpen = True '打开端口,不,可省略
MSComm1.Output = "AT" & vbCr '告诉MODEM发送的是AT命令,可省略
MSComm1.Output = "AT+CNMI=2,2" & vbCr '选择当有新的短消息来时系统提示方式
MSComm1.Output = "AT+CMGF=0" & vbCr '使用PDU模式
Public Function SendString(TargetPhoneNumber As String, MsgText As String) As String '获取转换后PDU模式下要发送的短信串先说这些,再不会就买现成的吧 发中文要进行PDU编码,英文的可以不用。
Dim Shortdialhex As String '十六进制接收号码
Dim Shorttexthex As String '十六进制短信内容
Dim Shorttextlenhex As String '十六进制短信长度
Shortdialhex = "" '处理接收号码
Dim b, ib As Integer
Dim cin, c1, c2, cout As String
shortdial = TargetPhoneNumber
b = Len(TargetPhoneNumber) '
For ib = 1 To b
If (ib Mod 2 = 0) Then
c = Mid(TargetPhoneNumber, ib - 1, 2)
c1 = Left(c, 1)
c2 = Right(c, 1)
cout = c2 & c1
Shortdialhex = Shortdialhex & cout
End If
Next
Shortdialhex = Shortdialhex & "F" & Right(TargetPhoneNumber, 1) '十六进制接收号码
Dim ii, Shorttextlen, jj As Integer '处理要发送的字符
Dim aa, bb, cc As String
Shorttexthex = ""
ii = Len(MsgText)
Shorttextlen = 0
For jj = 1 To ii
aa = Mid(MsgText, jj, 1) '获取一个字符
bb = AscW(aa) '变成内码
cc = Hex(bb) '变成16进制
If bb < 128 And bb > 0 Then
Shorttextlen = Shorttextlen + 2
cc = "00" & cc
Else
Shorttextlen = Shorttextlen + 2
End If
Shorttexthex = Shorttexthex & cc
'MsgBox "cc=" & cc
Next jj
If Shorttextlen < 15 Then '处理要发送文本的长度
Shorttextlenhex = "0" + CStr(Hex(Shorttextlen))
Else
If i < 70 Then
Shorttextlenhex = CStr(Hex(Shorttextlen))
Else
Shorttextlenhex = "8C"
End If
End If
SendString = "AT+CMGS=" & (Shorttextlen + 15) & Chr$(13) & "0011000D9168" & Shortdialhex & "0008A7" & Shorttextlenhex & Shorttexthex & Chr$(26)
End Function
如果想自己进行编码和解码处理,你搜索一下PDU编码会有很多相关资料的。
如果不想自己做,也有很多现成的接口可以调用,搜索一下也很多的。
买短信机的时候也会配送一些软件,里面也有些有API接口的程序。不过有些
不是那么好用,稳定性很成问题。
如果有能力,建议还是自己做整个过程安全稳定点,我都是自己做的,用在自
动化控制上,比用那些非产品级的接口灵活稳定得多。
我也遇到了发短信发不出去。。。楼主是怎么解决的啊???跪求解决方法。。。为什么CTRL+Z不管用呢? 我手机10086短信收不到,怎么办?
//**************************************************************************
//** 函 数 名:SendSMS
//** 功能描述:通过串口操作发送短信。
//** 参数输入:hComProt - 必要参数。串口端口号。
//** :strPhone - 必要参数。目标电话号码。
//** :strText - 必要参数。要发送的短信正文,纯英文需在
//** : 160 字符以内,中文或中英混杂的文本需在
//** : 70 个字符以内。
//** 返 回:成功返回非零,失败返回零
//** 创建日期:2010-09-10
//** 修改日期:
//** 版 本 号:Version 1.0.0
//**************************************************************************
long _stdcall SendSMS(int hComProt, char * strPhone, char * strText)
{
VBString SendText;
BOOL OpenState;
DWORD NowTickCount;
DWORD SaveTickCount;
DWORD PDUSize = 0;
char * SendOver;
SendOver = (char *)GlobalAlloc(GMEM_ZEROINIT, 2);
SendOver[0] = (char)0x1A;
CommandMode = 2;
Approach = 0;
ExecOver = FALSE;
ReturnValue = 0;
//先计算PDU编码
SendString = PDUEncode(strPhone,strText,(long *)&PDUSize);;
if(SendString.length==0){
return 0;
}
if(PDUSize==0){
return 0;
}
SendString &= SendOver;
GlobalFree((HGLOBAL)SendOver);
COMInfo = "";
ReadString = "";
COMM1.EventRead = SendSMS_Event;
COMM1.Port = hComProt;
COMM1.BaudRate = CBR_57600;
COMM1.ByteSize = 8;
COMM1.Parity = 0;
COMM1.StopBits = 1;
OpenState = COMM1.Open();
if(OpenState==TRUE){
PDUSize = PDUSize + 15;
SendText.Format("AT+CMGS=%03d\r",PDUSize);
SaveTickCount = GetTickCount();
COMM1.Send((BYTE*)*SendText);
//SendText.Release();
while(ExecOver==FALSE){
Sleep(5);
NowTickCount = GetTickCount();
if(NowTickCount-SaveTickCount>=8000){
ReturnValue = 0;
ExecOver=TRUE;
}
}
COMM1.Close();
}
CommandMode = 0;
return ReturnValue;
}
//**************************************************************************
//** 事 件 名:SendSMS_Event
//** 功能描述:配合 SendSMS 函数处理串口操作的串口通信处理过程。
//** 创建日期:2010-09-10
//** 修改日期:
//** 版 本 号:Version 1.0.0
//**************************************************************************
void SendSMS_Event(DWORD pClassAddress, BYTE *ReadBuffers, DWORD ReadCount)
{
BYTE *tmpChar;
VBString tmpStr;
tmpChar = (BYTE *)GlobalAlloc(GMEM_ZEROINIT, 2);
tmpStr.set_Bytes(ReadBuffers);
tmpStr.set_Trim();
if(tmpStr.length>0){
COMInfo &= *tmpStr;
ReadString &= *tmpStr;
ReadString.set_UCase();
switch(Approach){
case 0:
if(ReadString.InStr(1,">")!=0){
ReadString = "";
Approach = 1;
COMM1.Send(SendString.get_BYTES());
}
break;
case 1:
if(ReadString.InStr(1,"+CMGS:")!=0){
ReadString = "";
Approach = 2;
}else if(ReadString.InStr(1,"ERROR")!=0){
ReadString = "";
Approach = 0;
ReturnValue = 0;
ExecOver = TRUE;
}
break;
case 2:
if(ReadString.InStr(1,"OK")!=0){
ReadString = "";
Approach = 0;
ReturnValue = 1;
ExecOver = TRUE;
}if(ReadString.InStr(1,"ERROR")!=0){
ReadString = "";
Approach = 0;
ReturnValue = 1;
ExecOver = TRUE;
}
break;
}
}
}
我有C++的代码 text模式用unicode是可以发送中文的
补充:VB , 基础类