Thông báo

Collapse
No announcement yet.

Nhờ mọi người chỉ giúp cách xử lý sms báo có tin nhắn tới của sim900a

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Nhờ mọi người chỉ giúp cách xử lý sms báo có tin nhắn tới của sim900a

    Ace xem hộ mình cái code này có bị sai phẩn nào k. Mình làm từ hôm qua, tới h mà nó vẫn k chạy đc như ý.
    Khi có tin nhắn tới thì sim900a nó gửi lệnh xuống như thế này:

    +CMTI: "SM",1

    Vấn đề là khi con sim900a nó gửi lệnh trên xuống thì con pic nó không nhận ra. Nên k gửi lệnh đọc tin nhắn ra cho con sim900a. Trong khi mình thử kết nối con pic với con ft232r với chương trìn terminal của máy tính và gửi thử lệnh:

    +CMTI: "SM",1

    Thì con pic lại nhận ra đc và gửi lệnh đọc tin nhắn lên cho chương trình terminal.


    CODE:

    void main() {
    TRISD = 0;
    UART1_Init(9600);
    UART2_Init(9600);
    UART1_Write_Text("ATE0\r"); //tat echo
    Delay_ms(200);
    UART1_Write_Text("AT+IPR=9600\r");//Baud 9600
    Delay_ms(200);
    UART1_Write_Text("AT+CMGF=1\r"); //dinh dang sms dang text mode
    Delay_ms(200);
    UART1_Write_Text("AT+CMGD=1,4\r"); // xoa tat ca cac sms
    Delay_ms(200);

    while(1)
    {

    while(UART1_Read()!=0x2b)// Khi phat hien co dau + thi dung vong lap
    {
    UART1_Read();
    }

    UART1_Write_Text("AT+CMGR=1\r"); // Yeu cau sim900a doc tin nhan ra
    }


    Nhờ mọi người chỉ giúp cái lệnh +CMTI: "SM",1 từ con sim900 gửi xuống và lệnh +CMTI: "SM",1 từ chương trình terminal gửi cho con pic nó có khác gì nhau k? Terminal gửi thì nó nhận ra có kí tự dấu + trong chuỗi để gửi lệnh đọc tin nhắn ra. Trong khi lắp sim900a thực tế vào thì sim900a nó gửi lệnh +CMTI: "SM",1 pic nó lại k phát hiện ra và gửi lệnh đọc tin nhắn ra. Thanks mọi người.

  • #2
    giữa con pic và sim900 mình có cần thêm mạch nào giữa các chân rx và tx của 2 con k mọi người. Điện áp chân tx của con sim mình đo đc 2.3 V trong khi điện áp chân tx của con pic đo đc 4v .

    Comment


    • #3
      vấn đề phần cứng thì nếu bạn cấp nguồn chung cho cả PIC và Sim thì ko cần thêm bất cứ gì nối trực tiếp là được. Còn về phần Code lập trình thì bạn chưa đua ra chương trình con UART của bạn nên ko biết sai chỗ nào cả.

      Comment


      • #4
        Nguyên văn bởi chuotbu92 Xem bài viết
        vấn đề phần cứng thì nếu bạn cấp nguồn chung cho cả PIC và Sim thì ko cần thêm bất cứ gì nối trực tiếp là được. Còn về phần Code lập trình thì bạn chưa đua ra chương trình con UART của bạn nên ko biết sai chỗ nào cả.
        cái chương trình uart là của thằng mikroe C for dspic nó viết sẵn các hàm đọc và ghi uart đó bạn, mình chỉ cần set tốc độ baud, số bit truyền, bit stop là xong rồi, các cái như cấu hình thạch anh,bảo vệ code,pll thì vào project edit là chỉnh đc hết,

        Comment


        • #5
          Theo mình nghĩ thì có thể bạn nên dùng thêm 1 lệnh AT nữa với sim900 "AT+CNMI=2,2,0,0,0", lệnh này hay ở chỗ là khi có tin nhắn thì nó bật luôn nội dung tin nhắn lên, thế là cứ thế xử lý thôi.

          Comment


          • #6
            Nếu bạn đặt thêm cái lênh kia thì khi có tin nhắn uart sẽ hiển thị như sau:
            PHP Code:
            +CMT"Sodienthoai",,"2015/03/27 03:33:07+28"
            OK GSM<-Noi dung tin nhan 
            Như vậy thì không phải đi lo bật cái tin nhắn vừa mới nhận nữa, có tin cái là xử lý được ngay.

            Comment


            • #7
              À còn khoản PIC với module GSM thì bạn thử kiểm tra xem PIC với GSM kia có cùng điện áp không?? Nếu như điện áp (hiện tại) của PIC và GSM khác nhau (1 cái 5v 1 cái 4.3v) chẳng hạn thì có thể lỗi nằm ở chỗ đó đấy. Mình mới vật vã với con Quectel M35 vì lỗi chênh lệch điện áp nên con M35 nhận ngon lệnh từ PIC gửi lên, nhưng PIC thì nhận UART của con GSM sai bét (nên trong chương trình có đoạn nào so sánh chuỗi thì chắc chắn không bao giờ hoạt động được để mà đưa ra hành động tương ứng.)

              Comment


              • #8
                Nguyên văn bởi myth-coder Xem bài viết
                À còn khoản PIC với module GSM thì bạn thử kiểm tra xem PIC với GSM kia có cùng điện áp không?? Nếu như điện áp (hiện tại) của PIC và GSM khác nhau (1 cái 5v 1 cái 4.3v) chẳng hạn thì có thể lỗi nằm ở chỗ đó đấy. Mình mới vật vã với con Quectel M35 vì lỗi chênh lệch điện áp nên con M35 nhận ngon lệnh từ PIC gửi lên, nhưng PIC thì nhận UART của con GSM sai bét (nên trong chương trình có đoạn nào so sánh chuỗi thì chắc chắn không bao giờ hoạt động được để mà đưa ra hành động tương ứng.)
                cái con sim 900a nó sài điện áp 4v1 bạn . Còn con pic mình cho chạy 5 v, mình thấy các lệnh gửi lênh cho sim không cần điều kiện thì con sim nó nhận đc và gửi về kí tự OK . Nhưng còn phần sim 900a gửi về thì hình như con pic nó không nhận đc. Mình cũng đã thử hạ con dspic xuống chạy điện áp 3v3 thì vẫn không thấy con pic nó phản ứng gì khi có lệnh báo hiệu có tin nhắn gửi xuống của sim 900

                Comment


                • #9
                  Nguyên văn bởi minhthanh89 Xem bài viết

                  cái chương trình uart là của thằng mikroe C for dspic nó viết sẵn các hàm đọc và ghi uart đó bạn, mình chỉ cần set tốc độ baud, số bit truyền, bit stop là xong rồi, các cái như cấu hình thạch anh,bảo vệ code,pll thì vào project edit là chỉnh đc hết,
                  Phần cấu hình của bạn chưa được lưu khi thiếu lệnh AT+CSAS và cái lệnh như bạn myth đã nói. làm về sim quan trọng nhất là tốc độ baud đó bạn. chỉ cần set sai 1 tí thôi là ko thể truyền nhận đc. Vì thế mình mới bảo bạn đưa code uart lên. bạn xem thử phần uart và ngắt nhận của mình dspic30f4013
                  void Init_UART(void)
                  {
                  U2MODE = 0x8000; // 8-bit, no parity, 1 stop bit, using UxTX and UxRX I/O pins
                  U2STA = 0x0400; // Bit10=UTXEN
                  U2BRG = (((FCY/baud)/16)-1);
                  _U2RXIE=1; //UART1 Receiver Interrupt Enable bat ngat nhan uart2
                  }
                  void __attribute__((interrupt, auto_psv))_U2RXInterrupt()
                  {
                  _U2RXIF=0;
                  while(!_URXDA); //Cho den khi nhan duoc mot ky tu
                  c= U2RXREG; //chuoi thong tin (gom byte) tu UART
                  if(c=='#')
                  {
                  khoa=0;
                  tinmoi=1;
                  }
                  if(khoa==1)
                  {
                  buff_sms[dem]=c; // Nhan chuoi thong tin (gom byte) tu UART
                  dem++; // Tang bien dem so luong byte da nhan trong chuoi.
                  }
                  if(c=='*')
                  {
                  khoa=1;
                  dem=0;
                  }
                  }

                  Comment


                  • #10
                    Nguyên văn bởi minhthanh89 Xem bài viết
                    cái con sim 900a nó sài điện áp 4v1 bạn . Còn con pic mình cho chạy 5 v, mình thấy các lệnh gửi lênh cho sim không cần điều kiện thì con sim nó nhận đc và gửi về kí tự OK . Nhưng còn phần sim 900a gửi về thì hình như con pic nó không nhận đc. Mình cũng đã thử hạ con dspic xuống chạy điện áp 3v3 thì vẫn không thấy con pic nó phản ứng gì khi có lệnh báo hiệu có tin nhắn gửi xuống của sim 900
                    Vậy thì phải kiểm tra lại xem đã lập trình đúng chưa. Nếu là con PIC xịn có 2 UART chẳng hạn thì thử cho 1 cổng UART giao tiếp với GSM cái còn lại thì cho nó giao tiếp với Máy tính, hoặc cắm LCD cho nó hiển thị lên xem đã hiển thị đúng chưa??? Bạn còn hên chán khi có USB to COM để test. Hôm trước tui dùng Arduino bride UART của GSM sau đó truyên tín hiệu đó sang cho PIC thì chương trình viết trên PIC chạy vô tư (Nguyên nhân là do PIC nhận UART của GSM bị lỗi)

                    Comment


                    • #11
                      Nguyên văn bởi myth-coder Xem bài viết
                      Theo mình nghĩ thì có thể bạn nên dùng thêm 1 lệnh AT nữa với sim900 "AT+CNMI=2,2,0,0,0", lệnh này hay ở chỗ là khi có tin nhắn thì nó bật luôn nội dung tin nhắn lên, thế là cứ thế xử lý thôi.
                      Bạn cho hỏi, nếu sử dụng lệnh này, nội dung nhận được có kèm theo sđt của bên gửi ko. Trường hợp mình muốn lọc sđt gửi đến, liệu có dùng được?

                      Comment


                      • #12
                        Nguyên văn bởi nhanh0112 Xem bài viết
                        Bạn cho hỏi, nếu sử dụng lệnh này, nội dung nhận được có kèm theo sđt của bên gửi ko. Trường hợp mình muốn lọc sđt gửi đến, liệu có dùng được?
                        Nó có mẫu thế này
                        PHP Code:
                        +CMT"Sodienthoai",,"2015/03/27 03:33:07+28"
                        OK GSM<-Noi dung tin nhan 
                        cái "Sodienthoai" là số của người gửi đấy. Bạn có USB2COM mà cứ gõ thử lệnh AT kia rồi gửi tin nhắn thì sẽ rõ, lên đây hỏi thì biết đến bao giờ mới có câu trả lời???? Còn về lọc số điện thoại thì mẫu trả về nó thế đấy, chỉ quan trọng lập trình thế nào thôi mà.

                        Comment


                        • #13
                          hình như khi sim900 nó gửi tín hiệu báo nhận tin nhắn về: +CMTI: "SM",2 chẳng hạn thì ngoài cái chuỗi +CMTI: "SM",2 nó còn kèm theo 1 mớ các mã máy nữa phải k mọi người. Nếu mình dùng lệnh gets() của CSS và lưu cái chuỗi này vào 1 mảng thì các cái mã đi kèm theo chuỗi +CMTI: "SM",2 cũng được lưu vào mảng hả mọi người ?

                          Comment


                          • #14
                            Nguyên văn bởi minhthanh89 Xem bài viết
                            hình như khi sim900 nó gửi tín hiệu báo nhận tin nhắn về: +CMTI: "SM",2 chẳng hạn thì ngoài cái chuỗi +CMTI: "SM",2 nó còn kèm theo 1 mớ các mã máy nữa phải k mọi người. Nếu mình dùng lệnh gets() của CSS và lưu cái chuỗi này vào 1 mảng thì các cái mã đi kèm theo chuỗi +CMTI: "SM",2 cũng được lưu vào mảng hả mọi người ?
                            Nếu con sim 900 của bạn mà giống con quectel m35 tui từng làm thì không có cái vụ mã máy đâu nhé ascii 100% luôn, nếu có thì có thêm ký tự 0x0D 0x0A là cùng. Gets() nếu khi xảy ra ngắt RDA thì bạn không get được chuỗi đâu nhé chỉ có 1 ký tự thôi. bạn phải chắc chắn rằng cái buffer bạn dùng để chứa chuỗi khi nhận về từ UART được làm rỗng hoàn toàn <Nếu bạn dùng buffer để nhận>. Đầu tiên bạn hãy để cho PIC và module chạy cùng 1 nguồn để chắc chắn rằng code của bạn là chuẩn, vì khoản chênh lệch điện áp giữa 2 con hoàn toàn có thể khiến cho PIC không nhận chuẩn được dữ liệu từ UART của GSM. và nếu code sai thì cũng chẳng có gì là lạ khi có những ký tự không đâu.
                            PHP Code:
                            #int_RDA
                            void  RDA_isr(void)
                            {
                               
                            char c;
                               ;
                               
                            disable_interrupts(GLOBAL);
                               
                            c=getch();
                               
                            //putc(c);
                               
                            if((c==0x0D) || (c==0x0A) || (cursor>=BUF_SIZE-1)){
                                  if(
                            cursor>1)
                                     
                            parserUart();
                                  
                            cursor=0;
                               }else
                                  
                            buf[cursor++]=c;
                               
                            clear_interrupt(int_rda);
                               
                            enable_interrupts(GLOBAL);
                            }


                            void parserUart(void)
                            {
                            ​    // Làm gì thì làm
                                // Khi nhận đầy buffer hoặc gặp ký tự xuống dòng được truyền qua UART thì hàm này được gọi
                                
                            zero_buffer();// đổ đầy 0x00 vào buffer để chắc chắn rằng dữ liệu nhận về từ buffer là chuẩn

                            Tui chỉ có thể giúp bạn cái hàm thay cho gets() còn cái khác thì tự động não đi. Bạn có thể dùng chính Serial Monitor của CCS ở mục tool để xem raw dữ liệu của UART là gì (Nhớ là cắm GSM với máy tính thông qua USB2COM hoặc cái gì đó đại loại thế) Vì cái serial monitor nó cho phép hiển thị cả mã hexa của dữ liệu nhận về, các công cụ khác thì tui không biết mới nghịch PIC được 5-6 ngày nay thì phải.

                            Comment


                            • #15
                              Nguyên văn bởi nhanh0112 Xem bài viết
                              Bạn cho hỏi, nếu sử dụng lệnh này, nội dung nhận được có kèm theo sđt của bên gửi ko. Trường hợp mình muốn lọc sđt gửi đến, liệu có dùng được?
                              Tui không hiểu "Liệu có dùng được" ở đây là gì??? Tui đã viết chương trình cho PIC khi nhận được tin nhắn với cú pháp hợp lệ dạng như:
                              OK GSM: REPORT
                              Và GSM trả về những thông tin cần báo cáo cho chính cái SDT gửi đến cho tui nhờ vào phân tích cái dòng
                              PHP Code:
                              +CMT"Sodienthoai",,"2015/03/27 03:33:07+28"
                              OK GSMREPORT 
                              Bạn có thể mở rộng thêm với lệnh
                              PHP Code:
                              AT+CLIP=
                              để khi có cuộc gọi đến nó cũng hiển thị luôn số điện thoại người gọi lên, có dạng như sau:
                              PHP Code:
                              +CLIP"Số điện thoại",161,"",,"",
                              "Số điện thoại" chính là số điện thoại của người gọi đến cho mình.

                              Comment

                              Về tác giả

                              Collapse

                              minhthanh89 Tìm hiểu thêm về minhthanh89

                              Bài viết mới nhất

                              Collapse

                              Đang tải...
                              X