Nguyên văn bởi hitechvn
Xem bài viết
Thông báo
Collapse
No announcement yet.
Hỏi về giao tiếp AVR và module SIMCOM
Collapse
X
-
Nguyên văn bởi hoang_3i Xem bài viếtmình biết chỗ này bán Hoàng Phát-Cửa hàng linh kiện điện tửSống là để chiến đấu
Comment
-
Nguyên văn bởi hoang_3i Xem bài viếthic làm gì có kí tự này : putchar('\r');
putchar('\n');
chương trình dịch ko báo lỗi mới lạSống là để chiến đấu
Comment
-
Nguyên văn bởi quangtung112 Xem bài viếtEm lại làm phiền các anh chút, các a cho e hỏi: e 1 bật hoặc tắt 1 thiết bị nào đó thì e nt với cú pháp "BAT1 mật khẩu" hoặc TAT1 mat khau". vậy thì làm cách nào để tách được mật khẩu ra để so sánh và tách được BAT1 hoặc TAT1 ra để thực thi công việc? E cảm ơn.Sống là để chiến đấu
Comment
-
Nguyên văn bởi quangtung112 Xem bài viếtanh cho e xin code đầy đủ của a được ko? chứ a viết như thế thì e ko biết lấy hàm API_check_acknowledge() ở chỗ nào? cảm ơn a.
Code:// kiem tra da nhan du lieu OK chua int API_check_acknowledge(void) { static unsigned int i, ii; for(i=0;(rx_ack0==0)&&(i<65535);i++) //Wait loop // 0.5s { for(ii=0;ii<30;ii++){;} //12s <--> ii=100; => 5s <--> ii=40 // test ko co gi khoang 2,2 s } // da nhan du lieu xong if(rx_ack0>0) // rx_ack0=1 //Everything worked out fine...rx turned off { rx_ack0=0; //Reset flag return 1; } else //A timeout could result from no acknowledge, wrong acknowledge or buffer overrun { UART0_rx_off(); UART0_rx_reset(); //Reset buffer and interrupt routine return 0; // chua nhan dc OK hoac timeout o phone //Timed out, or wrong acknowledge from phone } }
Code:interrupt [USART0_RXC] void usart0_rx_isr(void) { char status,data; status=UCSR0A; data=UDR0; if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) { rx_buffer0[rx_index0]=data; //Store new data rx_index0++; if(rx_index0>RX_BUFFER_MAX0) //Check for overflow { rx_index0=0; //Reset write index rx_overflow0=1; //Set flag high //UART0_rx_off(); // Disable RX interrupt // tranh truong hop ko co tin nhan, du lieu van den khi co cuoc goi UART0_rx_reset(); // reset } if(searchFor[rx_i0]==data ) //Test response match { rx_i0++; if(!searchFor[rx_i0]) // End of new_message string...received new message! { rx_i0=0; // reset if(searchStr==CMTI_) //+CMTI: { searchFor=searchStrings[CRLF_]; //Wait for searchStr=CRLF_; } else if (searchStr==CPIN_) // CHECK TK { searchFor=searchStrings[CRLF_]; //Wait for searchStr=CRLF_; } else if (searchStr==CUSD_) // CHECK TK { searchFor=searchStrings[CRLF_]; //Wait for searchStr=CRLF_; } else { rx_ack0=1; //Set new message flag UCSR0B&=~(1<<RXCIE); // Disable RX interrupt } } } else rx_i0=0; //Not valid search pattern...start again. } }
Sống là để chiến đấu
Comment
-
Nguyên văn bởi quangtung112 Xem bài viếtbác post thế này làm e khó nghiên cứu quá? đọc đến hàm searchFor[rx_i0] thì tìm mãi mà chẳng thấy hàm đâu?
Mình sẽ post đầy đủ code cho bạn. Hi vọng bạn sẽ hoàn thành project này.
Trong project của mình, mình dùng 2 file header UART.H và SIM900_ATCOMMAND.H. Ngoài ra mình còn dùng file FUNCTION.H để xử lý chuỗi như lọc, tách text.
1. File Header SIM900_ATCOMMAND.H
Code:#ifndef _ATCOMMAND_H_ #define _ATCOMMAND_H_ #include "UART.H" #include "FUNCTION.H" #include <delay.h> //! AT-Command set used const unsigned char flash CR[] = "\r"; const unsigned char flash AT[] = "AT\r"; //!< Say "OK" // test connection const unsigned char flash ATZ[] = "ATZ\r"; //!< Say "OK" const unsigned char flash ATE0[] = "ATE0\r"; //!< Echo off const unsigned char flash AT_CMGD[] = "AT+CMGD="; //!< Delete message at index const unsigned char flash AT_CMGR[] = "AT+CMGR="; //!< Read from index const unsigned char flash ATCLIP[] = "AT+CLIP=1\r"; //!< text default const unsigned char flash ATW[] = "AT&W\r"; //!< LUU CAU HINH const unsigned char flash AT_SMSTEXTFORMAT[] = "AT+CMGF=1\r"; // set text sms format const unsigned char flash AT_CNMI[] = "AT+CNMI=0,0,0,0,1\r"; //!< Identification of new sms const unsigned char flash AT_CPMS[] = "AT+CPMS=\"SM\",\"SM\",\"SM\"\r"; //!< Preferred storage const unsigned char flash AT_CMGS[] = "AT+CMGS="; //!< Send mmessage const unsigned char flash AT_CSCS[] = "AT+CSCS=\"GSM\"\r"; //!< Send mmessage const unsigned char flash UUDECODE[] = "?E??????????????ABVGDEJZIIKLMNOPRSTUFHCCSS`Y`EYAabvgdejziiklmnoprstufhccss`y`eya?e??????????????"; typedef struct { unsigned char phone[16]; unsigned char name[16]; //unsigned char count; } SIMBookf; SIMBookf SIMBook[21]; #define OK_ 0 //!< Used to look up in COM_setSearchString( unsigned char Response ) #define CMTI_ 1 //!< Used to look up in COM_setSearchString( unsigned char Response ) #define READY_ 2 //!< Used to look up in COM_setSearchString( unsigned char Response ) #define CRLF_ 3 //!< Used to look up in COM_setSearchString( unsigned char Response ) #define CUSD_ 4 //!< Used to look up in COM_setSearchString( unsigned char Response ) #define CPIN_ 5 unsigned char fromsmsnumber[30]; // so dien thoai nguoi gui unsigned char fromsmsdatetime[30]; // ngay gio unsigned char fromsmstext[161]; // noi dung tin nhan unsigned char fromsmsmoney[161]; // noi dung tien // reset danh ba trong SIMbook void API_resetSIMbook(); // ham test ket noi voi module SIM // return 0: disconnect // return 1: da ket noi voi module SIM int API_GSMtestconnect(); // init module SIM voi cac gia tri ban dau // return 1: OK // return <=0: xuat hien loi int API_GSMinit(); // reset cac thong tin lien quan den tin nhan nhan ve void API_resetfromSMS(); // ham xac nhan co du lieu truyen ve // return 0: chua nhan du du lieu hoac timeout // return 1: da nhan int API_check_acknowledge(void) ; // kiem tra da nhan du lieu OK chua // giai ma tin nhac, lay cac thong tin nhu sdt, ngay gio, noi dung tin int API_decodemessage(); int API_checkmoney(unsigned char tk); int SplitInfMoney(); int API_deletemsg(int index); int API_readmsg(int index); int API_sendmsgtextmm( unsigned char *msg, unsigned char *phonenum ); int API_sendmsgtextff( unsigned char flash *msg, unsigned char flash *phonenum ); int API_sendmsgtextfm( unsigned char flash *msg, unsigned char *phonenum ); int API_sendmsgtextmf( unsigned char *msg, unsigned char flash *phonenum ) ; int API_writebookf(unsigned int index, flash unsigned char *phone_num,flash unsigned char *name); int API_writebook(unsigned int index, unsigned char *phone_num, unsigned char *name); void API_resetSIMbook() { unsigned char i=0; for(i=0;i<21;i++) { SIMBook[i].phone[0]='\0'; SIMBook[i].name[0]='\0'; } } void API_resetfromSMS() { int dem=0; for(dem=0;dem<161;dem++) { fromsmsnumber[dem]=0; fromsmsdatetime[dem]=0; fromsmstext[dem]=0; } } int API_GSMtestconnect() { UART0_rx_reset(); UART0_setSearchString(OK_); //Set OK to be search string // set OK de tim kem UART0_putsf(AT); //Check connection UART0_rx_on(); //Receiver on if(API_check_acknowledge()<1) return 0; //NOT OK return 1; } //-------------------------------------------------------------- int API_GSMinit() { // Send ATZ UART0_rx_reset(); UART0_setSearchString(OK_); //Set OK to be search string // set OK de tim kem UART0_putsf(ATZ); //Send reset modem UART0_rx_on(); //Receiver on if(API_check_acknowledge()<1) return 0; //Echo off = OK delay_ms(5); // Send ATE0 UART0_rx_reset(); UART0_putsf(ATE0); //Send turn echo off UART0_rx_on(); //Receiver on if(API_check_acknowledge()<1) return -1; //Echo off = OK delay_ms(5); // Send ATCLIP UART0_rx_reset(); //Reset system UART0_putsf(ATCLIP); //Ding dang chuoi tra ve khi co cuoc goi la RING UART0_rx_on(); //Receiver on if(API_check_acknowledge() <1 ) return -2; //Preferred storage = OK delay_ms(5); // send ATCSCS UART0_rx_reset(); // UART0_putsf(AT_CSCS); // UART0_rx_on(); //Receiver on if(API_check_acknowledge()<1 ) return -3; //Preferred storage = OK delay_ms(5); // Send ATW UART0_rx_reset(); //Reset system UART0_putsf(ATW); //LUU CAU HINH CAI DAT AT CLIP & ATE0 UART0_rx_on(); //Receiver on if(API_check_acknowledge()<1 ) return -3; //Preferred storage = OK delay_ms(5); // Send THIET LAP SMS DANG TEXT UART0_rx_reset(); //Reset system UART0_putsf(AT_SMSTEXTFORMAT); //Send preferred storage UART0_rx_on(); //Receiver on if(API_check_acknowledge()<1 ) return -4; //Preferred storage = OK delay_ms(5); // THIET LAP CHE DO THONG BAO KHI CO TIN NHAN MOI // AT+CNMI="2,2,0,1,1" --> KHI CO TIN NHAN MOI TRUYEN NOI DUNG LEN LUON // AT+CNMI="3,3,0,1,1" --> KHI CO TIN NHAN MOI SE THONG BAO DANG LUU VAO VUNG NHO NAO // AT+CNMI="0,0,0,1,1" --> KHI CO TIN NHAN MOI KO TRUYEN VE THONG BAO UART0_rx_reset(); //Reset system UART0_putsf(AT_CNMI); //Send preferred storage UART0_rx_on(); //Receiver on if(API_check_acknowledge()<1 ) return -5; //Preferred storage = OK return 1; } //-------------------------------------------------------------- // kiem tra da nhan du lieu OK chua int API_check_acknowledge(void) { static unsigned int i, ii; //doi cho den khi rx_ack1=1 hoac i = 65535 //toc do 9600 thi 1 byte =1ms -->250 byte = 0,25s <0,5s //timeout for(i=0;(rx_ack0==0)&&(i<65535);i++) //Wait loop // 0.5s { for(ii=0;ii<100;ii++){;} //12s <--> ii=100; => 5s <--> ii=40 // test ko co gi khoang 2,2 s } // da nhan du lieu xong if(rx_ack0 >0) //Everything worked out fine...rx turned off { rx_ack0=0; //Reset flag // UART0_rx_off(); return 1; } else //A timeout could result from no acknowledge, wrong acknowledge or buffer overrun { UART0_rx_off(); UART0_rx_reset(); //Reset buffer and interrupt routine return 0; // chua nhan dc OK hoac timeout o phone //Timed out, or wrong acknowledge from phone } } //---------------------------------- int API_readmsg(int index) { int j=0; if((index<=0)||(index>=66)) return -2; // tran vung nho inbox trong SIM else { UART0_rx_reset(); UART0_setSearchString(OK_); //Set OK to be search string // set OK de tim kem UART0_putsf(AT_CMGR); //Read message UART0_putint(index); //@index UART0_putsf(CR); //CR UART0_rx_on(); //Receiver on, wait for acknowledge if(API_check_acknowledge()>0 ) //Read = OK { j=API_decodemessage(); // giai ma tin nhan if(j==1) return 1; // co noi dung tin nhan else return 0; // khong co noi dung tin nhan } else return (-1); // khong ket noi } } int API_decodemessage() { int i=0; unsigned char n=0; unsigned char *temp; unsigned char *temp1,*temp2; unsigned char count=0,count1=0; n=FUC_strlen(rx_buffer0); for(i=0;i<n;i++) { if((rx_buffer0[i]==0x0D)&&(rx_buffer0[i+1]==0x0A)) count++; // de so ky tu xuong dong } if(count==4) return 0; // ko co tin nhan else if(count==5) // co noi dung tin nhan { count1=0; //n=UART0_trim(); // length string for(i=0;i<n;i++) { if(rx_buffer0[i]==',') count1++; if(count1==1) break; } // lay so dien thoai temp=rx_buffer0+i+1; // "+84913137597",,"11/10/19,15:15:18+28".............. for(i=2;i<FUC_strlen(temp);i++) { if(*(temp+i)!=0x22) fromsmsnumber[i-2]= *(temp+i); // ki tu " else { fromsmsnumber[i-2]='\0'; break; } } // lay thoi gian temp1=temp+i+3; // "11/10/19,15:15:18+28".............. for(i=1;i<FUC_strlen(temp1);i++) { if(*(temp1+i)!=0x22) fromsmsdatetime[i-1]= *(temp1+i); // ki tu " else { fromsmsdatetime[i-1]='\0'; break; } } // lay noi dung tin nhan count1=0; for(i=0;i<n;i++) { if((rx_buffer0[i]==0x0D)&&(rx_buffer0[i+1]==0x0A)) count1++; if(count1==2) break; } temp2=rx_buffer0+i+2; for(i=0;i<FUC_strlen(temp2);i++) { if ((*(temp2+i)==0x0D)&&(*(temp2+i+1)==0x0A)) { fromsmstext[i]='\0'; break; } else fromsmstext[i]=*(temp2+i); } return 1; } else return -1; // error } //----------------------------------------------------------------- //----------------------------------------------------------------- int API_checkmoney(unsigned char tk) { UART0_rx_reset(); UART0_setSearchString(OK_); //Set OK to be search string // set OK de tim kem UART0_putsf("ATD"); //Call if(tk==1) UART0_putsf("*101#"); //phone number else if(tk==2) UART0_putsf("*102#"); //phone number else return 0; UART0_putchar(';'); UART0_putsf(CR); //CR UART0_rx_on(); //Receiver on, wait for acknowledge if(API_check_acknowledge()> 0) //Da nhan OK , doi nhan them du lieu gui ve { UART0_rx_reset( ); //Clear rx_buff UART0_setSearchString(CUSD_); //Set "OK" to be search string UART0_rx_on(); //Receiver on if(API_check_acknowledge()>0) { if(SplitInfMoney()>0) return 1; else return 0; } else return 0; } else return 0; } //----------------------------------------------------------------- int SplitInfMoney() { int i=0; unsigned char n=0; unsigned char *temp; if((rx_buffer0[2]=='+')&&(rx_buffer0[3]=='C')&&(rx_buffer0[4]=='U')&&(rx_buffer0[5]=='S')&&(rx_buffer0[6]=='D')) { n=FUC_strlen(rx_buffer0); // lay do dai chuoi rx_buffer0; for(i=0;i<=n;i++) { if(rx_buffer0[i]==',') break; } if(i==n) return 0; // cu phap ko dung else { temp=rx_buffer0+i+1; for(i=1;i<FUC_strlen(temp);i++) { if(*(temp+i)!=0x22) fromsmsmoney[i-1]=*(temp+i); else { fromsmsmoney[i-1]='\0'; break; } } return 1; } } else return 0; // noi dung khong dung } //------------------------------------------------------------------- int API_deletemsg(int index) { if((index<=0)||(index>=66)) return -2; // ra ngoai vung nho else { UART0_rx_reset(); UART0_setSearchString(OK_); //Set OK to be search string // set OK de tim kem UART0_putsf(AT_CMGD); //Read message UART0_putint(index); //@index UART0_putsf(CR); //CR UART0_rx_on(); //Receiver on, wait for acknowledge if(API_check_acknowledge() > 0 ) //Delete = OK { return 1; // xoa thanh cong } else return 0; // chua xoa thanh cong } } //------------------------------------------------------------------------ int API_sendmsgtextmm( unsigned char *msg, unsigned char *phonenum ) { UART0_rx_reset( ); //Clear rx_buff UART0_setSearchString(READY_); //Set "> " to be search string UART0_putsf(AT_CMGS); //Send message UART0_puts(phonenum); //Send message UART0_putsf(CR); //CR UART0_rx_on(); //Receiver on if(API_check_acknowledge() > 0) //Wait for acknowledge = "> " { UART0_rx_reset( ); //Clear rx_buff UART0_setSearchString( OK_ ); //Set "OK" to be search string UART0_puts(msg); UART0_putchar(26); // ki tu Ctrl+Z UART0_rx_on(); //Receiver on if( API_check_acknowledge() > 0 ) //Acknowledge = OK { return 1; } if( API_check_acknowledge() > 0 ) //Acknowledge = OK { return 1; } if( API_check_acknowledge() > 0 ) //Acknowledge = OK { return 1; } else //Acknowledge != OK { return -2; // loi ket noi } } else //Acknowledge != "> " { return -1; // loi ket noi } } //---------------------------------------------------- int API_sendmsgtextff(flash unsigned char *msg,flash unsigned char *phonenum ) { UART0_rx_reset(); //Clear rx_buff UART0_setSearchString(OK_); //Set "OK" to be search string UART0_putsf(AT_CSCS); UART0_rx_on(); //Receiver on if( API_check_acknowledge()>0) //Wait for acknowledge = "> " { UART0_rx_reset( ); //Clear rx_buff UART0_setSearchString(READY_); //Set "> " to be search string UART0_putsf(AT_CMGS); //Send message UART0_putsf(phonenum); //Send message UART0_putsf(CR); //CR UART0_rx_on(); //Receiver on if( API_check_acknowledge()>0) //Wait for acknowledge = "> " { UART0_rx_reset(); //Clear rx_buff UART0_setSearchString(OK_); //Set "OK" to be search string UART0_putsf(msg); UART0_putchar(26); // ki tu Ctrl+Z UART0_rx_on(); //Receiver on if( API_check_acknowledge()>0) //Acknowledge = OK { return 1; } if( API_check_acknowledge()>0) //Acknowledge = OK { return 1; } if( API_check_acknowledge() >0) //Acknowledge = OK { return 1; } else //Acknowledge != OK { return -2; } } else //Acknowledge != "> " { return -1; } } } //-------------------------------------------------------------------------------------------------- int API_sendmsgtextfm( unsigned char flash *msg, unsigned char *phonenum ) { UART0_rx_reset( ); //Clear rx_buff UART0_setSearchString(READY_); //Set "> " to be search string UART0_putsf(AT_CMGS); //Send message UART0_puts(phonenum); //Send message UART0_putsf(CR); //CR UART0_rx_on(); //Receiver on //Append payload if( API_check_acknowledge()>0) //Wait for acknowledge = "> " { UART0_rx_reset(); //Clear rx_buff UART0_setSearchString(OK_); //Set "OK" to be search string UART0_putsf(msg); UART0_putchar(26); // ki tu Ctrl+Z UART0_rx_on(); //Receiver on if( API_check_acknowledge()>0) //Acknowledge = OK { return 1; } if( API_check_acknowledge()>0) //Acknowledge = OK { return 1; } if( API_check_acknowledge() >0) //Acknowledge = OK { return 1; } else //Acknowledge != OK { return -2; } } else //Acknowledge != "> " { return -1; } } //--------------------------------------------------------------------------------------------- int API_sendmsgtextmf( unsigned char *msg, unsigned char flash *phonenum ) { UART0_rx_reset( ); //Clear rx_buff UART0_setSearchString(READY_); //Set "> " to be search string UART0_putsf(AT_CMGS); //Send message UART0_putsf(phonenum); //Send message UART0_putsf(CR); //CR UART0_rx_on(); //Receiver on //Append payload if( API_check_acknowledge()>0) //Wait for acknowledge = "> " { UART0_rx_reset(); //Clear rx_buff UART0_setSearchString(OK_); //Set "OK" to be search string UART0_puts(msg); UART0_putchar(26); // ki tu Ctrl+Z UART0_rx_on(); //Receiver on if( API_check_acknowledge()>0) //Acknowledge = OK { return 1; } if( API_check_acknowledge()>0) //Acknowledge = OK { return 1; } if( API_check_acknowledge() >0) //Acknowledge = OK { return 1; } else //Acknowledge != OK { return -2; } } else //Acknowledge != "> " { return -1; } } //------------------------------------------------------------------------------------------------ int API_writebookf(unsigned int index, flash unsigned char *phone_num,flash unsigned char *name) { UART0_rx_reset(); UART0_setSearchString(OK_); //Set OK to be search string // set OK de tim kem UART0_putsf("AT+CPBW="); //Read book entry UART0_putint(index); //@index UART0_putchar(','); UART0_putsf(phone_num); UART0_putsf( ",161," ); UART0_putsf(name); UART0_putsf(CR); UART0_rx_on(); //CR+LF if(API_check_acknowledge()>0) return 1; else return 0; } int API_writebook(unsigned int index, unsigned char *phone_num, unsigned char *name) { UART0_rx_reset(); UART0_setSearchString(OK_); //Set OK to be search string // set OK de tim kem UART0_putsf("AT+CPBW="); //Read book entry UART0_putint(index); //@index UART0_putchar(','); UART0_puts(phone_num); UART0_putsf( ",161," ); UART0_puts(name); UART0_putsf(CR); UART0_rx_on(); //CR+LF if(API_check_acknowledge()>0) return 1; else return 0; } int API_readbook(unsigned int index) { int i,len; unsigned char count=0,count1=0; unsigned char *temp; UART0_rx_reset(); //Reset system UART0_setSearchString(OK_); //Set OK to be search string UART0_putsf("AT+CPBR="); //Read book entry UART0_putint(index); //@index UART0_putsf(CR); //CR+LF UART0_rx_on( ); //Receiver on, wait for acknowledge if(API_check_acknowledge()>0) // Read=OK { len=FUC_strlen(rx_buffer0); for(i=0;i<len;i++) { if((rx_buffer0[i]==0x0D)&&(rx_buffer0[i+1]==0x0A)) count++; } if(count==2) // chua luu ten, no contact { SIMBook[index].phone[0]='\0'; SIMBook[index].name[0]='\0'; return 0; } else if(count==4) { if((rx_buffer0[2]=='+')&&(rx_buffer0[3]=='C')&&(rx_buffer0[4]=='P')&&(rx_buffer0[5]=='B')&&(rx_buffer0[6]=='R')) // OK { for(i=0;i<len;i++) { if(rx_buffer0[i]==',') break; } // lay so dien thoai temp=rx_buffer0+i+1; // "0913137597",161,"MRDUONGBO"........ for(i=1;i<FUC_strlen(temp);i++) { if(*(temp+i)!=0x22) SIMBook[index].phone[i-1]= *(temp+i); // ki tu " else { SIMBook[index].phone[i-1]='\0'; break; } } // lay name for(i=0;i<len;i++) { if(rx_buffer0[i]==',') count1++; if(count1==3) break; } temp=rx_buffer0+i+1; for(i=1;i<FUC_strlen(temp);i++) { if(*(temp+i)!=0x22) SIMBook[index].name[i-1]= *(temp+i); // ki tu " else { SIMBook[index].name[i-1]='\0'; break; } } return 1; } else return 0; // loi cau truc } } else return -1; // khong ket noi } //---------------------------------------------------------- #endif
Code:#ifndef _UART_H_ #define _UART_H_ #include <mega128.h> // define for UCSRA #define MPCM 0 // bit trong truyen nhan da chip #define U2X 1 // che do gap doi 0: bt 1: gap doi #define UPE 2 // bit bao parity bi loi #define OVR 3 // bit bao tran du lieu #define FE 4 // bit bao khung truyen bi loi #define UDRE 5 // bit bao thanh ghi UDR trong #define TXC 6 // bit trang thai qua trinh truyen ket thuc #define RXC 7 // bit trang thai qua trinh nhan ket thuc // define for UCSRB #define RXCIE 7 // Cho phep ngat khi nhan ket thuc #define TXCIE 6 // cho phep ngat khi truyen ket thuc #define UDRIE 5 // cho phep ngat khi UDR trong #define RXEN 4 // kich hoat bo nhan #define TXEN 3 // kich hoat bo truyen #define UCSZ2 2 // bit dung de quy dinh do dai du lieu #define RXB8 1 // bit thu 9 trong nhan 9bit #define TXB8 0 // bit thu 9 trong truyen // define for UCSRC #define URSEL 7 // 1: dung thanh ghi UCSRC, 0: dung thanh ghi UBRRH ( vi trung dia chi) #define UMSEL 6 // 0: ko dong bo, 1: dong bo #define UPM1 5 // #define UPM0 4 // dung cho chon parity #define USBS 3 // 0: 1 bit stop, 1: 2 bit stop #define UCSZ1 2 // #define UCSZ0 1 // chon toc do BAUD #define UCPOL 0 // chi dung cho truyen dong bo 0: suon len, 1: suon xuong, khong dong bo:0 #define FRAMING_ERROR (1<<FE) // bit bao khung truyen bi loi #define PARITY_ERROR (1<<UPE) // bit bao parity bi loi #define DATA_OVERRUN (1<<OVR) // bao tran du lieu #define DATA_REGISTER_EMPTY (1<<UDRE) // bao thanh ghi UDR trong #define RX_COMPLETE (1<<RXC) // qua trinh nhan ket thuc //! Possible strings pointed to by searchStr const unsigned char flash OK[] = "OK\r\n"; //!< "OK" const unsigned char flash CMTI[] = "+CMTI: "; //!< New Message arrived const unsigned char flash READY[] = "> "; //!< Phone ready to receive text message const unsigned char flash CR_LF[] = "\r\n"; //!< Carrige Return Line Feed const unsigned char flash CUSD[] = "+CUSD: "; //!< Check tk const unsigned char flash CPIN[] = "+CPIN: "; //!< Check sim ready const unsigned char flash *searchFor; //!< Flash pointer const unsigned char flash *searchStrings[6] = {OK, CMTI, READY, CR_LF, CUSD,CPIN}; //!< Initialize pointer #define RX_WAIT0 65000 //!< Timeout value #define RX_WAIT1 65000 //!< Timeout value #define RX_BUFFER_SIZE0 250 #define TX_BUFFER_SIZE0 250 #define RX_BUFFER_SIZE1 60 #define TX_BUFFER_SIZE1 60 #define RX_BUFFER_MAX0 RX_BUFFER_SIZE0-2 #define RX_BUFFER_MAX1 RX_BUFFER_SIZE1-2 //---------------------------------------------------------------------------------------------// USART0 Receiver buffer unsigned char rx_buffer0[RX_BUFFER_SIZE0]; //unsigned char rx_buffer0_copy[RX_BUFFER_SIZE0]; //! Overflow and acknowledge flag bit rx_overflow0=0, rx_ack0=0; //bit write_flag=0; volatile bit rx_flag0=1,check0=1; // check de nhan du lieu tu P1 static int rx_index0=0; volatile unsigned int rx_i0=0; // khai bao bien dem dung trong ngat static unsigned char searchStr; volatile unsigned char Rec_count0=0,pre_Rec_count0=0; #if RX_BUFFER_SIZE0<256 unsigned char rx_wr_index0,rx_rd_index0,rx_counter0; #else unsigned int rx_wr_index0,rx_rd_index0,rx_counter0; #endif // USART1 Transmitter buffer unsigned char tx_buffer0[TX_BUFFER_SIZE0]; #if TX_BUFFER_SIZE0<256 unsigned char tx_wr_index0,tx_rd_index0,tx_counter0; #else unsigned int tx_wr_index0,tx_rd_index0,tx_counter0; #endif //---------------------------------------------------------------------------------------------// USART1 Receiver buffer unsigned char rx_buffer1[RX_BUFFER_SIZE1]; //! Overflow and acknowledge flag bit rx_overflow1=0,rx_ack1=0; bit rx_flag1=0; //bit write_flag=0; //static unsigned char searchStr; static int rx_index1=0; volatile unsigned int rx_i1=0; // khai bao bien dem dung trong ngat bit check1=1; unsigned char Rec_count1=0; #if RX_BUFFER_SIZE1<256 unsigned char rx_wr_index1,rx_rd_index1,rx_counter1; #else unsigned int rx_wr_index1,rx_rd_index1,rx_counter1; #endif // USART1 Transmitter buffer unsigned char tx_buffer1[TX_BUFFER_SIZE1]; #if TX_BUFFER_SIZE1<256 unsigned char tx_wr_index1,tx_rd_index1,tx_counter1; #else unsigned int tx_wr_index1,tx_rd_index1,tx_counter1; #endif //------------------------------------------------------------------------------------- // init, setup void UART0_rx_reset(void); void UART0_init(); void UART0_stop(); void UART0_tx_rx_on(void); void UART0_tx_rx_off(void); void UART0_rx_on(void); void UART0_rx_off( void ); void UART1_init(); void UART1_stop(); void UART1_tx_rx_on(void); void UART1_tx_rx_off(void); void UART1_rx_on(void); void UART1_rx_off( void ); //dung ngat char getchar(void); void putchar(char c); char getchar1(void); void putchar1(char c); // khong dung ngat void UART0_setSearchString(unsigned char Response); int UART0_putchar(unsigned char data); void UART0_putint(int data); void UART0_puts(unsigned char *fstr); void UART0_putsf(const unsigned char flash *fstr); void UART0_putstr(unsigned char *fstr, unsigned char len); int UART0_trim(void); unsigned char* UART0_gets(void); void UARTO_send(unsigned char *Data0, unsigned char DataLen0); // dung ngat void UART1_send(unsigned char *Data1, unsigned char DataLen1); #ifndef _DEBUG_TERMINAL_IO_ // Get a character from the USART0 Receiver buffer #define _ALTERNATE_GETCHAR_ #pragma used+ char getchar(void) { char data; while (rx_counter0==0); data=rx_buffer0[rx_rd_index0]; if (++rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0; #asm("cli") --rx_counter0; #asm("sei") return data; } #pragma used- #endif // USART0 Transmitter interrupt service routine interrupt [USART0_TXC] void usart0_tx_isr(void) { if (tx_counter0) { --tx_counter0; UDR0=tx_buffer0[tx_rd_index0]; if (++tx_rd_index0 == TX_BUFFER_SIZE0) tx_rd_index0=0; }; } #ifndef _DEBUG_TERMINAL_IO_ // Write a character to the USART0 Transmitter buffer #define _ALTERNATE_PUTCHAR_ #pragma used+ void putchar(char c) { while (tx_counter0 == TX_BUFFER_SIZE0); #asm("cli") if (tx_counter0 || ((UCSR0A & DATA_REGISTER_EMPTY)==0)) { tx_buffer0[tx_wr_index0]=c; if (++tx_wr_index0 == TX_BUFFER_SIZE0) tx_wr_index0=0; ++tx_counter0; } else UDR0=c; #asm("sei") } #pragma used- #endif //-------------------------------------------------------------------------------------------- // Get a character from the USART1 Receiver buffer #pragma used+ char getchar1(void) { char data; while (rx_counter1==0); data=rx_buffer1[rx_rd_index1]; if (++rx_rd_index1 == RX_BUFFER_SIZE1) rx_rd_index1=0; #asm("cli") --rx_counter1; #asm("sei") return data; } #pragma used- // USART1 Transmitter buffer // USART1 Transmitter interrupt service routine interrupt [USART1_TXC] void usart1_tx_isr(void) { if (tx_counter1) { --tx_counter1; UDR1=tx_buffer1[tx_rd_index1]; if (++tx_rd_index1 == TX_BUFFER_SIZE1) tx_rd_index1=0; }; } // Write a character to the USART1 Transmitter buffer #pragma used+ void putchar1(char c) { while (tx_counter1 == TX_BUFFER_SIZE1); #asm("cli") if (tx_counter1 || ((UCSR1A & DATA_REGISTER_EMPTY)==0)) { tx_buffer1[tx_wr_index1]=c; if (++tx_wr_index1 == TX_BUFFER_SIZE1) tx_wr_index1=0; ++tx_counter1; } else UDR1=c; #asm("sei") } #pragma used- //-------------------------------------------------------------------------- void UART1_init() { // USART1 initialization // Communication Parameters: 8 Data, 1 Stop, Even Parity // USART1 Receiver: On // USART1 Transmitter: On // USART1 Mode: Asynchronous // USART1 Baud rate: 19200 UCSR1A=0x00; UCSR1B=0xD8; UCSR1C=0x26; UBRR1H=0x00; UBRR1L=0x23; } void UART1_stop() { UCSR1A=0x00; UCSR1B=0x00; UCSR1C=0x00; UBRR1H=0x00; UBRR1L=0x00; } void UART1_rx_off() { UCSR1B=UCSR1B&~(1<<RXCIE); } void UART1_off() { UCSR1B=UCSR1B&~(1<<RXCIE)&~(1<<TXCIE); } void UART1_rx_on() { UCSR1B=UCSR1B|(1<<RXCIE); } void UART1_on() { UCSR1B=UCSR1B|(1<<RXCIE)|(1<<TXCIE); } //----------------------------------------------- // phuc vu cho debug hoac giao tiep GSM void UART0_init() { // USART0 initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART0 Receiver: On // USART0 Transmitter: On // USART0 Mode: Asynchronous // USART0 Baud Rate: 9600 UCSR0A=0x00; UCSR0B=0xD8; UCSR0C=0x06; UBRR0H=0x00; UBRR0L=0x47; } void UART0_stop() { UCSR0A=0x00; UCSR0B=0x00; UCSR0C=0x00; UBRR0H=0x00; UBRR0L=0x00; } void UART0_rx_off(void) { UCSR0B=UCSR0B&~(1<<RXCIE); } //--------------------------------------- void UART0_tx_rx_on(void) { UCSR0B=UCSR0B|(1<<RXCIE)|(1<<TXCIE); } void UART0_tx_rx_off() { UCSR0B=UCSR0B&~(1<<RXCIE)&~(1<<TXCIE); } void UART0_rx_on(void) { UCSR0B=UCSR0B|(1<<RXCIE); } //------------------------------------------------------------ // set cac string de tim kiem trong ham void UART0_setSearchString(unsigned char Response) { UART0_rx_off(); // Disable RX interrupt searchFor = searchStrings[Response]; //Set desired search string searchStr = Response; //Used in rx_isr rx_i0 = 0; } //--------------------------------------------------------------------------- void UART0_rx_reset() { int i=0; UART0_rx_off(); // Disable RX interrupt for (i=0;i<RX_BUFFER_SIZE0;i++) { rx_buffer0[i] = '\0'; } rx_i0 = 0; //Init variables rx_index0=0; rx_overflow0 = 0; //Zero overflow flag rx_ack0 = 0; } //------------------------------------------------------------- int UART0_putchar(unsigned char data) { unsigned int i; for(i=0;!(UCSR0A & DATA_REGISTER_EMPTY);i++) // Wait for empty transmit buffer { if(i>RX_WAIT0) // > timeout thoi gian du truyen 1 byte { return -1; //Give feedback to function caller } } UDR0 = data; // Start transmittion return (int)data; //Cast and return int value } //----------------------------------------------- void UART0_putsf(const unsigned char flash *fstr) { for(;*fstr!='\0';) { UART0_putchar(*fstr++); } } // truyen ca chuoi cho den khi gap ki tu ket thuc chuoi void UART0_puts(unsigned char *fstr) { for( ;*fstr != '\0'; ) { UART0_putchar(*fstr++); } } void UART0_putstr(unsigned char *fstr,unsigned char len) { unsigned char i=0; for(i=0;i<len;i++) { UART0_putchar(*fstr++); } } // gui 1 so integer thanh dang text void UART0_putint(int data) { int ii; unsigned char integer_buf[5]; if (data < 0) //Integer is negative { data = -data; //Convert to positive Integer UART0_putchar('-'); //Print - sign } for (ii=0; ii < 5; ) //Convert Integer to char array { integer_buf[ii++] = '0'+ data % 10; //Find carry using modulo operation data = data / 10; //Move towards MSB } do { ii--; }while((integer_buf[ii] == '0') && (ii != 0)); // xoa nhung so 0 o dau //Remove leading 0's do { UART0_putchar(integer_buf[ii--]); }while (ii>=0); //Print int->char array convertion } //--------------------------------------------- // cat duoi chuoi "OK\r\n" nhan ve int UART0_trim(void) { int i; unsigned char temp; for(i=rx_index0-1;i>=0;i--) // vi sau khi nhan xong da tang rx_index0 them 1 { temp = rx_buffer0[i]; //rx_buff[i] into temp //if((temp!='\r') &&(temp!='\n')&&(temp!='O')&&(temp!='K')&&(temp!=' ')) //If not equal to ' ','O', 'K', '\r' or '\n', break if((temp!='\r') &&(temp!='\n')&&(temp!='O')&&(temp!='K')) //If not equal to 'O', 'K', '\r' or '\n', break { break; //Do break } } rx_buffer0[i+1] = '\0'; //Terminate trimmed string return (i+1); //Return new length } //------------------------- unsigned char* UART0_gets(void) { return rx_buffer0; } //----------------------------------------------------------------------------- // dung ngat de truyen du lieu void UARTO_send(unsigned char *Data0, unsigned char DataLen0) { unsigned char i; unsigned char *ptr; ptr=Data0; for(i=0;i<DataLen0;i++) { putchar(ptr[i]); // gui lien tiep } } void UART1_send(unsigned char *Data1, unsigned char DataLen1) { unsigned char i; unsigned char *ptr; ptr=Data1; for(i=0;i<DataLen1;i++) { putchar1(ptr[i]); } } #endif
Code:// USART0 Receiver interrupt service routine interrupt [USART0_RXC] void usart0_rx_isr(void) { char status,data; status=UCSR0A; data=UDR0; if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) { rx_buffer0[rx_index0]=data; //Store new data rx_index0++; if(rx_index0>RX_BUFFER_MAX0) //Check for overflow { rx_index0=0; //Reset write index rx_overflow0=1; //Set flag high //UART0_rx_off(); // Disable RX interrupt // tranh truong hop ko co tin nhan, du lieu van den khi co cuoc goi UART0_rx_reset(); // reset } if(searchFor[rx_i0]==data ) //Test response match { rx_i0++; if(!searchFor[rx_i0]) // End of new_message string...received new message! { rx_i0=0; // reset if(searchStr==CMTI_) //+CMTI: { searchFor=searchStrings[CRLF_]; //Wait for searchStr=CRLF_; } else if (searchStr==CPIN_) // CHECK TK { searchFor=searchStrings[CRLF_]; //Wait for searchStr=CRLF_; } else if (searchStr==CUSD_) // CHECK TK { searchFor=searchStrings[CRLF_]; //Wait for searchStr=CRLF_; } else { rx_ack0=1; //Set new message flag UCSR0B&=~(1<<RXCIE); // Disable RX interrupt } } } else rx_i0=0; //Not valid search pattern...start again. } }
Chúc bạn thành công.Sống là để chiến đấu
Comment
-
Nguyên văn bởi quangtung112 Xem bài viếtchào các a, bây giờ e muốn tiếp tục chuyển sang thoại nhưng e vẫn chưa biết làm thế nào, mong các a giúp đỡ. Các a cho e hỏi, em phải dùng IC nào để lưu lại giọng nói để khi gọi đến module thì module sẽ tự động phát giọng nói đó. Cảm ơn các a.
Comment
-
Nguyên văn bởi quangtn82 Xem bài viếtBạn thử dùng con ISD để thu giọng nói xem, rồi phát lại vào đường mic in của module sau khi đã kết nối cuộc gọi, hoặc là ghi âm PCM vào thẻ nhớ rồi phát lại qua VDKWS:
Blog:
Comment
-
Nguyên văn bởi quangtung112 Xem bài viếte muốn dùng thẻ nhớ+VĐK, a có tài liệu gì liên quan cho e tham khảo với. Cảm ơn a.
Comment
-
Nguyên văn bởi quangtung112 Xem bài viếtchào các a, bây giờ e muốn tiếp tục chuyển sang thoại nhưng e vẫn chưa biết làm thế nào, mong các a giúp đỡ. Các a cho e hỏi, em phải dùng IC nào để lưu lại giọng nói để khi gọi đến module thì module sẽ tự động phát giọng nói đó. Cảm ơn các a.
2. dùng VDK + thẻ nhớ, ko đơn giản mà mất nhiều thời gian. Đổi lại được kiến thức.
gợi ý bạn tìm hiểu về con VS1001, có rất nhiều tài liệu và nhiều người đã làm rồi.(^_^) hoangnv.3i@gmail.com
Comment
-
Nguyên văn bởi hoang_3i Xem bài viết1. cách này nhanh nhất mà đỡ mất công nghiên cứu nhiều, bạn dùng 1 cái mp3 ghi âm giọng lại, khi nào cần phát thì play thôi.
2. dùng VDK + thẻ nhớ, ko đơn giản mà mất nhiều thời gian. Đổi lại được kiến thức.
gợi ý bạn tìm hiểu về con VS1001, có rất nhiều tài liệu và nhiều người đã làm rồi.WS:
Blog:
Comment
-
Nguyên văn bởi quangtung112 Xem bài viếtVới cách 1 của a thì play tự động như nào vậy a? hay là khi nào cần thì mới ấn nút play thì mới phát được? Cảm ơn a.
Comment
Bài viết mới nhất
Collapse
-
bởi tungdqEm cần tìm sơ đồ mạch một số Main máy tính đời cao như Asrock B560M-HDV, các cao nhân chỉ giúp với. Thank!
-
Channel: Các mạch điện ứng dụng
Hôm qua, 08:27 -
-
Trả lời cho Kiểm tra biến ápbởi lamvu0677nhân tiện cho mình hỏi thêm về cái phần test hipot (cao áp),là để kiểm tra độ bền cách điện giưa các cuộn dây,mà thấy thông số test thường ở mức 4kvac,vậy nếu mấy con fail đó xài bình thường vẫn dduocj phải không ạ,vì điện mình làm gì lên tới mức đó
-
Channel: Điện tử dành cho người mới bắt đầu
10-11-2024, 08:52 -
-
Trả lời cho Kiểm tra biến ápbởi lamvu0677máy đo số vòng thì cty có ,mà nó to quá,tưởng có máy nào gọn gọn bỏ túi được thì tiện hơn,vì đi lại nhiều...
-
Channel: Điện tử dành cho người mới bắt đầu
10-11-2024, 08:47 -
-
bởi tmcodonMình thấy diễn đàn có chuyên mục quảng cáo rồi mà. Bạn đóng góp để mở luồng riêng
-
Channel: Hướng dẫn sử dụng diễn đàn
09-11-2024, 13:36 -
-
bởi Nicole08Xin chào mọi người, tôi đã sử dụng Flashforge Inventor 2 được gần 5 năm và rất hài lòng với nó, nhưng tuần trước đã xảy ra sự cố. Có vẻ như động cơ bước đưa sợi in vào đầu nóng đã bị hỏng. Mọi thứ khác có vẻ ổn trên máy...
-
Channel: Điện tử dành cho người mới bắt đầu
09-11-2024, 12:55 -
Comment