พอร์ตขนานหรือที่รู้จักโดยทั่วไปคือพอร์ตปริ้นเตอร์ปัจจุบันจะพบได้ในเครื่องคอมพิวเตอร์ตั้งโต๊ะซึ่งบางรุ่นอาจไม่มีแล้ว โดยพอร์ตขนานนี้จะมีพอร์ตย่อย 3 พอร์ตคือ
-Data port ทำงานเป็นเอาต์พุตพอร์ตมีหมายเลขแอดเดรสพอร์ตเป็น 0x378
-Status port ทำงานเป็นอินพุตพอร์ตมีหมายเลขแอดเดรสพอร์ตเป็น 0x379
-Control port ทำงานเป็นเอาตุพุตพอร์ตมีหมายเลขแอดเดรสพอร์ตเป็น 0x37A
ดังรูป
(http://www.praphas.com/PhotoForum/interface/HowTo15/1.png)
การเรียนรู้ในครั้งนี้เป็นการเรียนรู้ที่จะอ่านค่าเข้ามาทางพอร์ตที่ทำหน้าที่เป็นอินพุทพอร์ตนั่นก็คือ Status port ซึ่งมีหมายเลขพอร์ตเป็น 0x379 ขั้นตอนมีดังนี้
1. วงจรเชื่อมต่อสำหรับการเรียนรู้ในครั้งนี้ (สามารถต่อโดยใช้แผ่นปริ้นเอนกประสงค์)
(http://www.praphas.com/PhotoForum/interface/HowTo15/2.png)
2. สร้างโปรเจคใหม่พร้อมวาง Label ทั้งหมด 6 ตัวพร้อมแก้คุณสมบัติเพื่อให้ใด้ดังรูป
(http://www.praphas.com/PhotoForum/interface/HowTo15/3.png)
3. คัดลอกไฟล์ไดร์เวอร์ inpout32.dll มาไว้ในโฟลเดอร์ bin/Debug ซึ่งเป็นโฟลเดอร์เก็บไฟล์ EXE ของโปรแกรมที่สร้างขึ้น
หมายเหตุ ทำขั้นตอนเดียวกับการเรียนรู้ในครั้งที่ 14 ในการส่งข้อมูลออกพอร์ต สามารถคลิกครับไปศึกษาได้ที่
http://www.praphas.com/forum/index.php?topic=373.0 (http://www.praphas.com/forum/index.php?topic=373.0)
4. เพิ่มไฟล์คลาสเพื่อเก็บโค้ดสำหรับติดต่อพอร์ตโดยดำเนินการดังนี้
-คลิกขวาที่ชื่อโปรเจคงาน
-คลิก Add
-คลิก Class
(http://www.praphas.com/PhotoForum/interface/HowTo15/4.png)
5. ตั้งใช้ไฟล์คลาสเป็น PortAccess.cs
(http://www.praphas.com/PhotoForum/interface/HowTo15/5.png)
6. เขียนโค้ดในไฟล์คลาสที่ปรากฎขึ้น
(http://www.praphas.com/PhotoForum/interface/HowTo15/6.png)
โค้ดส่วนแรก
using System.Runtime.InteropServices;
โค้ดส่วนสองที่เขียนในคลาส
[DllImport("Inpout32.dll")]
public static extern short Inp32(int address);
[DllImport("inpout32.dll", EntryPoint = "Out32")]
public static extern void Output(int adress, int value);
7. วางคอนโทรล Timer ลงใน Form และกำหนดค่าใน Properties ดังนี้
-Enabled-->True เพื่อให้ไทเมอร์ทำงานทันทีเมื่อรันโปรแกรม
-Interval--->10 กำหนดช่วงเวลาการกระตุ้นเป็น 10 มิลลิวินาที (1/100 วินาที) เพื่อให้ตรวจจับการกดสวิตช์ได้ทันเมื่อมีการกดสวิตช์เกิดขึ้น
(http://www.praphas.com/PhotoForum/interface/HowTo15/7.png)
8. ดับเบิลคลิกที่ตัว Timer แล้วเขียนโค้ด
(http://www.praphas.com/PhotoForum/interface/HowTo15/8.png)
โค้ดส่วนแรก ประกาศตัวแปร
byte newValue = 0, oldValue = 0;
โค้ดส่วนสองอ่านค่าจากอินพุทพอร์ต
โดยจะอัพเดตแสดงผลค่าเฉพาะที่ค่าที่รับมาใหม่ต่างจากค่าเดิมก่อนหน้า
try
{
newValue = (byte)PortAccess.Inp32(0x379);
if (newValue != oldValue)
{
oldValue = newValue;
label1.Text = Convert.ToString(newValue, 10).PadLeft(3, '0');
label2.Text = Convert.ToString(newValue, 16).PadLeft(2, '0').ToUpper();
label3.Text = Convert.ToString(newValue, 2).PadLeft(8, '0');
}
}
catch (System.DllNotFoundException)
{
timer1.Enabled = false;
MessageBox.Show("inpout32.dll Not Found !!!", "Dll Error");
System.Environment.Exit(-1);
}
9. คัดลอกไฟล์ EXE พร้อมกับไฟล์ DLL ไปรันที่เครื่องตั้งโต๊ะที่มีการต่อวงจรเชื่อมต่อไว้ ทดลองกดสวิตช์แล้วสังเกตุผลที่เกิดขึ้น
(http://www.praphas.com/PhotoForum/interface/HowTo15/9.png)