📄 收发原理.txt
字号:
{
ss_port.Close();
Application.Exit();
}
到这里都告一个段落了,所有的功能都完成了!不过由于这仅仅是一个演示用例,还有很多没有考虑,像串口通信中的,在实际操作不可这样操作的,应该用多线程来处理,一个专门用来读串口,一个专门用来写串口。还有程序中很多防出错代码没有添加进去,希望有心有朋友添加,并公布出来,这也是我写这篇文章希望看到的结果。请勿将本程序直接用于实际中,真诚提醒你!
终于写完了,我也放松了许多,本来很早就应该完成了,因为一些个人原因,没有及时写完,向那些曾经问过我相关问题,没有及时回复的朋友,抱歉一声,希望你们继续支持我!
调试环境:
Windows 2000 Professional、Visual Studio.NET、西门子3508手机、西门子专用数据线。
你主要是实现什么功能呢?我先在有几个用自定义函数希望能对你有所帮助:
这是用PDU模式发中文短信的编码:
手机号的编码:
private string PhoneEncode(string PhoneNumber)
{
byte Buffer;
ASCIIEncoding AE=new ASCIIEncoding();
byte[] Mobilephone=AE.GetBytes(PhoneNumber);
for(int i=0;i<=8;i=i+2)
{
Buffer=Mobilephone[i];
Mobilephone[i]=Mobilephone[i+1];
Mobilephone[i+1]=Buffer;
}
string Charnumber=AE.GetString(Mobilephone);
Charnumber=Charnumber.Insert(10,"F");
Charnumber="0001000D9168"+Charnumber+"0008A7";
return Charnumber;
}
中文短信的编码:
private string UnicodeEncoding(string Msg)
{
byte[] Bytes = Encoding.Unicode.GetBytes(Msg.ToCharArray());
int mlength;
int i;
mlength =(Bytes.Length > 140? 140: Bytes.Length);
Msg = "";
for(i = 0;i<=mlength-1;i=i+2)
{
Msg += String.Format("{0:X2}", Bytes[i + 1]);
Msg += String.Format("{0:X2}", Bytes[i]);
}
Msg=string.Format("{0:X2}",mlength)+Msg;
return Msg;
}
中文短信的解码:
private string UnicodeDecoding(string Msg)
{
byte[] Bytes=new byte[Msg.Length];
int i,j;
j=0;
for(i=0;i<=Msg.Length-1;i=i+4)
{
Bytes[j+1]=byte.Parse(Msg.Substring(i,2),System.Globalization.NumberStyles.HexNumber);
Bytes[j]=byte.Parse(Msg.Substring(i+2,2),System.Globalization.NumberStyles.HexNumber);
j=j+2;
}
return Encoding.Unicode.GetString(Bytes);
}
谁能把一下代码转成C#代码—— 手机短信息SMS开发—编码和解码 ?
手机短信息SMS开发—编码和解码
2002-07-04· · ··C++builder资源中心
1、 英文编码
缺省的GSM字符集为7位编码,ASCII码为8位编码,编码就是将8位ASCII编码转换为7位编码。
例如:1234 编码后得到31D98C06
2进制表示
8位编码 00110001 00110010 00110011 00110100
7位编码 00110001 11011001 10001100 00000110
通过例子可以看出,将ascii8位编码的Bit8去掉,依次将下7位编码的后几位逐次移到前面,形成新的8位编码。
以下是C++Builder的实现代码:
String __stdcall EncodeEnglish(String InputStr)
{
int n,len,cur;
String tempstr,returnstr;
unsigned char mid1[2],mid2[2];
len=InputStr.Length();
n=0;
for(int i=1;i<=len;i++)
{
if (i
{
strcpy(mid1,InputStr.SubString(i,1).c_str());
strcpy(mid2,InputStr.SubString(i+1,1).c_str());
cur=(mid1[0]>>n)|((mid2[0]<<(7-n))& 0xff);
}
else
{
strcpy(mid1,InputStr.SubString(i,1).c_str());
cur=(mid1[0]>>n)& 0x7f;
}
FmtStr(tempstr,"%2.2X",ARRAYOFCONST((cur)));
returnstr=returnstr+tempstr;
n=(n+1)%7;
if (n==0)
i++;
}
return returnstr;
}
2、英文解码
简单地说就是将7位字符编码转换为8为字符编码
以下是C++Builder的实现代码:
int ReturnHex(int Value)
{
switch (Value)
{
case 0:
Value=0x7f;
break;
case 1:
Value=0x3f;
break;
case 2:
Value=0x1f;
break;
case 3:
Value=0x0f;
break;
case 4:
Value=0x07;
break;
case 5:
Value=0x03;
break;
case 6:
Value=0x01;
break;
case 7:
Value=0x00;
break;
}
return Value;
}
String __stdcall DecodeEnglish (String InputStr)
{
unsigned char InStr[300];
char OutStr[300];
String str;
int j=0,i=0;
int Point=0;
int temp;
memset(InStr,0,301);
memset(OutStr,0,301);
for(int i=0;i
{
str="0x"+InputStr.SubString(i+1,2);
InStr[i/2]=StrToInt(str);
}
while(j<=InputStr.Length()/2)
{
if(Point==0)
OutStr[i]=InStr[j]&ReturnHex(Point);
else
OutStr[i]=((InStr[j]&ReturnHex(Point))<>(8-Point));
if(Point%7==0&&Point!=0)
Point=0;
else
Point=Point+1;
i++;
j=i-(i/8);
}
OutStr[12]=((InStr[12]&0x07)<<5)|(InStr[11]>>(8-5));
return AnsiString(OutStr);
}
3、中文编码
中文编码较为简单,就是将GB2312的中文编码转换为代码页为CP936的Unicode编码即可
以下是C++Builder的实现代码
String EncodeChinese(String InputStr)
{
int cur;
String tempstr,returnstr;
WideString ws;
wchar_t mid[2];
ws=WideString(InputStr);
for(int i=1;i<=ws.Length();i++)
{
wcscpy(mid,ws.SubString(i,1).c_bstr());
cur=mid[0];
FmtStr(tempstr,"%4.4X",ARRAYOFCONST((cur)));
returnstr=returnstr+tempstr;
}
return returnstr;
}
4、中文解码
将代码页为CP936的Unicode编码转换为GB2312的中文编码即可
以下是C++Builder的实现代码
String DecodeChinese(String InputStr)
{
wchar_t Buf[300];
for(int i=0;i
{
Buf[i/4]=StrToInt("0x"+InputStr.SubString(i+1,4));
}
Buf[InputStr.Length()/4]=0;
return WideCharToString(Buf);
}
ChangNing(Redpower)
public static string UCSUnCode(string szPdu)
{
string tempStr="";
for(int i=0;i<szPdu.Length-1;i=i+4)
{
string m=szPdu.Substring(i,4);
int n=int.Parse(m,System.Globalization.NumberStyles.AllowHexSpecifier);
tempStr=tempStr+Convert.ToChar(n);
}
return tempStr;
}
备注:
这是我在写手机短信息解码PDU时写的函数!里面可以把UNICODE字符转为汉字(中文)
szPdu "AT+CMGR=1\r\r\n+CMGR: 2,,12\r\n0891683108503505F0110000810008FF046A2A6EE8\r\n\r\nOK\r\n" string
1) In order to make your modem responds to incoming message automatically, you need issue "AT+CNMI=2,1,0,0,0" command when you initialize your modem. When new SMS comes in, modem will automatically respond using "+CMTI" command.
2) Chinese is much more difficult to deal with compare to English. You cannot simply use a Chinsese string. PDU format must be used. So you have to parse your Chinese message according to PDU format. This will apply to both incoming and ongoing messages.Beside PDU format, you have to encdoe/decode Chinese string using Unicode format. The following code is for Chinese Unicode Encode and Decode purpose.
Note: Please refer to GSM 07.05 Version 4.5.0 for more information about PDU format and AT commands.
#Region "UCS2 (16bit) Encoding & Decoding"
Private Function UnicodeEncoding(ByVal Msg As String) As String
Dim Bytes() As Byte = Encoding.Unicode.GetBytes(Msg.ToCharArray())
Dim l As Integer
Dim i As Integer
l = IIf(Bytes.Length > 140, 140, Bytes.Length)
Msg = ""
For i = 0 To l - 1 Step 2
Msg &= String.Format("{0:X2}", Bytes(i + 1))
Msg &= String.Format("{0:X2}", Bytes(i))
Next i
Return Msg
End Function
Private Function UnicodeDecoding(ByVal Msg As String) As String
Dim Bytes(Msg.Length / 2 - 1) As Byte
Dim i, j As Integer
j = 0
For i = 0 To Msg.Length - 1 Step 4
Bytes(j + 1) = Int32.Parse(Msg.Substring(i, 2), NumberStyles.HexNumber)
Bytes(j) = Int32.Parse(Msg.Substring(i + 2, 2), NumberStyles.HexNumber)
j = j + 2
Next i
Return Encoding.Unicode.GetString(Bytes)
End Function
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -