PDA

View Full Version : lỗi nhận RS232


mocdailam
02-05-2009, 02:11 AM
mấy anh kiểm tra dùm em với. em muốn nhận một string từ máy lưu vào text[] không biết lỗi ở đâu mà nó không nhận đúng.


#include <18F4550.h>
#device *=16 ADC=8
#fuses NOWDT,PUT,HS,NOPROTECT
#use delay(clock=20M)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,bits=8)
...

#int_rda
void rcv_data()
{
char key;
int8 ii=0;
disable_interrupts(INT_RDA);
disable_interrupts(INT_TIMER0);
// gets(text);

key = getc();
chedo = key;// phan tu dau tien cua goi tin la phan tu chon che do
tt=2;
do
{
//if(kbhit())

key = getc();
putc(key);
text[ii]=key;
ii++;
if ( ii>text_max) break;

}while (key !='\0');
enable_interrupts(INT_RDA);
enable_interrupts(INT_TIMER0);
}
...
//ham main()
void main()
{
int8 g,n,itext=0,ich=0,demp=0,k,kt=1;
set_tris_b(0);
set_tris_d(0);
set_tris_c(0b10000001);
setup_timer_0( RTCC_INTERNAL |RTCC_DIV_64|RTCC_8_BIT);
set_timer0(0);

enable_interrupts(INT_RDA);
enable_interrupts(global);
enable_interrupts(int_timer0);

mocdailam
02-05-2009, 11:26 PM
có ai giúp mình với. sắp die rồi!

tungtot_vl
04-05-2009, 12:06 PM
code trên có chạy được đâu mà bạn bảo là nhận không đúng
bạn khai báo phần cứng như sau. thạch anh chạy 20M
#include<18f4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CP UDIV1,VREGEN,NOBROWNOUT
#device 18F4550*=16 ADC=10
#use delay(clock=48000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
mỗi khi giao tiếp, PC chỉ truyền xuống 1 byte. khi có ngắt RDA chương trình (PIC) nhảy vào ngắt xử lý ctr ngắt (nhận 1 byte từ PC gửi xuống) sau đó nhảy về vị trí củ. khi có ngắt thì nhảy vào xử lý tiếp ctr ngắt để nhận 1 byte khác từ PC gửi xuống. chứ nó không nằm ở chương trình ngắt RDA để nhận toàn bộ chuỗi từ PC gửi xuống. dó đó phần do ... white() của bạn để lập lại cho đến khi nhận byte stop là không đúng.
bạn xem lại lý thuyết về các ngắt nhé

mocdailam
05-05-2009, 05:45 PM
cám ơn bạn nhiều!

thienkien
28-05-2009, 10:17 PM
ch­ương trình giao tiếp của mình truyền nhận đúng khi khai báo tần số thạch anh =tần số thạch anh thực . Nhưng khi khai báo ép xung lên (dùng hspll) thì nhận sai ký tự ??có khi nào phải tính lại baudrate ko nhi???.ai từng gặp tình huống này giúp mình!!! gấp gấp nhé

auduongphong
02-06-2009, 12:58 PM
Sao bác không khai báo đúng đi cho nó chạy.
Sao tự dưng làm khó mình vậy ?? Hêhê
Đây là một lỗi thường hay xảy ra khi giao tiếp với máy tính.
Tần số thạch anh (trong chương trình)==== tần số thực của thạch anh trên mạch.