ผู้เขียน หัวข้อ: เรียนรู้ครั้งที่ 15 [การอ่านค่าจากอินพุทพอร์ตของพอร์ตขนานเบื้องต้น]  (อ่าน 3645 ครั้ง)

admin

  • Administrator
  • Hero Member
  • *****
  • กระทู้: 706
    • ดูรายละเอียด
    • อีเมล์
พอร์ตขนานหรือที่รู้จักโดยทั่วไปคือพอร์ตปริ้นเตอร์ปัจจุบันจะพบได้ในเครื่องคอมพิวเตอร์ตั้งโต๊ะซึ่งบางรุ่นอาจไม่มีแล้ว โดยพอร์ตขนานนี้จะมีพอร์ตย่อย 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. เขียนโค้ดในไฟล์คลาสที่ปรากฎขึ้น

โค้ดส่วนแรก
โค๊ด: [Select]
using System.Runtime.InteropServices;
โค้ดส่วนสองที่เขียนในคลาส
โค๊ด: [Select]
        [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 แล้วเขียนโค้ด

โค้ดส่วนแรก ประกาศตัวแปร
โค๊ด: [Select]
        byte newValue = 0, oldValue = 0;
โค้ดส่วนสองอ่านค่าจากอินพุทพอร์ต
โดยจะอัพเดตแสดงผลค่าเฉพาะที่ค่าที่รับมาใหม่ต่างจากค่าเดิมก่อนหน้า
โค๊ด: [Select]
            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 »

admin

  • Administrator
  • Hero Member
  • *****
  • กระทู้: 706
    • ดูรายละเอียด
    • อีเมล์

admin

  • Administrator
  • Hero Member
  • *****
  • กระทู้: 706
    • ดูรายละเอียด
    • อีเมล์