PDA

View Full Version : Cho em hỏi về Gets() và get_string() khi lập trình PIC.


ThaoBinh90
09-03-2009, 11:00 AM
Đoạn code như sau:

void main()
{
char str[20];
int8 i = 0;
int8 len;

lcd_init();
lcd_gotoxy(1,1);
while(true)
{
strcpy(str, "");
gets(str);
//get_string(str, 20);
lcd_putc('\f');
len = strlen(str);
for (i=0; i<len; i++)
{
lcd_putc(str[i]);
}
}
}

Mình dùng đoạn code trên để nhận chuỗi dữ liệu từ ứng dụng PC gởi xuống. Nhưng sao chỉ thực hiện nhận dữ liệu và hiển thị lên LCD chỉ một lần.
Khi ứng dụng gởi dữ liệu lần đầu thì hàm gets() hoặc get_string (hàm này được định nghĩa trong input.c) nhận được chuỗi truyền xuống và xuất ra LCD. Khi truyền thêm một chuổi khác thì thấy nó dừng lại chổ hàm gets() hoặc get_string và không thực hiện tiếp nữa (chuỗi dữ liệu truyền từ ứng dụng đã có thêm ký tự kết thúc chuỗi trước khi truyền).
Anh em nào chỉ giúp với. thanks.

tahi
22-04-2009, 06:46 PM
#include "C:\Program Files\PICC\Projects\main.h"
#include "def_877a.h"
#use delay(clock=12000000) //dung thach anh 12Mhz
#use rs232(baud=9600, xmit=PIN_c6, rcv=PIN_c7) //khoi tao truyen thong RS232)

void main()
{ set_tris_b(0x00);
set_tris_d(0x00);
portb=0x55;
//tại sao thêm đoạn code này thì pic lại đơ,portb=0x55, rồi chẳng làm gì nữa
/*
enable_interrupts(GLOBAL); // Cho phep tao ngat
enable_interrupts(INT_EXT); // Cho phep ngat ngoai tai chan RB0/INT
enable_interrupts(INT_RDA); // Cho phep ngat ngoai tai chan RB0/INT
*/
while(true)
{ portb=~portb;
delay_ms(250);

}
}

cskiller
22-04-2009, 07:57 PM
#include "C:\Program Files\PICC\Projects\main.h"
#include "def_877a.h"
#use delay(clock=12000000) //dung thach anh 12Mhz
#use rs232(baud=9600, xmit=PIN_c6, rcv=PIN_c7) //khoi tao truyen thong RS232)

void main()
{ set_tris_b(0x00);
set_tris_d(0x00);
portb=0x55;
//tại sao thêm đoạn code này thì pic lại đơ,portb=0x55, rồi chẳng làm gì nữa
/*
enable_interrupts(GLOBAL); // Cho phep tao ngat
enable_interrupts(INT_EXT); // Cho phep ngat ngoai tai chan RB0/INT
enable_interrupts(INT_RDA); // Cho phep ngat ngoai tai chan RB0/INT
*/
while(true)
{ portb=~portb;
delay_ms(250);

}
}


Chưa định nghĩa #INT_EXT và #INT_RDA ^.^

tahi
23-04-2009, 12:43 AM
#INT_RDA
xulynhan_usart()
{ // char s;
if(j<max)
{ str[j]=getc();
portd=str[j];

if(str[j]==13)
{ j=max;
ngat=1;
}

j++;
}

return 0;
}
định nghĩa đây và đồng thời bỏ int_ext đi , cũng ko được, mấy cái này mô phỏng bằng proteus vẫn chạy

tahi
23-04-2009, 02:47 AM
cho em hỏi tiếp , cơ chế truyền dữ liệu ra cổng rs232 của hyper terminal là thế nào ạ,
trong proteus ,nếu dùng cái terminal để mô phỏng thì ấn phím nào thì nó nhận ngay phìm đó ..
(nên khi muốn nhập 1 xâu, chỉ cần lập trình cho pic đọc từng ký tự , khi nào thấy thằng enter thì thôi ko nhập vào xâu )

còn trong hyper terminal, giả sử em muốn truyền một lệnh (hay 1 xâu) xuống pic, thì hyper terminal sẽ truyền như thế nào ...? giả sử chế độ chuyển baud 9600,8-N-1

giả sử đang vào xử lý ngắt rs232, mà lại có ngắt tiếp theo đến thì nó sẽ sử lý thế nào à .??

tiếp nữa,nếu sử dụng PIC WIZARD và chọn cấu hình RS232 rồi, cho phép ngắt RDA rồi , thì trong chương trình còn phải set các bit cần thiết lên nữa ko ?ví dụ CREN,RCIE,GIE,PEIE.....??