2014-03-05 79 views
0

我想從我的ARM7 LPC2148板發送消息。我已將SIM900 GSM調制解調器連接到電路板的UART0。但是我沒有收到我手機上的信息!!我已經把打印報告放在這裏和那裏,以便我知道系統在哪裏以及卡在哪裏。但它會打印所有消息。它說,即使我沒有收到任何短信,發送的消息。 下面是代碼:接口gsm與LPC2148

主代碼

#include "i2c.h"      
#include "LPC214x.H"         // LPC2148 MPU Register 
#include <stdio.h> 
#include "gsm.h" 
#include "lcd.h" 
#include "buzzer.h" 


extern int msgflag;              
/* Main Program Start Here */ 
int main(void) 
{ 

    PINSEL0 = 0x00000000;  // Enable GPIO on all pins 
PINSEL1 = 0x00000000; 
PINSEL2 = 0x00000000; 


    lcd_init();           // Initial LCD 
    lcd_write_control(0x01);        // Clear Display (Clear Display,Set DD RAM Address=0) 
    goto_cursor(0x00);         // Set Cursor Line-1 
    lcd_print("Accident Alert");      // Display LCD Line-1 

         // Display LCD Line-2 
            // Display Delay 

           // Clear Display (Clear Display,Set DD RAM Address=0) 
         // Display LCD Line-1  
    goto_cursor(0x40);         // Set Cursor = Line-2 
    lcd_print("System");      // Display LCD Line-2 
    delay1(100000000); 


gsmperform(); 

    // Loop Print Message to LCD16 x 2 // 
               // Loop Continue 








sendmsg(); 
msgflag=0; 
lcd_write_control(0x01);       // Clear Display (Clear Display,Set DD RAM Address=0) 
    goto_cursor(0x00);         // Set Cursor Line-1 
    lcd_print("Message sent");      // Display LCD Line-1 



} 

gsm.c

#include<lpc214x.h>             /*Header file*/ 
#include "gsm.h"     
#include "lcd.h"          //header file 
extern unsigned char cmgf[]="AT+CMGF=1";       //Text format in GSM modem 
extern unsigned char cmgs[]="AT+CMGS=\"9xxxxxxxxx\"";    //Mobile number to which the msg is sent 
extern unsigned char msg[]="hello";        //secret code 
extern unsigned char readall[]="AT+CMGR=\"REC UNREAD\"\r\n"; 


extern int blink; 
unsigned char content[7]; 
void txu1(unsigned char data)     //Transmit a byte of data through UART1 
{ 
while(!(U1LSR & 0x20));       // Wait until UART1 ready to send character 
    U1THR = data; 
} 
unsigned char rxu1() 
{ 
unsigned char p; 
while ((U1LSR&0x01)!=1); 
p=U1RBR; 
return p; 
} 
unsigned char rxu0() 
{ 
unsigned char p; 
while ((U0LSR&0x01)!=1); 
p=U0RBR; 
return p; 
} 
void sendstring(unsigned char *p)   //Sends a string of data through UART1 
{ 
while(1) 
{ 
if(*p=='\0') break; 
txu1(*p++); 
} 
} 
void delaygsm()       //delay function 
{ 
int i,j; 
for(i=0;i<60000;i++) 
for(j=0;j<51;j++); 
} 
void delay2()        //delay function 
{ 
int i,j; 
for(i=0;i<60000;i++) 
for(j=0;j<200;j++); 
} 
unsigned char recuart1()    //recieves a byte from UART1 
{ 
unsigned char p; 
while ((U1LSR&0x01)!=1); 
p=U1RBR; 
return p; 
} 





void uart1_irq() __irq     //ISR if anything is recieved in UART1, the same is transmitted through UART0 
{ 
unsigned char p; 
p=U1RBR; 
if(p=='a') 
{ 
sendmsg(); 
} 
VICVectAddr=0; 
} 
void sendmsg(void) 
{ 


sendstring(msg); 


} 
void initgsm()        //Initialization of UART0,UART1 and ISR 
{ 
U0LCR=0x83; 
U0DLL=0x61; 
U0DLM=0x00; 
U0LCR=0x03; 
U1LCR=0x83; 
U1DLL=0x61; 
U1DLM=0x00; 
U1LCR=0x03; 
U1IER=0x01; 
U1FCR=0x07; 
VICIntSelect&=0xffffff7f; 
VICVectAddr2=(unsigned int)uart1_irq; 
VICIntEnable|=0x00000080; 
VICVectCntl2=0x20|7; 
} 
void gsmperform(void) 
{ 
lcd_write_control(0x01);       // Clear Display (Clear Display,Set DD RAM Address=0) 
    goto_cursor(0x00);         // Set Cursor Line-1 
    lcd_print("begin gsm");      // Display LCD Line-1 
PINSEL0|=0x00050005; 
PINSEL1|=0x00000000; 
PINSEL2|=0x00000000; 
initgsm(); 
sendstring("ATe0\r\n"); 
delaygsm(); 
sendstring("AT+CMGD=1,4\r\n"); 
delaygsm(); 
sendstring("AT+CNMI=1,0,0,0\r\n"); 
delaygsm(); 
lcd_write_control(0x01);       // Clear Display (Clear Display,Set DD RAM Address=0) 
    goto_cursor(0x00);         // Set Cursor Line-1 
    lcd_print("end gsm");      // Display LCD Line-1 
} 
+0

也許我錯過了一些東西,但是您沒有在您提供的代碼中發送任何短信。 「ATe0」關閉回聲,「AT + CGMD」刪除消息,「AT + CNMI」配置新的消息指示。 – Vicky

+0

要發送的消息是你好。我已在msg []中定義。我應該怎麼做呢?我錯過了什麼/ – user3359953

+0

嗯 - 你的代碼中沒有任何地方是你實際使用CGMS字符串的一開始。其次,有兩種方法可以使用AT + CGMS命令,無論是文本格式還是PDU格式。你似乎有一個邪惡的混合 - 我建議你閱讀AT命令文件。第三,我驚訝於'extern char foo [] =「blah」;'甚至編譯,我建議你在你的編譯器上打開/關閉警告。 – Vicky

回答

0

分手的問題分爲三個部分 - 配置&發送命令,接受正確命令,並一起工作。

  1. 將您的LPC2148開發板連接到PC,並使用PC終端程序來觀看您要發送的命令。確保程序的各個部分工作正常。你在編譯器中運行任何優化選項嗎?這肯定會弄亂你的延遲功能。使用內置定時器來提供延遲,而不是for循環。
  2. 確保您使用正確的命令與GSM卡通話。如果可能的話,將其連接到PC(確保從邏輯電平轉換爲UART電平(如果它沒有RS-232收發器)或運行交互式終端的套件。確保你的命令實際上會發送一個SMS消息給你選擇的模塊。
  3. 現在連接套件和模塊。現在您應該知道哪些信號實際上是輸出,哪些是輸入 - RS-232可能會對此非常困惑。大多數處理器UART被標記爲DTE(TX ==輸出,RX ==輸入),並且我期望通信模塊被標記爲DCE(TX ==輸入,RX ==輸出),這意味着您將連接RX < - > RX和TX < - > TX。如果它們都標記爲DTE,則需要使用零調制解調器電纜交換信號,或者在連接電路板時手動進行。