AT 指令 | 功 能 |
AT+CMGC | Send an SMS command(发出一条短消息命令) |
AT+CMGD | Delete SMS message(删除SIM卡内存的短消息) |
AT+CMGF | Select SMS message formate(选择短消息信息格式:0-PDU;1-文本) |
AT+CMGL | List SMS message from preferred store(列出SIM卡中的短消息PDU/text: 0/"REC UNREAD"-未读,1/"REC READ"-已读,2/"STO UNSENT"-待发,3/"STO SENT"-已发,4/"ALL"-全部的) |
AT+CMGR | Read SMS message(读短消息) |
AT+CMGS | Send SMS message(发送短消息) |
AT+CMGW | Write SMS message to memory(向SIM内存中写入待发的短消息) |
AT+CMSS | Send SMS message from storage(从SIN|M内存中发送短消息) |
AT+CNMI | New SMS message indications(显示新收到的短消息) |
AT+CPMS | Preferred SMS message storage(选择短消息内存) |
AT+CSCA | SMS service center address(短消息中心地址) |
AT+CSCB | Select cell broadcast messages(选择蜂窝广播消息) |
AT+CSMP | Set SMS text mode parameters(设置短消息文本模式参数) |
AT+CSMS | Select Message Service(选择短消息服务) |
串口通信 在C#中要实现串口通信,很多人都不知所措,在论坛上经常可以看到"怎么用MSCOMM实现串口通信"、"怎样能过串口与设备相连"诸如此类的问题。其实国外的网友早就把这些列入FAQ中了。 通常,在C#中实现串口通信,我们有四种方法: 第一:通过MSCOMM控件这是最简单的,最方便的方法。可功能上很难做到控制自如,同时这个控件并不是系统本身所带,所以还得注册,不在本文讨论范围。可以访问http://www.devhood.com/tutorials/tutorial_details.aspx?tutorial_id=320 ,一个国外网友的写的教程,作者很热心,我曾有发邮件给他,很快就回复了。 第二:微软在.NET新推出了一个串口控件,基于.NET的P/Invoke调用方法实现,详细的大家可以访问微软网站http://msdn.microsoft.com/msdnmag/issues/02/10/NETSerialComm/default.aspx,方便得到更多资料。 第三:就是用第三方控件啦,可一般都要付费的,不太合实际,不作考虑 第四:自己用API写串口通信,这样难度高点,但对于我们来说,可以方便实现自己想要的各种功能 在本文,我们采用第四种方法来实现串口通信,不过不是自己写,用一个国外网友现成的已经封装好的类库,不过功能简单点,相对我们来说已经够用了。 在整个终端短信的操作过程中,与串口的通信,只用到了四个功能,打开、写、读、关闭串口。下面是类库对这四个功能的定义: 打开串口: 函数原型:public void Open() 说明:打开事先设置好的端口 示例:
写串口: 函数原型:public void Write(byte[] WriteBytes) WriteBytes 就是你的写入的字节,注意,字符串要转换成字节数组才能进行通信 示例: ss_port.Write(Encoding.ASCII.GetBytes("AT+CGMI\r")); //获取手机品牌 读串口: 函数原型:public byte[] Read(int NumBytes) NumBytes 读入缓存数,注意读取来的是字节数组,要实际应用中要进行字符转换 示例: string response = Encoding.ASCII.GetString(ss_port.Read(128)); //读取128个字节缓存 关闭串口: 函数原型:ss_port.Close() 示例: ss_port.Close(); 由于篇幅,以及串口通信涉及内容广泛,我在这里只讲这些。 在上面我们已经把终端短信所需的各种原始技术有所了解,是可以小试牛刀的时候了。 |
控件名称 | 控件Name属性 | 说明 |
TextBox | targetNumber | 接收手机号码 |
TextBox | CenterNumber | 短信中心号 |
TextBox | smsState | 发送短信后,返回的信息。注意设置控件为多行 |
TextBox | smsContent | 短信内容,同样,注意设置为多行 |
ComboBox | ConnectPort | 连接手机的端口,例:COM1\COM2 |
ComboBox | ConnectBaudRate | 串口连接的波特率,在串口通信中很重要的 |
Button | btnSend | 发送按钮 |
Button | btnConnect | 连接按钮,主要用于程序的初始化 |
Button | btnExit | 退出按钮 |
using JustinIO; using SMS; using System.IO; using System.Text; |
/// <summary> /// 初始化串口 /// </summary> public bool InitCom(string m_port, int m_baudrate) { ss_port.PortNum = m_port;//串口号 ss_port.BaudRate = m_baudrate;//波特率 ss_port.ByteSize = 8;//数据位 ss_port.Parity = 0;// ss_port.StopBits = 1;//停止位 ss_port.ReadTimeout = 1000;//读超时 try { if (ss_port.Opened) { ss_port.Close(); ss_port.Open(); } else { ss_port.Open();//打开串口 } return true; } catch(Exception e) { MessageBox.Show("错误:" + e.Message); return false; } } |
/// <summary> /// 初始化代码,并获取手机相关信息 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnConnect_Click(object sender, System.EventArgs e) { bool opened = InitCom(ConnectPort.SelectedItem.ToString(),Convert.ToInt32(ConnectBaudRate.SelectedItem.ToString()));//打开并初始化串口 bool Connected = false; if (opened) { ss_port.Write(Encoding.ASCII.GetBytes("AT+CGMI\r")); //获取手机品牌 string response = Encoding.ASCII.GetString(ss_port.Read(128)); if (response.Length > 0) { ConnectState.Text = response.Substring(10,7); Connected = true; } else { ConnectState.Text = "与手机连接不成功"; Connected = false; } ss_port.Write(Encoding.ASCII.GetBytes("AT+CGMM\r"));//获取手机型号 response = Encoding.ASCII.GetString(ss_port.Read(128)); if(response.Length > 0) { ConnectState.Text =ConnectState.Text+ " " + response.Substring(10,5) + " 连接中......"; Connected = true; } else { ConnectState.Text = "与手机连接不成功"; Connected = false; } ss_port.Write(Encoding.ASCII.GetBytes("AT+CSCA?\r"));//获取手机短信中心号 response = Encoding.ASCII.GetString(ss_port.Read(128)); if(response.Length > 0) { CenterNumber.Text = response.Substring(20,13); Connected = true; } else { Connected = false; } if (Connected == true) { btnConnect.Enabled = false; btnSend.Enabled = true; } else { btnConnect.Enabled = true; btnSend.Enabled = false; } } } |
/// <summary> /// 发送短信 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnSend_Click(object sender, System.EventArgs e) { string decodedSMS = sms.smsDecodedsms(CenterNumber.Text,targetNumber.Text,smsContent.Text); byte[] buf =Encoding.ASCII.GetBytes(String.Format("AT+CMGS={0}\r",sms.nLength)); ss_port.Write(buf); string response = Encoding.ASCII.GetString(ss_port.Read(128)); string SendState = ""; if( response.Length > 0 && response.EndsWith("> ")) { ss_port.Write(Encoding.ASCII.GetBytes(String.Format("{0}\x01a",decodedSMS))); SendState = "发送成功!"; } else { SendState = "发送失败"; } string Result = String.Format("{0},{1},{2},\n\r",targetNumber.Text,smsContent.Text,SendState); smsState.Text += Result; } |
/// <summary> /// 关闭串口,退出程序 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnExit_Click(object sender, System.EventArgs e) { ss_port.Close(); Application.Exit(); } |