Trích:
Nguyên văn bởi harakiri
Cám ơn anh Nam. Hàm delay là do em thử một trị khác trị tính toán ban đầu nên nó lung tung,không chính xác. Loay hoay tìm nhưng rốt cuộc lại bị lỗi là chưa gọi hàm Init_TMR1(). Một bài học đắt giá cho kinh nghiệm rất ít của em. Sau khi gửi lên máy tính xong, trong hàm main em viết thêm một câu lệnh nhận rất đơn giản (với biến temp em khai bao thuoc kieu char) rồi sau đó gửi ngược lên. Tuy nhiên nó lại không chạy. Nhân đây cho em hỏi, nếu mình muốn nhận về một chuỗi ký tự thì mình tách chuỗi thế nào để nhận được .
************************************************** *******
int main(void) {
InitClock(); // This is the PLL settings
Init_TMR1();
InitUART1(); // Initialize UART2 for 9600,8,N,1 TX/RX
while(1) { // The ever versatile Infinite Loop!
if (U1STAbits.URXDA==1)
{
temp=U1RXREG;
delay_ms(10);
U1TXREG=temp;
}
}
}
************************************************** ******
Còn khi em thử dùng hàm sau để kiểm tra thử :
*******************************
if (U1STAbits.URXDA==1){
U1TXREG='A';
}
else
{delay_ms(50);
U1TXREG='B';
}
********************************
thì kết quả là trên máy tính luôn nhận 'A'.
|
Nếu U1STAbits.URXDA bằng '1' thì có dữ liệu để đọc, nên đọc cho đến khi hết dữ liệu trong bộ đệm rồi hẵng dừng. Trong quá trình đọc có thể xuất dữ liệu ngược lại nguồn phát.
Đoạn code đầu tiên của bạn có gọi hàm delay_ms(), không rõ hàm này sẽ delay bao lâu, do đó không nên dùng nó. Đoạn code thứ hai thì rơi vào tình trạng nếu U1STAbits.URXDA bằng '1' thì nó sẽ luôn luôn rơi vào nhánh if, vì trong nhánh if đó bạn không bao giờ đọc dữ liệu ra khỏi bộ đệm để cờ URXDA được xóa về '0'.
Trong đoạn code thử của bạn, bạn nên bỏ hẳn lệnh gọi hàm delay_ms() đi, và phát ngay sau khi nhận được dữ liệu xem. Như vậy dsPIC sẽ chờ đến khi có dữ liệu và phát trả lại dữ liệu ngay khi đọc từ bộ đệm. Đây là cách tôi vẫn thử các module UART.
Thân,