Câu hỏi

26/04/2013 21:03
Giúp mình viết chương trình điều khiển thiết bị điện thông qua cổng máy in?
Tôi muốn viết chương trình điều khiển thiết bị điện thông qua cổng máy in. Xin cho biết có thể dùng hàm gì trong Visual Basic hoặc Visual C++ để thực hiện việc này?
xuantrong
26/04/2013 21:03
Danh sách câu trả lời (1)

Thường để lập trình truy xuất trực tiếp 1 thiết bị I/O (thí dụ card giao tiếp với máy in), bạn cần nắm vững 3 thông tin sau:
o Tất cả các thanh ghi của card giao tiếp mỗi thanh được truy xuất thông qua 1 địa chỉ I/O mà ta thường gọi là cổng I/O (I/O port). Có thể có các loại thanh ghi sau trên 1 card giao tiếp: thanh ghi chứa dữ liệu nhập, thanh ghi chứa dữ liệu xuất, thanh ghi lệnh và thanh ghi trạng thái làm việc. Thường các thanh ghi của LPT1 có địa chỉ từ 0x378 đến 0x37F (số hexadecimal).
o Các đường ngắt (interrupt) được dùng bởi card giao tiếp, mỗi đường ngắt sẽ nhờ CPU chạy 1 thủ tục phục vụ ngắt độc lập. Thường cổng LPT1 dùng đường ngắt số 7 (IRQ7) để giao tiếp máy in.
o Các kênh DMA (Direct Memory Access) được dùng bởi card giao tiếp để phục vụ trao đổi dữ liệu nhanh giữa bộ nhớ RAM và thiết bị I/O. Thường chỉ những card I/O cần đọc/ghi dữ liệu lớn và nhanh mới dùng tới khả năng DMA (card giao tiếp đĩa cứng, CDROM...).
Tuy nhiên trong Windows, việc lập trình I/O trực tiếp nên được viết trong các module đặc biệt (các device driver) thỏa mãn những qui định và cấu trúc do Windows xác lập để đảm bảo tính tin cậy, ổn định, an toàn và giải quyết được việc dùng chung bởi nhiều ứng dụng đồng thời. Chính vì lý do này, các thư viện lập trình ngôn ngữ (ngay cả của ngôn ngữ C) chỉ cung cấp một số hàm nhỏ để truy xuất các thanh ghi của card giao tiếp, thí dụ như hàm _outp(), _intp() và các biến thể của chúng, còn việc khai báo thủ tục ngắt và quản lý kênh DMA thì không được nhắc đến ở cấp ứng dụng. Tóm lại nếu bạn chỉ dừng lại ở mức truy xuất các thanh ghi I/O của card giao tiếp máy in, bạn có thể dùng các hàm _intp() và _outp() của thư viện ngôn ngữ C hay C++. Nếu viết ứng dụng bằng VB, bạn có thể tạo 1 thư viện *.dll chứa các hàm truy xuất bằng ngôn ngữ C để ứng dụng VB gọi vào. Lưu ý rằng cách giải quyết này (gọi hàm _intp() và _outp()) chỉ có thể chạy trên Win9x và WinMe nhưng không chạy được trên WinNT, Win2000 và WinXP. Cách chính quy và triệt để nhất là nghiên cứu bộ DDK (Device Development Kit) của Windows để viết các device driver thích hợp.
o Tất cả các thanh ghi của card giao tiếp mỗi thanh được truy xuất thông qua 1 địa chỉ I/O mà ta thường gọi là cổng I/O (I/O port). Có thể có các loại thanh ghi sau trên 1 card giao tiếp: thanh ghi chứa dữ liệu nhập, thanh ghi chứa dữ liệu xuất, thanh ghi lệnh và thanh ghi trạng thái làm việc. Thường các thanh ghi của LPT1 có địa chỉ từ 0x378 đến 0x37F (số hexadecimal).
o Các đường ngắt (interrupt) được dùng bởi card giao tiếp, mỗi đường ngắt sẽ nhờ CPU chạy 1 thủ tục phục vụ ngắt độc lập. Thường cổng LPT1 dùng đường ngắt số 7 (IRQ7) để giao tiếp máy in.
o Các kênh DMA (Direct Memory Access) được dùng bởi card giao tiếp để phục vụ trao đổi dữ liệu nhanh giữa bộ nhớ RAM và thiết bị I/O. Thường chỉ những card I/O cần đọc/ghi dữ liệu lớn và nhanh mới dùng tới khả năng DMA (card giao tiếp đĩa cứng, CDROM...).
Tuy nhiên trong Windows, việc lập trình I/O trực tiếp nên được viết trong các module đặc biệt (các device driver) thỏa mãn những qui định và cấu trúc do Windows xác lập để đảm bảo tính tin cậy, ổn định, an toàn và giải quyết được việc dùng chung bởi nhiều ứng dụng đồng thời. Chính vì lý do này, các thư viện lập trình ngôn ngữ (ngay cả của ngôn ngữ C) chỉ cung cấp một số hàm nhỏ để truy xuất các thanh ghi của card giao tiếp, thí dụ như hàm _outp(), _intp() và các biến thể của chúng, còn việc khai báo thủ tục ngắt và quản lý kênh DMA thì không được nhắc đến ở cấp ứng dụng. Tóm lại nếu bạn chỉ dừng lại ở mức truy xuất các thanh ghi I/O của card giao tiếp máy in, bạn có thể dùng các hàm _intp() và _outp() của thư viện ngôn ngữ C hay C++. Nếu viết ứng dụng bằng VB, bạn có thể tạo 1 thư viện *.dll chứa các hàm truy xuất bằng ngôn ngữ C để ứng dụng VB gọi vào. Lưu ý rằng cách giải quyết này (gọi hàm _intp() và _outp()) chỉ có thể chạy trên Win9x và WinMe nhưng không chạy được trên WinNT, Win2000 và WinXP. Cách chính quy và triệt để nhất là nghiên cứu bộ DDK (Device Development Kit) của Windows để viết các device driver thích hợp.
Trả lời câu hỏi
Câu hỏi lĩnh vực Lập trình
Rao vặt Siêu Vip