超长短信的发送和接收问题
我想通过手机模块SIM4222s发送如下英文短信:“1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890qwertyuiop”
总共为170字符,7-bit编码。我将这条短信分成两条发送,第一条发送152个字符,即“12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012”,
发送的PDU串为:0051000D91685188204848F70000009F0608040001020131D98C56B3DD7039584C36A3D56C375C0E1693CD6835DB0D9783C564335ACD76C3E56031D98C56B3DD7039584C36A3D56C375C0E1693CD6835DB0D9783C564335ACD76C3E56031D98C56B3DD7039584C36A3D56C375C0E1693CD6835DB0D9783C564335ACD76C3E56031D98C56B3DD7039584C36A3D56C375C0E1693CD6835DB0D9783C564
发送成功;
第二条发送18个字符:即“34567890qwertyuiop”,发送的PDU串为:0051000D91685188204848F70000001906080400010202335ACD76C3E560F17B594ECFD7D36F38
发送失败;
从测试结果看,似乎是这样:如果发送的字符为8的整数倍就可以成功,否则发送失败。另外,如果将协议头改为6字节的方式,即“05 00 03 XX MM NN”,在发送字符为8的整数倍时也可以发送,但是接收方显示乱码;
查资料说在这种情况下需要添加填充位,不知道是不是这个原因。
请问在发送超长短信时需要怎么设置才可以,PDU type字段,用户数据长度的计算,编解码需要注意些什么,请高手指点。
我使用的7-bit编码函数:
// psrc: 源字符串指针
// pdst: 目标编码串指针
// srclen: 源字符串长度
// 返回: 目标编码串长度
static int encode_7bit(const char *psrc, uchar *pdst, int srclen)
{
int src; // 源字符串的计数值
int dst; // 目标编码串的计数值
int ch; // 当前正在处理的组内字符字节的序号,范围是0-7
uchar left; // 上一字节残余的数据
// 计数值初始化
src = 0;
dst = 0;
// 将源串每8个字节分为一组,压缩成7个字节
// 循环该处理过程,直至源串被处理完
// 如果分组不到8字节,也能正确处理
while(src<srclen)
{
// 取源字符串的计数值的最低3位
ch = src & 7;
// 处理源串的每个字节
if(ch == 0) {
// 组内第一个字节,只是保存起来,待处理下一个字节时使用
left = *psrc;
} else {
// 组内其它字节,将其右边部分与残余数据相加,得到一个目标编码字节
*pdst = (*psrc << (8-ch)) | left;
// 将该字节剩下的左边部分,作为残余数据保存起来
left = *psrc >> ch;
// 修改目标串的指针和计数值
pdst++;
dst++;
}
// 修改源串的指针和计数值
psrc++;
src++;
}
// 返回目标串长度
return dst;
}
[解决办法]
之前用SIM300C的时候,我是在控制软件上自己做的拆分
[解决办法]
楼上的兄弟能具体说明一下吗?现在卡在这个问题上了。
我也看了手机发送过来的长短信格式,用的协议头是6字节的,我去掉协议头之后用7-bit解码,但是显示乱码;但是我用的解码函数是可以解码普通短信的(短信内容不带协议头的短信)。是不是编解码的时候还要注意些什么,但是没有找到具体的资料。各位有什么经验可以分享吗?多谢!