PIC Vietnam

Go Back   PIC Vietnam > Truyền thông > Giao tiếp cổng COM và LPT

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Giao tiếp cổng COM và LPT RS232, RS485 và LPT là những giao tiếp cơ bản và kinh điển khi mới học về vi điều khiển...

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 25-04-2008, 11:27 PM   #1
uydanh
Đệ tử 4 túi
 
Tham gia ngày: Jan 2007
Bài gửi: 79
:
Cho hỏi về cách thức nhận dữ liệu giao tiếp qua cổng COM

Mình đang xài PIC 16f877a và định viết một chương trình nhỏ thử truyền dữ liệu trên máy tính qua cổng COM xuống PIC qua chân RC7.
Chương trình trên máy tính :
Code:
.......
 mscomm1.output="2"=> ý định là truyền mã ascii 32H xuống PIC
.......
chương trình trên PIC viết bằng CCS
Code:
...
....
char c;
#INT RDA
void Receive_isr()
{
c=getc(); =>ý định là "bắt" ký tự truyền xuống
}
void main()
{
while(1)
{
portB=c;
}
}
Kết quả là truyền đúng.
Bây giờ mình thử truyền 2 ký tự liên tiếp
trên máy tính
Code:
.......
 mscomm1.output="25"=> ý định là truyền mã ascii 32H và 35H xuống PIC
.......
chương trình trên PIC viết bằng CCS
Code:
...
....
char c;
#INT RDA
void Receive_isr()
{
c=getc(); =>ý định là "bắt" ký tự thứ 2 (tức là 35H truyền xuống) hiển thị ra PortB
}
void main()
{
while(1)
{
portB=c;
}
}
Mình nghĩ thế này : khi gửi byte đầu tiên ngắt xảy ra ,biến c lưu byte truyền đầu tiên 32H
sau đó máy tính lại truyền tiếp byte thứ 2 là 35H xuống, ngắt lại xảy ra biến c lại nhận giá trị mới đó tức là 35H.
Vì thời gian nhận 2 byte gửi xuống là rất nhanh. Do đó chỉ có thể nhìn thấy giá trị 35H trên port B thông qua 8 led.
Thế nhưng kết quả lại không đúng ( kết quả gì đó ko biết được).
Mình thật sự không hiểu quá trình nhận 2 byte liên tiếp đó diễn ra như thế nào và làm sao để nhận đúng một chuổi các byte liên tục truyền từ máy tính xuống lưu vào một mảng nào đó. Nhờ bạn nào đó có kinh nghiệm chỉ giúp.
Xin cảm ơn.
uydanh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 26-04-2008, 06:40 AM   #2
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Bạn viết lại code trên máy tính để giữa hai lần gửi ký tự sẽ có một khoảng thời gian trễ (có thể thay đổi được). Sau đó làm thí nghiệm với thời gian trễ ban đầu khá lớn, và giảm dần đến khi xảy ra hiện tượng trên. Sau đó tính toán lại thời gian thực thi code trên PIC, để xem có phải do PIC xử lý dữ liệu nhận quá chậm nên dẫn đến tình trạng trên hay không.

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 26-04-2008, 11:40 AM   #3
uydanh
Đệ tử 4 túi
 
Tham gia ngày: Jan 2007
Bài gửi: 79
:
em đã delay giữa hai lần truyền trên máy tính là 0.55ms thì thấy kết quả nhận đã đúng. Cảm ơn anh Nam.
uydanh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 28-04-2008, 12:31 AM   #4
scentoflove
Đệ tử 6 túi
 
Tham gia ngày: Mar 2006
Bài gửi: 129
:
Nếu bạn viểt có delay ở giữa có phải như vậy ko
mscomm1.output="2"
delay(time) 'Chương trình con delay
mscomm1.output="5"

Ko biết là bạn xài baud bao nhiêu nhưng nếu baud 38400 hoặc 57600 thi hoàn toàn có thể bỏ delay ở giữa 2 lần output (gộp lại ...output="25" thì mình ko sure). Theo kinh nghiệm của mình baud 38400 trở lên ko cần delay
scentoflove vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 02:15 AM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam