PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   PIC - Thiết kế và Ứng dụng (http://www.picvietnam.com/forum/forumdisplay.php?f=23)
-   -   SIM908 GSM/GPRS + GPS Module (http://www.picvietnam.com/forum/showthread.php?t=13608)

saturday_ll 22-05-2012 05:58 PM

Sim908, sim 548c
 
Mình có các loại module sim này. Bác nào cần liên hệ với mình theo sdt 0985 299 318 nha!

dangkhoa1011 23-05-2012 07:20 PM

sim 908 của mình làm theo sơ đồ bác longtu mình đã gọi điện và nhận cuôc gọi ,cũng như đọc tin nhắn được .
nhưng mình gửi tin nhắn ko được ,mình viết như trong hướng dẫn tập lệnh AT sim 548 :
>at+cmgf=1 /*Đăng nhập mạng GSM, chọn chế độ gửi tin nhắn Text*/
>OK
>at+cmgs="0945302248"/*Gửi tin nhắn tới số điện thoại*/
> tai sao khong gui duoc /*noi dung tin nhan ,sau đó mình nhấn ESC ,or phím ->*/
>
>OK /*nó trả về OK*/
không còn gì hơn nửa ,tin nhắn ko tới số cần nhận ,
không có chuỗi trả về thông báo kết quả quá trình gửi tin nhắn. (+CMGS: )
cũng không báo lỗi (+CMS ERROR)
bạn nào biết tại sao không ,chỉ mình với
có cần phải cài đặt trung tâm tin nhắn gì không ?

longtu 27-05-2012 09:04 PM

Trích:

Nguyên văn bởi dangkhoa1011 (Post 63900)
sim 908 của mình làm theo sơ đồ bác longtu mình đã gọi điện và nhận cuôc gọi ,cũng như đọc tin nhắn được .
nhưng mình gửi tin nhắn ko được ,mình viết như trong hướng dẫn tập lệnh AT sim 548 :
>at+cmgf=1 /*Đăng nhập mạng GSM, chọn chế độ gửi tin nhắn Text*/
>OK
>at+cmgs="0945302248"/*Gửi tin nhắn tới số điện thoại*/
> tai sao khong gui duoc /*noi dung tin nhan ,sau đó mình nhấn ESC ,or phím ->*/
>
>OK /*nó trả về OK*/
không còn gì hơn nửa ,tin nhắn ko tới số cần nhận ,
không có chuỗi trả về thông báo kết quả quá trình gửi tin nhắn. (+CMGS: )
cũng không báo lỗi (+CMS ERROR)
bạn nào biết tại sao không ,chỉ mình với
có cần phải cài đặt trung tâm tin nhắn gì không ?

Tôi trả lời bạn như sau:
Cmd: AT+CMGF=1 //SMS Text Mode.
Bạn chỉ cần chỉ sử dụng 1 lần thôi, không cần lặp lại mỗi lần gửi tin nhắn.

Bạn làm các bước sau để gửi tin nhắn:
Bước 1: CMD: AT+CMGS="090xxxxx"<CR>
Lưu ý:
+ Phải có 2 dấu ngoặc kép('') ở 2 đầu số điện thoại.
+ Phải có Carrige Return(\r) ngay sau dấu ngoặc kép thứ 2.
Ví dụ:
char SenderPhone[]= "\"0988xxxxxxx\"";
...
fprintf(COM_GSM,"AT+CMGS=%s\r\n",SenderPhone);

Buớc 2: Đợi điện thoại/Sim 908 Module trả về: dấu '>'

Bước 3: Ghi nội dung tin nhắn và kết thúc bằng SUB và ESC để gửi tin nhắn.
Ví dụ: Muốn gửi nội dung SMS: My name is Phung Minh Tuan.
#define SUB 0x1A
#define ESC 0x1B
....
fprintf(COM_GSM,"My name is Phung Minh Tuan.%c%c",SUB,ESC);

Bạn thử xem.
Thân,

dangkhoa1011 27-05-2012 10:47 PM

hi ,em mới giao tiếp mới máy tính qua HyperTerminal thôi ,nhưng chưa gửi được tin nhắn ,nên anh trả lời em không hiểu lắm ^^"
em gõ lệnh AT
>at+cmgs="094530****"
sau đó nhấn Enter thôi ,
gõ nội dung ,sau đó nhấn Esc ,nó trả về OK ,nhưng không gửi được !

longtu 28-05-2012 12:04 AM

Trích:

Nguyên văn bởi dangkhoa1011 (Post 64652)
hi ,em mới giao tiếp mới máy tính qua HyperTerminal thôi ,nhưng chưa gửi được tin nhắn ,nên anh trả lời em không hiểu lắm ^^"
em gõ lệnh AT
>at+cmgs="0945302248"
sau đó nhấn Enter thôi ,
gõ nội dung ,sau đó nhấn Esc ,nó trả về OK ,nhưng không gửi được !

Tại sao bạn nói làm theo sơ đồ của tôi mà lại sử dụng được HyperTerminal?

Sơ đồ của tôi giao tiếp giữa Sim908 với Microcontroller, vì vậy tôi gợi ý cho bạn theo dạng này.

Voi HyperTerminal cũng vậy thôi, ban xem lai bài viết của tôi và quên đi các ví dụ tôi viết. Các bước vẫn như vậy.

Thân,

longtu 03-06-2012 02:54 PM

Giao tiếp Microcontroller + Sim908
 
Như tôi đã nói, tôi sẽ trở lại với luồng nay sau khi làm xong ứng dụng liên quan đến MCU + Sim908. Kết quả đạt được của tôi khá tốt, tôi sẽ lần lượt gợi ý để các bạn dễ dàng nắm bắt.

1. Nhắc lại một số ý quang trọng:
- Tôi đã và đang trình bày cách thức giao tiếp giữa MCU với Sim908. Nếu các bạn nào chỉ giao tiếp SIM908 với PC qua HyperTerninal thì xem để tham khảo và áp dụng cho đúng.
- Các bạn xem lại sơ đồ kết nối giữa MCU(Pic 18F24K22) + Sim908 ở đây:
http://www.picvietnam.com/forum/show...73&postcount=7
Trong đó:
+ GSM_TXD nối trực tiếp với MCU_RXD1
+ MCU_TXD1 qua cầu phần áp(2.2K và 3.3K) trước khi nối với GSM_RXD

+ GPS_TXD nối trực tiếp với MCU_RXD2:
http://i657.photobucket.com/albums/u...tupic/Fig1.jpg
Hình ảnh trên, các bạn sẽ thấy rằng thông qua J6, ta sẽ có 2 lựa chọn: 1 là GPS_TXD(Sim908), 2 là RX_MCU(Từ PC-->RS232).
http://i657.photobucket.com/albums/u...tupic/Fig2.jpg
+ Thông qua các chân RX_MCU và TX_MCU ta có thể upload firmware cho MCU(qua bootloader), debug firmware...cấu hình ban đầu cho Sim908...
Trong sơ đồ của tôi không sử dụng GPS_RXD. Tuy nhiên, các bên nên sử dụng cả chân này nếu như muốn upload firmware mới cho Sim908 để sửa một số lỗi. Các bạn đọc bài viết này của tôi:
http://www.picvietnam.com/forum/show...5&postcount=24

longtu 03-06-2012 03:13 PM

Giao tiếp Microcontroller + Sim908
 
2. Một số lệnh AT để Kiểm Tra, Cấu hình cho Sim908:
2.1 Một số lệnh Kiểm Tra:
- Ngay sau khi có phần cứng, các bạn lắm Sim và sử dụng một số lệnh sau để kiểm tra:
[AT Command] //[Description]
AT //Check communication between the module and PC/Microcontroller.
ATD<Caller Phone Number>//Call to phone number. Ex: ATD0988434887;
ATDL//Reial last telephone number.
ATI //Display Product Identification Information. Ex: Return:SIM900 R11.0
AT&V//Display Current Configuration.
AT+GSV//Display Product Identification Information. Ex: SIMCOM_Ltd - SIMCOM_SIM908 - Revision:1137B02SIM908M64_ST
AT+CSQ //Signal Quality Report.Ex: +CSQ: 28,0 (<99 Signal is good)
AT+CPIN? // Check Sim status. Ex: +CPIN: READY
AT+IPR? // Check(Test/Set/Read) Baud rate. Ex: +IPR: 0(Auto_bauding)
AT+CSCA? //SMS Service Center Address. Ex: +CSCA: "+84980200030",145
AT+CMTE? //Read the temperature when the module is running. Ex: +CMTE: 0,38
AT+CGREG? //Network Registration Status. Return: +CREG: 1,1 - Enable Network and Registed.
AT+CGMI// Get manufacturer information. Ex: SIMCOM_Ltd
AT+CGMR// Get software version. Ex: Revision:1137B02SIM908M64_ST
AT+CGSN //Get device IMEI. 861001000034104
AT+COPS? // Display the current network operation: +COPS: 0,0,"VNM and VIETTEL"

Và còn rất nhiều lệnh khác nũa, các bạn xem them trong AT Command cho Sim908.

p_zeus 09-06-2012 04:37 PM

chào ca nha mình cho minh hỏi xíu con sim908 cua mình chay GSM mà không chạy GPS thi no lanh tanh khong một tí nhiệt nào , nhưng cho chay chêm chú GPS một lúc thì nhiệt độ em no lên tam 45 50 độ , nhưng vẩn chạy bình thương. không biết lý do tại sao nưa . liệu có gì bất thường với con sim908 của mình không nhi

mynametan 15-06-2012 10:48 PM

Chào cả nhà cho em hỏi em làm đồ án điều khiển thiết bị qua tin nhắn sms...
Khi modum gởi tin nhắn phản hồi cho điện thoại....thì pic tự nhiên nhận chuỗi ký tự đòi xử lý mà em ko hề gởi chuỗi cho modum....rồi đứng lun hệ thống...mong mọi người giúp đỡ a?????????

longtu 17-06-2012 07:03 PM

Trích:

Nguyên văn bởi mynametan (Post 70659)
Chào cả nhà cho em hỏi em làm đồ án điều khiển thiết bị qua tin nhắn sms...
Khi modum gởi tin nhắn phản hồi cho điện thoại....thì pic tự nhiên nhận chuỗi ký tự đòi xử lý mà em ko hề gởi chuỗi cho modum....rồi đứng lun hệ thống...mong mọi người giúp đỡ a?????????

Tôi nhận được code và sơ đồ của bạn qua email. Bạn hãy upload đoạn code cũng như sơ đồ của bạn lên đây để mọi người cùng rút kinh nghiệm. Tôi xem nhanh code bạn và có nhận xét code của bạn như sau
- Luôn quan sát NetLight Led có chớp hay không.
- Khi nhấn Power Key, Status Led phải sáng và luôn để ý Led này trong suốt quá trình sử dụng. Vì nếu như Led này tự động tắt, rất có thể nguồn cung cấp không đủ...
- puts("at+cmgr=1"); và puts("at+cmgd=1"); Rẩt có thể chương trình của bạn đứng tại đây, bạn thiếu \r để kết thúc lệnh. Ví dụ: printf("AT+CMGR=1\r\n");
- Nói chung, code bạn viết là không chặt chẽ. Bạn cần tìm hiểu để viết code chặt chẽ hơn.
Tôi gợi ý đoạn code nhận tin nhắn sms như sau:
- Đâu tiên, các bạn phải cấu hình/thiết lập nhận tin nhắn:
AT+CNMI=1,1,0,0,0 New message indication enable.
Khi đó, mỗi lần có tin nhắn mới sẽ nhận được chuỗi data như sau:
+CMTI: "SM",<index>\r\n
Chú ý:
1. Luôn bắt đầu bằng chuỗi: "+CMTI"
2. Luôn kết thúc bằng: \r\n
==>Dựa vao 1 va 2 để biết ĐÚNG là tin nhắn tới và loại bỏ những data không đúng là tin nhắn...
Code:

/* Chú ý:
 * Tôi su dung RDA2 de nhan SMS. Khai báo cua tôi nhu sau:
 */
#USE RS232(BAUD=38400, XMIT=PIN_B6, RCV=PIN_B7, STREAM=COM_GSM)
...
//------------------------------------------------------------------------------
#define  BUFSMS_SIZE 165      //SMS size the same 160 characters.
#define  BUFSMS_MASK BUFSMS_SIZE-2
char buffSMS[BUFSMS_SIZE];

//Define:
#define OK_        0                      // Used to look up in SetSearchString( Response )
#define CMTI_      1                      // Used to look up in SetSearchString( Response )
#define READY_      3                      // Used to look up in SetSearchString( Response )
#define CRLF_      4                      // Used to look up in SetSearchString( Response )

unsigned char  OK[]    = "OK\r\n";                  // "OK"
unsigned char  CMTI[]  = "+CMTI:";              // New Message arrived
unsigned char  READY[]  = "> ";                      // Phone ready to receive text message
unsigned char  CR_LF[]  = "\r\n";                    // Carrige Return Line Feed 

unsigned char  *searchFor;                            // Flash pointer

// Private pointer
static unsigned char searchStr;

static int8 rx_i;
int8 nextIn2;
int8 rx_ack=0;    //Acknowledge Flag.

void InitBuffCom2(void);
void SetSearchString( unsigned char Response );
void EnableReceivSMS();
/* Int_rad2:
 * Có tin nhắn mới: rx_ack= 1, ngược lai rx_ack= 0.
 */
#INT_RDA2
void serial_isr2()
{
  int8 i;
  char c;
  c= buffSMS[nextIn2++]= fgetc(COM_GSM);
  //fputc(buffSMS[nextIn2-1],COM_GPS); //Could be used for testing.

  if( nextIn2 > BUFSMS_MASK)
  {
      nextIn2= 0;    //Reset write index.
      disable_interrupts(int_rda2);// Disable RX interrupt
  }
 
  if( searchFor[rx_i] == c)
  {
      rx_i++;
      if( !searchFor[rx_i] )
      {
        rx_i= 0;
        if( searchStr == CMTI_  )                //+CMTI
        {
            searchFor= CR_LF; //Wait for
            searchStr = CRLF_;
        }       
        else
        {
            rx_ack= 1;           
            disable_interrupts(int_rda2);// Disable RX interrupt
        }
      }   
  }
 
  else
  {
      rx_i= 0;      //Not valid search pattern...start again.
  }
 
}

/* 
 *  Reset receive interrupt SMS data.
 */
void InitBuffCom2(void)
{
  disable_interrupts(int_rda2);// Disable receive SMS message.
  rx_i= rx_ack = 0;
  nextIn2 = 0;
  buffSMS[nextIn2] = NULL;//#define NULL '\0'
}
/* 
 *  Set desired search string
 * Usage:
 * - Call: InitBuffCom2(); <?> //Reset receive buffSMS
 * - Call: SetSearchString( unsigned char Response )
 * - Call: AT command
 * - Call: EnableReceivSMS()
 */
void SetSearchString( unsigned char Response )
{
  disable_interrupts(int_rda2);// Disable receive SMS message.
  switch (Response)
    {
    case OK_:
            searchFor= OK;
            break;
    case CMTI_:
            searchFor= CMTI;
            break;
    case READY_:
            searchFor= READY;
            break;
    default:
            break;
    }
    searchStr = Response;                //Used in rx_isr
    rx_i = 0;
}
/*
 * Enable Receiv SMS:
 */
void EnableReceivSMS()
{
  enable_interrupts(int_rda2);
}
/*  Check acknowledge returned from phone
 *
 *  This function checks if an acknowledge
 *  has been received from the phone. A counting loop is also
 *  included to avoid waiting for a acknowledge that never arrives.
 *
 *  Return Value:
 *    1 Success, correct acknowledge
 *    0 Error, returned "ERROR" or timed out
 */
#define  KEYHIT_DELAY  5000    //  milliseconds
Int Check_acknowledge()

  unsigned int32  timeout=0;
  int retval;
  int16 temp_delay=0;
 
  retval= 0;
  rx_ack= 0;          //Zero ackowledge flag.
  while((rx_ack==0)&& (++timeout<(KEYHIT_DELAY*100))) 
      delay_us(10);
 
  if(rx_ack)          //Everything worked out fine...rx turned off
  {
      rx_ack= 0;        //Reset ackowledge flag.
      retval= 1;
  }
  else                //A timeout could result from no acknowledge.
  {
    // fputc('A',COM_GPS);
      InitBuffCom2();
      retval= 0;
  }
  while((temp_delay++)<10000);//Delay a few miliseconds.
  return(retval);
}
/*Delete a message at index= 1
 *
 */
Void deleteSMS()
{
    InitBuffCom2();
    SetSearchString( OK_ ); 
    fprintf(COM_GSM,"AT+CMGD=1\r");
    EnableReceivSMS(); 
    if( Check_acknowledge() > 0 )  //Acknowledge = "OK"
    {         
      return;
    }
    else                          //Acknowledge != "OK"
    {
      fprintf(COM_GPS,"ERROR: No Ack!\r\n");
      return;
    }
}
//----------------------------------------------

Void main()
{
  ...
  enable_interrupts(int_rda2);
 
  enable_interrupts(GLOBAL);
  ...
  deleteSMS(); //Chú ý A
  InitBuffCom2();
  SetSearchString( CMTI_ );  //Waiting the new SMS message.
  EnableReceivSMS(); //Ready to receive the new SMS message.
//Main program:
  while(1)
  {
      if( rx_ack )
      {
      //Xu ly tin nhan moi.
      deleteSMS();//Chú ý B
      InitBuffCom2();
      SetSearchString( CMTI_ );  //Waiting the new SMS message.
      EnableReceivSMS(); //Ready to receive the new SMS message.
      }
  }
}

Chú ý A: deleteSMS()
- Luôn xóa tin nhắn tại index= 1, điều này có nghĩa rằng khi nhận được tin nhắn mới thì chắc chắnc rằng tin nhắn mới sẽ được lưu trong index= 1.

Chú ý B: deleteSMS()
- Khi xử lý xong tin nhắn mới, phải xóa tin nhắn ở index= 1 này để sẵn sàng nhận tin nhắn mới vào index= 1.

longtu 17-06-2012 07:24 PM

Giai thich DeleteSMS()
 
Code:

Void deleteSMS()
{
    InitBuffCom2();  //Reset receive buffSMS
    SetSearchString( OK_ );  //Nếu Delete SMS thành công, sẽ nhận được xác nhận "OK"
    fprintf(COM_GSM,"AT+CMGD=1\r"); //Lệnh AT xóa tin nhắn tại index 1.
    EnableReceivSMS();  //Cho phép nhận xác nhận từ SIM module.
    if( Check_acknowledge() > 0 )  //Acknowledge = "OK"
    {         
      return;
    }
    else                          //Acknowledge != "OK"
    {
      fprintf(COM_GPS,"ERROR: No Ack!\r\n");
      return;
    }
}


longtu 17-06-2012 07:33 PM

Xử lý tin nhăn mới.
 
Code:

while(1)
  {
      if( rx_ack )
      {
      //Xu ly tin nhan moi.
      InitBuffCom2();
      SetSearchString( CMTI_ );  //Waiting the new SMS message.
      EnableReceivSMS(); //Ready to receive the new SMS message.
      }
  }

Khi đọc tin nhắn mới tại index, các bạn nhận được data như ví dụ sau:
+CMGR: "REC UNREAD","+849xxxxxxxx","","12/05/07,23:53:49+28"\r\n
<nội dung tin nhắn>\r\n
OK\r\n

Như vậy, trong đoạn chương trình "Xử lý tin nhắn mới" các bạn chú ý sau:
- Nếu đọc thành công sẽ nhận được xác nhận: "OK".
- Dựa vào chú ý này các bạn nhận biết được việc đọc tin nhắn có thành công hay không.
- Dựa vào symbol (") để tách nội dung tin nhắn nhận được:
+ Dấu (") thứ 2 tới thứ 3: Số điện thoại gửi tin nhắn.
+ Dấu (") thứ 6 tới thứ 7: Date và time.
+ Dấu (") thứ 7 + 3 ký tự là đến: <nội dung tin nhắn>

Tôi chỉ gợi ý như vậy, các bạn tự viết code để thực hiện việc xử lý tin nhắn mới.

Thân,

hieuthai2011 19-06-2012 04:25 PM

bài viết của a long tử rất hay !!!
A ơi a có thể viết code lọc 1 vài ký tự cho mọi người xem được ko vậy !! e chưa hiểu mấy ý tưởng của a lắm mong được trợ giúp học hỏi rât nhiều !!!!hjhj

tienchuan 26-06-2012 11:31 AM

Trích:

Nguyên văn bởi hieuthai2011 (Post 72007)
bài viết của a long tử rất hay !!!
A ơi a có thể viết code lọc 1 vài ký tự cho mọi người xem được ko vậy !! e chưa hiểu mấy ý tưởng của a lắm mong được trợ giúp học hỏi rât nhiều !!!!hjhj

thnks a ấy bằng cách nhấn cảm ơn nhé các bạn :)

FUD84 28-06-2012 01:42 PM

bác longtu viết rất hay và bổ ích. Bác cho mình hỏi bác mua con battery Li-ion 3.7V 1100mA ở đâu, và cái battery holder nữa?, mà nó tích hợp cả circuit protection luôn hả bác?. Cảm ơn bác rất nhiều.


Múi giờ GMT. Hiện tại là 12:45 AM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam