PDA

View Full Version : Làm thế nào để 1 chuơng trình VC++ có thể nhận biết có data như "Tera Term"


ThaoBinh90
07-07-2009, 03:24 PM
- Mình đang lập trình giao tiếp PIC với PC, dùng VC++6.0 để viết chương trình ứng dụng giao tiếp với PIC.
- Hiện tại đang gặp khó khăn trong trường hợp PIC chủ động gởi dữ liệu lên PC, mình không biết lập trình trên VC++6.0 như thế nào để có thể nhận biết được là đang có data trên cổng COM như các chương trình Tera Term hay hp Terminal của window.
Mong được giúp đỡ! thanks!

debugger
08-07-2009, 12:07 AM
Cái này bạn nên lập trình đa nhiệm (dùng thread). Bạn tạo ra một thread để quản lí cổng COM. Thread và chương trình chính liên lạc với nhau bằng cơ chế message (hàm SendMessage hoặc PostMessage) Nếu bạn muốn kiểm tra xem có dữ liệu trong bộ đệm hay không thì có thể có 2 cách làm:
1. Dùng hàm WaitForSingleObject, hoặc
2. Liên tục đọc cổng COM bằng hàm ReadFile để biết có dữ liệu hay không. Số byte đọc được lớn hơn 0 thì có dữ liệu.

Mình nghĩ nếu chịu khó bạn hoàn toàn có thể làm những chương trình tốt hơn Tera Term gì gì đó.

Nếu gặp khó khăn trong việc này mình có thể soạn cho bạn một thư viện DLL để làm việc này rất đơn giản. Goodluck!

ThaoBinh90
08-07-2009, 11:03 AM
Thanks bạn nhiều!
Tạo Thread liên tục đọc cổng COM thì mình cũng có nghĩ tới nhưng mình thấy không hay lắm vì đọc liên tục. Tại mình thấy dưới PIC có ngăt #INT_RDA khi có dữ liệu từ r232 thì phát sinh ngắt. Không biết là trên PC khi có dữ liệu đến rs232 thì có message báo cho mình biết hay không (giống như qua RJ45 là biết được có data gởi đến).
Còn bạn nói dùng hàm WaitForSingleObject thì mình chưa thử.

debugger
08-07-2009, 12:10 PM
Thế thì bạn thử hàm WaitForSingleObject đi. Đây chính là cách làm theo kiểu đợi ngắt đấy. Tuy nhiên có một điểm bạn cần chú ý là thế này trên Windows khi đợi ngắt thì chương trình sẽ không chiếm CPU mà thôi, chứ nó vẫn bị dừng lại như kiểu delay ý. Vì vậy, bạn nên tạo ra một nhánh và ở nhánh này có thể đợi ngắt hoặc hỏi vòng đều được, không ảnh hưởng đến chương trình chính (phần giao diện người dùng chẳng hạn). Mình đã làm với cái này rồi nên biết. Bạn có thể xem chương trình bootloader cho AVR (Blasher) của mình của mình ở bên dientuvietnam. Trong chương trình này mình dùng nhánh và hỏi vòng, không dùng WaitForSingleObject.

ThaoBinh90
08-07-2009, 03:49 PM
Mình không tìm thấy code bootloader tren dientuvietnam như bạn nói, bạn có thể post lại ở đây được không?
cảm ơn!

anh_tran
30-07-2009, 09:53 PM
bạn dùng thư viến MSCOM đó nó có mấy hàm oncom là một dạng ngắt đó