Nguyên văn bởi hoang_3i
Xem bài viết
Hỏi về giao tiếp AVR và module SIMCOM
Collapse
X
-
trước tôi làm tính sử dụng luôn số điện thoại làm mật khẩu. nhưng sợ nhiều khi điện thoại bị hư mà mượn người khá thì sử dụng không được, nếu bỏ trường hợp này ra thì có thể sử dụng nó làm mật khẩu. mình sẽ đăng ký sdt với mạch và khi gửi tín nhắn đến nó sẽ kt xem nó có trùng với các sdt đã được lưu hay không. nếu trùng thì ok không thì thoát.
-
mỗi một địa chỉ, chỉ lưu được 8bit nên một chuỗi mật khẩu 4 số thì bạn phải lưu vào 4 địa chỉ. tôi không sử dụng AVR nên bạn tham khảo cái code cho PICNguyên văn bởi quangtung112 Xem bài viếtCảm ơn bác, nhưng e vẫn chưa rõ 2 biến uiAddess và ucData dùng như thế nào?
Ví dụ em có biến mật khẩu là a[]="1234", bây giờ e lưu vào rom thì sử dụng hàm EEPROM_write với uiAddess thì e chưa rõ, còn ucData chính là biến a phải không bác?
Code:a[]="1234"; ii=0; (địa chỉ bạn muốn lưu) for(i=0;i<=3;i++) { write_eeprom(ii,a[i]; ii++ }
Comment
-
cảm ơn các bác, nhưng e có thắc mắc chút là khi khởi động AVR thì sẽ load mật khẩu từ EEPROM, nhưng lần đầu tiên chưa ghi mật khẩu vào EEPROM thì bộ nhớ EEPROM rỗng, ta load nó lên thì liệu có làm thay đổi mật khẩu của ta ko?WS:
Blog:
Comment
-
Bác quy định 1 vị trí trên rom lưu giá trị xác nhận đã có mật khẩu. Ví dụ 'E'. Bác đọc vị trí này nếu khác 'E' thì tiến hành khởi tạo mật khẩu mặc định. Nếu là 'E' thì load mật khẩu ra thôi. Em vẫn làm vậy, nói chung là không vấn đề gì.
Giải pháp điện tử của bạn
Comment
-
bác lập trình cho nó. nếu lần đầu khởi động mạch thì sẽ khởi tạo mật khẩu là 12345 chẳng hạn. nếu từ lần thứ 2 trở đi thì sẽ đọc mật khẩu hiện tải.Nguyên văn bởi quangtung112 Xem bài viếtcảm ơn các bác, nhưng e có thắc mắc chút là khi khởi động AVR thì sẽ load mật khẩu từ EEPROM, nhưng lần đầu tiên chưa ghi mật khẩu vào EEPROM thì bộ nhớ EEPROM rỗng, ta load nó lên thì liệu có làm thay đổi mật khẩu của ta ko?
VD: cái này em viết cho con PIC
if(read_eeprom(CONFIG)==0)
{
// nhay qua thuc hien lenh tiep theo
}
else
{
strcpy(mk_temp,"123456");
write_mat_khau();
write_eeprom(CONFIG,0);
}
Comment
-
Để hạn chế việc ghi đọc vào Rom e thấy ngta chỉ lưu vào ROM khi bị mất điện, do đó cần có mạch phát hiện việc mất điện, các bác có sơ đồ chạy ổn định thì cho e tham khảo với?WS:
Blog:
Comment
-
làm cái gì mà phải lo vấn đề này.Nguyên văn bởi quangtung112 Xem bài viếtĐể hạn chế việc ghi đọc vào Rom e thấy ngta chỉ lưu vào ROM khi bị mất điện, do đó cần có mạch phát hiện việc mất điện, các bác có sơ đồ chạy ổn định thì cho e tham khảo với?
Comment
-
Việc thay đổi mật khẩu lâu lâu mới xảy ra nên không cần hạn chế làm gì, cứ ghi vào EEPROM khi thay đổi mật khẩu, còn đọc ra thì vô tưNguyên văn bởi quangtung112 Xem bài viếtĐể hạn chế việc ghi đọc vào Rom e thấy ngta chỉ lưu vào ROM khi bị mất điện, do đó cần có mạch phát hiện việc mất điện, các bác có sơ đồ chạy ổn định thì cho e tham khảo với?
Comment
-
ngoài MK e còn muốn lưu giá trị của các cổng(cổng điều khiển thiết bị), để nếu có mất điện thì khi có điện các thiết bị sẽ hoạt động như lúc trước. Với lại e hỏi để có thể học hỏi thêm, sau này có thể vận dụng.hi.WS:
Blog:
Comment
-
Cái này chỉ cần quy định 1 byte có giá trị khác 0xFF chẳng hạn, để chỉ thị đã có mật khẩu trong EEPROM, vấn đề rất đơn giản màNguyên văn bởi hitechvn Xem bài viếtĐối với EEPROM AVR khi chưa được ghi vào lần nào thì giá trị của nó là 0xFF. bạn đọc giá trị này lúc khởi động avr biết là đã ghi mật khẩu hay chưa.
Comment
-
Chào mọi người. Mình cũng đang viết code cho con sim900. Mình dùng một hàm mới để tách chuỗi "+CMTI" ra để biết khi nào có sms thì xử lý. Viết đơn giản như sau:
Khi có SMS về thì màn hình LCD sẽ hiện lên dòng chữ "New message". Nhưng nếu mà mình viết thêm tập lệnh AT để xóa tin nhắn đã lưu trước khi thực hiện lệnh while(true) thì khi gửi sms đến, LCD ko báo gì cả. Mình dùng hàm con void delete_sms() rồi gọi chương trình giống như code trên hay viết trực tiếp thì màn hình đều ko báo gì khi có sms mới.#include <16f877a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
#include <lcd_lib_4bit.c>
#include <string.h>
#define phone_number "0922609003"
char sms[70],test_cmti[5];
int i,test;
#INT_RDA
//Ngat, nhan va xu ly thong tin
void read()
{
sms[i]=getc();
i++;
if(i>69) i=0;
}
void CMTI()
{
int j;
for(j=0;j<=4;j++)
{
test_cmti[j]=sms[j+2];
}
}
int comparing_cmti()
{
CMTI();
if(test_cmti[0]=='+' && test_cmti[1]=='C' && test_cmti[2]=='M' && test_cmti[3]=='T' && test_cmti[4]=='I')
return 1;
else
return 0;
}
void delete_sms()
{
printf("AT+CMGD=1");//delete sms in local 1
putc(13);
delay_ms(1000);
}
void main()
{
delay_ms(500);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
i = 0;
test=0;
delay_ms(100);
printf(lcd_putchar,"San sang hoat dong");
delay_ms(2000);
lcd_init();
//delete_sms();
while (true)
{
CMTI();
comparing_cmti();
test=comparing_cmti();
if(test == 1)
{
printf(lcd_putchar,"New message");
}
}
}
Ngồi cả buổi tối mà ko nghĩ ra là mình sai gì. Mọi người giúp mình với, tại sao viết tập lệnh AT trước khi so sánh chuỗi tìm +CMTI thì lại ko đúng?
Comment
-
Chào bạnNguyên văn bởi vandaivkn Xem bài viếtChào mọi người. Mình cũng đang viết code cho con sim900. Mình dùng một hàm mới để tách chuỗi "+CMTI" ra để biết khi nào có sms thì xử lý. Viết đơn giản như sau:
Khi có SMS về thì màn hình LCD sẽ hiện lên dòng chữ "New message". Nhưng nếu mà mình viết thêm tập lệnh AT để xóa tin nhắn đã lưu trước khi thực hiện lệnh while(true) thì khi gửi sms đến, LCD ko báo gì cả. Mình dùng hàm con void delete_sms() rồi gọi chương trình giống như code trên hay viết trực tiếp thì màn hình đều ko báo gì khi có sms mới.
Ngồi cả buổi tối mà ko nghĩ ra là mình sai gì. Mọi người giúp mình với, tại sao viết tập lệnh AT trước khi so sánh chuỗi tìm +CMTI thì lại ko đúng?
Code của bạn có vài vấn đề sau:
1. Hàm delete_sms() của bạn phải đặt sau khi đã đọc tin nhắn. Và thông thường tin nhắn mới ở vị trí nào thì delete ở vị trí đó. Hàm này của bạn chỉ xóa tin nhắn ở vị trí inbox 1
2. Bạn kiểm tra chuỗi +CMTI ở trong hàm main() thế này là chưa chuẩn. Mình ko bit trong ngắt nhận của bạn viết thế nào. Theo mình thì bạn nên kiểm tra chuỗi +CMTI trong ngắt nhận dữ liệu. Sau khi trong ngắt nhận đầy đủ chuỗi +CMTI thì cho biến test_flag=1;
3. Bạn nên reset các biến sms,test_cmti bằng 0 sau khi lcd hiển thị new message. Moi 1 hàm giao tiếp với SIM900 trc khi gưi lệnh bạn reset các biến về 0
Code mình chỉnh lại, bạn viết lại nhé
Chúc thành công!Code:while (true) { // CMTI(); // comparing_cmti(); // 2 dòng này bị thừa // test=comparing_cmti(); // đoạn này bạn nên kiểm tra trong ngắt nhận dữ liệu if(test_flag == 1) { test_flag =0; printf(lcd_putchar,"New message"); reset_sms(); // reset cac bien sms=0; reset_ctmi(); // reset cac bien test_ctmi=0; delete_sms(); // theo minh thi nen delete vi tri tin nhan reset_sms(); // reset cac bien sms=0; reset_ctmi(); // reset cac bien test_ctmi=0; } }Sống là để chiến đấu
Comment
-
Vâng, em cảm ơn anh. Em mới học lập trình CCS nên chưa thành thạo cái này lắm. Anh cho em hỏi chút nữa ạ. Nếu mà viết hàm kiểm tra +CMTI trong ngắt nhận, nếu đủ chuỗi trên thì cho test_flag=1, Vậy em dùng luôn hàm:Nguyên văn bởi hitechvn Xem bài viết- Bạn kiểm tra chuỗi +CMTI ở trong hàm main() thế này là chưa chuẩn. Mình ko bit trong ngắt nhận của bạn viết thế nào. Theo mình thì bạn nên kiểm tra chuỗi +CMTI trong ngắt nhận dữ liệu. Sau khi trong ngắt nhận đầy đủ chuỗi +CMTI thì cho biến test_flag=1;
- Bạn nên reset các biến sms,test_cmti bằng 0 sau khi lcd hiển thị new message. Moi 1 hàm giao tiếp với SIM900 trc khi gưi lệnh bạn reset các biến về 0
thì có được không ạ? Bởi vì chắc chắn là + luôn nằm ở sms[2] khi sim900 trả về. Em tách hẳn hàm CMTI() và test_cmti() như code ban đầu với ý là sau này em sẽ tách nội dung sms ra. Ví dụ em gửi tin là Bat1 thì em sẽ tách riêng cái Bat1 ở chuỗi gửi về của sim900:Code:void read() { sms[i]=getc(); i++; if(i>69) i=0; if(sms[2]=='+' && sms[3]=='C' && sms[4]=='M' && sms[5]=='T' && sms[6]=='I') test_flag=1; }
Em đã reset biến sms sau khi hiển thị rồi anh ạ. Hàm reset_cmti() giờ chắc ko cần dùng phải không ạ? Vì +CMTI nằm trong phần sms luôn rồi mà anh. Anh cho em hỏi là tại sao mình reset các biến, sau đó xóa sms rồi lại reset lại thế ạ? Chỉ cần 1 lần reset sau khi đã xóa sms thì có được ko ạ?Code:<CR><LF>+CMGR: "REC UNREAD","+84922609003","","12/09/18,15:40:38+28"<CR><LF>Bat1
Code sau khi em chỉnh lại:
Nó đã chạy rồi, song nếu em gửi sms đến thì nó hiện lên màn hình LCD 1 lần duy nhất. Sau đó nếu có gửi sms đến nữa thì nó lại không báo gì nữa. Tại sao nếu gửi AT cho sim vào hàm main() thì hàm while(1) lại chạy sai ko biết nữa.Code:#include <16f877a.h> #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock=20000000) #use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7) #include <lcd_lib_4bit.c> #include <string.h> #define phone_number "0922609003" char sms[70]; int i,test_flag; #INT_RDA //Ngat, nhan va xu ly thong tin void read() { sms[i]=getc(); i++; if(i>69) i=0; if(sms[2]=='+' && sms[3]=='C' && sms[4]=='M' && sms[5]=='T' && sms[6]=='I') test_flag=1; } void reset_sms() { for(i=0;i<70;i++) { sms[i]=0; } } void delete_sms() { printf("AT+CMGD=1");//delete sms in local 1 putc(13); delay_ms(1000); } void reset_all() { i=0; reset_sms(); test_flag =0; } void main() { delay_ms(500); enable_interrupts(INT_RDA); enable_interrupts(GLOBAL); i = 0; test_flag=0; delay_ms(100); // printf("AT");putc(13);delay_ms(1000);// Tai sao co dong nay ma LCD lai khong bao khi co SMS moi? lcd_init(); printf(lcd_putchar,"San sang"); delay_ms(2000);lcd_putcmd(0x01); while (true) { if(test_flag == 1) { reset_all();//reset cac thong so ve 0 printf(lcd_putchar,"New message");delay_ms(1000);lcd_putcmd(0x01);//in ra man hinh 1s sau do xoa man hinh delete_sms();//xoa sms vua nhan } } }
Em mới lập trình nên các anh đừng cười. Anh xem giúp em với nhé. Em cảm ơn mọi người nhiều.Last edited by vandaivkn; 23-09-2012, 19:10.
Comment
-
Các bạn cho mình hỏi đoạn này
void read()
{
sms[i]=getc();
i++;
if(i>69) i=0;
if(sms[2]=='+' && sms[3]=='C' && sms[4]=='M' && sms[5]=='T' && sms[6]=='I')
test_flag=1;
}
thế này thì i làm sao tăng được mà kiểm tra chứ?mình nghĩ phai như thế này mới đúng
void read()
{
for (i=0;i<70;i++)
{ sms[i]=getc();}
if(sms[2]=='+' && sms[3]=='C' && sms[4]=='M' && sms[5]=='T' && sms[6]=='I')
test_flag=1;
}
nhưng khi mình thử thì không nhận được kí tự mong muốn mà phải thử là
for (i=0;i<6;i++)
mới được nhỉ. Các bạn giải thích giúp mình với. ThanksPhạm Duy Quý
PN:0973291335
Dám nghĩ,dám nói,dám làm
Comment
Bài viết mới nhất
Collapse
-
Trả lời cho Yêu thơ mê nhạc, mời các bác vào đây!bởi dinhthuong92Nhân mùa Vu Lan báo hiếu, giới thiệu bài hát về mẹ:
TRỌN GÁNH THƯƠNG YÊU
Sáng tác: Hoàng Đình Thường
Hòa âm & hát: AI, ngày 04/05/2026
[Verse 1]
Ơn sâu nghĩa nặng ngập tràn
Cả đời mẹ đã nhọc nhằn gian...-
Channel: Tâm tình dân kỹ thuật
24-08-2026, 14:58 -
-
bởi domar123Trong môi trường vận hành kinh doanh và công việc văn phòng hằng ngày, tính ổn định, độ bền bỉ và chi phí đầu tư luôn là những ưu tiên hàng đầu. Bộ vi xử lý AMD Athlon 3000G cùng phiên bản Athlon 3000G MPK mang lại giải pháp máy tính phổ...
-
Channel: Đánh giá sản phẩm DTVN
21-08-2026, 10:53 -
-
bởi ittcCác bác ơi, có người bày em là nên đăng ký học qua thầy, thầy sẽ nhiệt tình hơn rồi thầy quen biết trong giới thi dễ đậu hơn bla bla, nhưng đã có nhiều vụ thầy nhận tiền xong trốn luôn, hoặc giữa thầy và trung tâm không đồng nhất...-
Channel: Tâm tình dân kỹ thuật
20-08-2026, 19:27 -
-
-
bởi domar123Giải pháp build PC thông minh cho game thủ thực dụng
Khi tự lắp một bộ PC chơi game với ngân sách có hạn, việc chi tiêu hợp lý từng đồng là chìa khóa để đạt hiệu năng thực tế cao nhất. Sử dụng các vi xử lý tích hợp đồ...-
Channel: Đánh giá sản phẩm DTVN
20-08-2026, 10:00 -
-
bởi domar123Giải pháp cho dàn PC cao cấp chơi game và làm việc
Khi xây dựng một bộ máy tính cao cấp, việc chọn đúng vi xử lý và card đồ họa sẽ quyết định trực tiếp đến trải nghiệm thực tế của bạn. Dòng chip AMD trang bị công nghệ...-
Channel: Đánh giá sản phẩm DTVN
18-08-2026, 08:55 -
-
bởi domar123Giải pháp toàn diện cho người dùng đa nhiệm
Nếu bạn đang cần một bộ máy vừa phục vụ công việc chuyên môn nặng vừa đáp ứng nhu cầu giải trí cao cấp, sự kết hợp giữa Ryzen 9 9950X TRAY và Radeon RX 9070 XT 16GB là lựa chọn...-
Channel: Đánh giá sản phẩm DTVN
17-08-2026, 17:12 -
-
bởi lvhnKhác nhau là đi lái thuê hoặc chạy dịch vụ được
...
-
Channel: Tâm tình dân kỹ thuật
17-08-2026, 15:50 -
-
bởi ittcHic, sao nhiều anh em khuyên là đàn ông đã học thì học luôn số sàn chứ đừng học số tự động anh....-
Channel: Tâm tình dân kỹ thuật
16-08-2026, 17:46 -

Comment