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.