« เมื่อ: กันยายน 24, 2018, 08:20:55 PM »
พอร์ตขนานหรือที่รู้จักโดยทั่วไปคือพอร์ตปริ้นเตอร์ปัจจุบันจะพบได้ในเครื่องคอมพิวเตอร์ตั้งโต๊ะซึ่งบางรุ่นอาจไม่มีแล้ว โดยพอร์ตขนานนี้จะมีพอร์ตย่อย 3 พอร์ตคือ
-Data port ทำงานเป็นเอาต์พุตพอร์ตมีหมายเลขแอดเดรสพอร์ตเป็น 0x378
-Status port ทำงานเป็นอินพุตพอร์ตมีหมายเลขแอดเดรสพอร์ตเป็น 0x379
-Control port ทำงานเป็นเอาตุพุตพอร์ตมีหมายเลขแอดเดรสพอร์ตเป็น 0x37A
ดังรูป
การเรียนรู้ในครั้งนี้เป็นการเรียนรู้ที่จะอ่านค่าเข้ามาทางพอร์ตที่ทำหน้าที่เป็นอินพุทพอร์ตนั่นก็คือ Status port ซึ่งมีหมายเลขพอร์ตเป็น 0x379 ขั้นตอนมีดังนี้
1. วงจรเชื่อมต่อสำหรับการเรียนรู้ในครั้งนี้ (สามารถต่อโดยใช้แผ่นปริ้นเอนกประสงค์)
2. สร้างโปรเจคใหม่พร้อมวาง Label ทั้งหมด 6 ตัวพร้อมแก้คุณสมบัติเพื่อให้ใด้ดังรูป
3. คัดลอกไฟล์ไดร์เวอร์ inpout32.dll มาไว้ในโฟลเดอร์ bin/Debug ซึ่งเป็นโฟลเดอร์เก็บไฟล์ EXE ของโปรแกรมที่สร้างขึ้น
หมายเหตุ ทำขั้นตอนเดียวกับการเรียนรู้ในครั้งที่ 14 ในการส่งข้อมูลออกพอร์ต สามารถคลิกครับไปศึกษาได้ที่
http://www.praphas.com/forum/index.php?topic=373.0
4. เพิ่มไฟล์คลาสเพื่อเก็บโค้ดสำหรับติดต่อพอร์ตโดยดำเนินการดังนี้
-คลิกขวาที่ชื่อโปรเจคงาน
-คลิก Add
-คลิก Class
5. ตั้งใช้ไฟล์คลาสเป็น PortAccess.cs
6. เขียนโค้ดในไฟล์คลาสที่ปรากฎขึ้น
โค้ดส่วนแรก
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 วินาที) เพื่อให้ตรวจจับการกดสวิตช์ได้ทันเมื่อมีการกดสวิตช์เกิดขึ้น
8. ดับเบิลคลิกที่ตัว Timer แล้วเขียนโค้ด
โค้ดส่วนแรก ประกาศตัวแปร
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 ไปรันที่เครื่องตั้งโต๊ะที่มีการต่อวงจรเชื่อมต่อไว้ ทดลองกดสวิตช์แล้วสังเกตุผลที่เกิดขึ้น
« แก้ไขครั้งสุดท้าย: กันยายน 24, 2018, 08:23:50 PM โดย admin »
บันทึกการเข้า