PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   dsPIC - Bộ điều khiển tín hiệu số 16-bit (http://www.picvietnam.com/forum/forumdisplay.php?f=29)
-   -   dsPIC30F4011 giao tiếp module SIM508Z (http://www.picvietnam.com/forum/showthread.php?t=6218)

coulomb 24-04-2010 03:26 PM

dsPIC30F4011 giao tiếp module SIM508Z
 
Em đang làm đồ án tốt nghiệp về mạch giao tiếp, để truyền nhận và điều khiển PIC thông qua SMS. Em dùng dsPIC30F4011 và module SIM508z. Em đang bị mắc ở chỗ nhận tín hiệu từ module gửi về PIC, mặc dù gửi dữ liệu từ PIC đến module thì module nhận và xử lý tốt. Em đã giao tiếp thành công giữa PC-module (thông qua Hyper-Terminal 9600-8-n-1), PC-dsPic (truyền nhận ngon lành). Dưới đây là chương trình ngắt của Uart1 để nhận dữ liệu. Các anh xem giúp em với :(


volatile unsigned char BuffUart1[20];
//================================================== ================
// Ngat UART 1
//================================================== ================
void __attribute__((interrupt, auto_psv)) _U1RXInterrupt(void){
volatile unsigned char * receiveddata = BuffUart1;
volatile unsigned char kytu;
do{
if(DataRdyUART1()){
kytu = ReadUART1();
if((kytu != 0x0D)|(kytu != 0x0A)){
*(receiveddata++) = kytu;
}
}
}
while(kytu != 0x0D); //gap nut "Enter" se ket thuc nhan chuoi
printf("\r\n%s\r\n",BuffUart1);// viet chuoi nhan duoc len PC
Init_GLCD();
GLCD_Print88(2,0,BuffUart1);// viet chuoi nhan duoc len GLCD
LATEbits.LATE0 = ~LATEbits.LATE0;//den` bao' co xay ra ngat
IFS0bits.U1RXIF = 0;
}

tín hiệu từ module trả về có dạng :"<CR><LF>OK<CR><LF>" với <CR> là ký tự có mã 0x0A và <LF> là ký tự có mã 0x0D

Nếu em định dạng ngắt Uart xảy ra khi bộ đêm có 1 ký tự thì khi PIC nhận tín hiệu từ module sẽ bị treo trong ngắt. Còn nếu ngắt xảy ra khi có 3-4 ký tự trong bộ đệm thì sẽ ko xảy ra ngắt khi mudule truyền dữ liệu tới.

ubuntu7 04-05-2010 01:37 PM

hi bác.
em k hiểu lắm cái này nhưng em xin hỏi bác cái cho dòng lệnh sau:
if((kytu != 0x0D)|(kytu != 0x0A))
1. bác định dùng phép toán or logic hay toán học.
2. em giả sử ký tự bác nhận được là 0x0a -> bieu thức ss ban đầu đúng -> biểu thức sau có đúng hay sai k quan trọng. ngược lại nếu kytu = 0x0d.
k biết đây có phải là lý do k?

coulomb 11-05-2010 01:49 AM

Trích:

Nguyên văn bởi ubuntu7 (Post 35677)
hi bác.
em k hiểu lắm cái này nhưng em xin hỏi bác cái cho dòng lệnh sau:
if((kytu != 0x0D)|(kytu != 0x0A))
1. bác định dùng phép toán or logic hay toán học.
2. em giả sử ký tự bác nhận được là 0x0a -> bieu thức ss ban đầu đúng -> biểu thức sau có đúng hay sai k quan trọng. ngược lại nếu kytu = 0x0d.
k biết đây có phải là lý do k?

1. cái này là or logic vì sau 1 lệnh so sánh a==b thì giá trị trả về bao jo` cũng ở dạng logic (em viết đó là or toán học cũng ko sai trong trường hợp này nhưng do em thiếu sót)
2.cái vòng if đó là để không lưu bất kỳ ký tụ 0x0A hoặc 0x0D vào trong BuffUart1, khi nào mà gặp ký tự 0x0D sẽ nhảy ra khỏi vòng while(); chả hiểu sao e paste vào nó ko dịch các tab nên hơi khó nhìn
3 thank bác đã quan tâm vì em post bài mà ko ai giúp :)
4 vấn đề của em đã dc giải quyết, cuối cùng là do baudrate, do trong ngắt xử lý nhiều lệnh nên em để baudrate 1200 jo` chạy ngon lành rồi


Múi giờ GMT. Hiện tại là 07:07 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