1、檢測串口線的好壞
1)將串口線插在電腦上,用短路子短接串口的2腳和3腳
2)打開串口調(diào)試助手
3)點擊自動發(fā)送,在自動發(fā)送的窗口中隨便發(fā)個數(shù)據(jù),看看能不能接收到若能接收到自己發(fā)的數(shù)據(jù)表示串口線是正常的,否則是壞的。
2、下完單片機程序后,看看串口是否有數(shù)據(jù)發(fā)出檢測
3、單片機上與模塊通信的4個燈表示的含義
1)DO燈
一直閃表示單片機串口與GSM模塊串口通信不正常,否則串口通信正常
2)D1燈
燈亮就表示模塊注冊上網(wǎng)絡(luò),否則沒有注冊上網(wǎng)絡(luò)
3)D2燈
燈亮表示開始發(fā)短信
4)D3燈
燈亮表示發(fā)短信結(jié)束
4、單片機板子與GSM模塊的連接
單片機---------GSM模塊
VCC--------vcc(P5的第3腳)
GND--------GND(P5的第4腳)
RX_232(表示單片機的發(fā))----------RXDPC_232(模塊的收(P5的第5腳))
TX_232(表示單片機的收)----------TXD_PC232(模塊的發(fā)(P5的第6腳))
gsm模塊和單片機連接
單片機連接GSM模塊,直接就是把異步串行通信口的TX和RX連上就可以,別忘了地線。
注意事項:
1、不同的單片機有不同的電壓,一般GSM模塊的輸入輸出電平是2.85V,51系列的電平是5V,一般在51輸出的TX那根線上串聯(lián)2K的電阻,基本上可以使用。如果是3.3V的單片機,這個電阻就可以很小,幾百歐姆就可以。
2、GSM模塊本身的電源和SIM卡電路很麻煩,首先是大多數(shù)GSM模塊都是用FPC40的接口,排線的間距只有零點五毫米,而且是塑料外殼,不好焊接。焊不好的話工作不穩(wěn)定。其次是電源部分較麻煩,GSM模塊的發(fā)射電流較大,最大瞬間電流2A!所以電源部分一般要用LM2576這種大電流的DC-DC變換器來提供4V的電壓,DCDC電路設(shè)計本身就很不容易,個人應(yīng)用比較難,需要做電路板。搭接的不穩(wěn)定。還有SIM卡部分,SIM卡與GSM模塊通信本身就是個復(fù)雜的高頻過程,電路抗干擾能力強,我曾經(jīng)試過用電線給它們連接起來,沒有十分鐘,就掉線了。所以SIM卡部分也需要精心設(shè)計,別看只有五根數(shù)據(jù)線而已。
單片機控制TC35GSM模塊的方法 1、硬件連接電路見下圖只需設(shè)計一個TTL轉(zhuǎn)RS232電平電路,連接到MCU的UART口,另一端直接連接到TC35。
2、指令輸出的方法
單片機串口設(shè)置成模式1(9600,N,8,1),依次將AT+xxx以ASCII碼形式輸出到UART口;接收TC35的數(shù)據(jù)采用中斷方式。這里給出詳細的程序清單(Keil C51),不介紹編程的方法。程序見下:
//AT指令的定義
char code AT_Tc35[]=“AT+”; //連機
char code Bps_Tc35[]=“IPR=38400”; //波特率
char code Text_Tc35[]=“CMGF=1”; //文本模式
char code Read_Tc35[]=“CMGR=”; //讀信息
char code Erase_Tc35[]=“CMGD=”; //刪除信息
char code Send_Tc35[]=“CMGS=”; //發(fā)送信息
char code Creg_Tc35[]=“CREG?”; //注冊
//模式設(shè)置
void UART_Init(void)
{
SCON=0x50; //01010000b=》1模式scon,#11011000b;
ES=l;
}
//發(fā)送-個ASCII
void SendASC(unsigned char ASC)
{
bit es;
es=ES;
ES=0;//關(guān)閉中斷
TI=0;
SBUF=ASC;
while(!TI);
TI=0;
ES=es;
?。?/p>
//發(fā)送命令到TC35
void SendToTc35(unsigned char* p,unsigned char Long)
{
while(Long--)
{
SendASC(*p++);
}
}
// 通訊中斷接收程序
void Rs485_Do(void) interrupt 4 using 1
{
if(RI==l)
{
RI=0;
RsBuq[RsPoint++]=SBUF;
if fRsPoint》=sizeof(RsBuf))
{
RsPoint=0;//FlagRs485=0;
} //數(shù)據(jù)處理
}
}
// 發(fā)送AT連機命令
char code AT_Code[]=“OK”;
void Send_AT(void)
{
unsigned char *p;
while(1)
{
ClrRsBuf(RsBuf,sizeof(RsBuf));
SendToTc35(AT_Tc35,2); //“AT”
SendASC(OVER);
//************等待應(yīng)答“ok“
ES=1; //必須中斷
Delay(50);
P=strstr(RsBuf,AT_Code);
if(p!=NULL) break;
}
?。?/p>
//發(fā)送bps連機命令
void Send_BPS(void)
{
SendToTc35(AT_Tc35,3); //”AT+“
SendToTc35(Bps_Tc35,sizeof(Bps_Tc35)-1);//”IPR=19200“
SendASC(OVER);
}
//設(shè)置文本
void SetText(void)
{
SendToTc35(AT_Tc35,3); //”AT+“
SendToTc35(Text_tc35,sizeof(Text_tc35)-1);//”IPR=19200“
SendASC(OVER);
Delay(100):
//刪除短信息
unsigned char EraseMsg(unsigned char index)
{
unsigned char *p,i=20;
SendToTc35(AT_Tc35,3); //”AT+“
SendToTc35(Erase_Tc35,sizeof(Erase_Tc35)-1);//”IPR=19200“
SendASC(index);
SendASC(OVER);
ES=1;
while(i--)
{
Delay(200);
P=strstr(RsBuf,AT_Code);
if(P!=NULL) {return 1;}
}
return 0;
}
//讀取短信息
char code Ask_No[]=”+CMGR:0,,0“;
char code ERROR{]=”ERROR“;
char code Ask_Tc35[]=”/“;
unsigned char ReadMsg(unsigned char index)
{
unsigned char *p,i;
unsigned char Buf[40];
SendToTc35(AT_Tc35,3); //”AT+“
SendToTc35(Read_Tc35,sizeof(Read_Tc35)-1);
SendASC(index);
SendASC(OVER);
ES=1; //必須中斷
Delay(600);
/*-------
ES=0:
SendToTc35(RsBuf,99);
ES=1;
*/|
p=strstr(RsBuf,ERROR);
if(P!=NULL)
{
Send_AT();return 0;
p=strstr(RsBuf,Ask_No);//無信息
if(p!=NULL)return 0;
p=strstr(RsBuf,Ask_Tc35);//20個字節(jié)后是MSG
if(p==NULL) return 0;
p=p+21;
for(i=0;i《sizeof(Buf);i++)
{
Buf[i]=*p++;
}
if(EraseMsg(index)==0) return 0;
p=strcpy(RsBuf,Buf); //放回RsBuf
return 1;
?。?/p>
//發(fā)送短信息
char code SK[]=”》“;
void SendMsgStart(void)
{
unsigned char *p,i=10;
SendToTc35(AT_Tc35,3); //”AT+“
SendToTc35(Send_Tc35,sizeof(Send_Tc35)-1);//”IPR=19200“
SendASC(YinHao);
SendToTc35(Mp1.Hand,sizeof(Mp1.Hand)); //”AT+“
SendASC(YinHao);
SendASC(OVER);
ES=1;
while(i--)
{
Delay(100); //Get”》“
p=strstr(RsBuf,SK);//”》“
if(p!=NULL)
{
ClrRsBuf(RsBuf,sizeof(RsBuf));
Delay(150); //Get”》“
break;
}
}
}