ตอนที่ 6 ตัวอย่างการเขียนโปรแกรมรับ-ส่งข้อมูล
ผ่านทาง UART ด้วย QtserialPort
ติดตั้ง QtSerialPort
- เปิดโปรแกรม LXTerminal
- พิมพ์คำสั่ง git clone -b old/5.1 git://gitorious.org/qt/qtserialport.git เพื่อโหลดซอร์สโค้ดของไลบรารี่
- เมื่อโหลดเสร็จจะได้ไดเรกทอรี่ของ qtserialport เพิ่มเข้ามา
- เปิดโปรแกรม Qt Creator พิมพ์คำสั่ง sudo qtcreator
- เปิดไฟล์ Project ใน qtserialport/qtserialport.pro
- ไปที่โหมด Project
- คลิก Add Build
- คลิก Configure Project
- โปรแกรมจะเข้าไปที่หน้า Edit ให้กลับไปที่หน้า Project
- คลิก Add Build Step
- เลือก Make
- เพิ่ม Make arguments ว่า “install”
- ไปที่เมนู Build เลือก Rebuild All แล้วรอให้คอมไพล์จนเสร็จ
วิธีการปิด Serial Console ของบอร์ด Raspberry Pi
บอร์ด Raspberry Pi เปิดใช้งาน Serial Port (ttyAMA0) เป็น Console สำหรับติดต่อกับตัวบอร์ด ซึ่งในการทดลองนี้จำเป็นจะต้องใช้ Serial Port เช่นกัน จำเป็นต้องปิดการใช้งาน Serial Console บนบอร์ดเสียก่อน ไม่ให้แย่งกันใช้ Serial Port ระหว่าง Shell ของ Linux กับ Application ที่เราเขียนขึ้น และอาจทำให้บอร์ด Error ได้
- เปิดโปรแกรม LXTerminal
- พิมพ์คำสั่ง sudo vi /etc/inittab เปิดไฟล์ inittab เพื่อแก้ไข
- กด Enter
- เลื่อนเคอร์เซอร์ลงไปบรรทัดที่มีข้อความ T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
- กดตัว i (insert เข้าสู่โหมดการพิมพ์แทรก) บน keyboard เพื่อเพิ่มตัวอักษร
- เพิ่มเครื่องหมาย # หน้าบรรทัด #T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
- กดปุ่ม Esc เพื่อออกจากโหมดการพิมพ์ ตามด้วย :wq เพื่อบันทึก (write) และปิด (quit) แล้วกด Enter
- ปิด Bootup Info พิมพ์คำสั่ง sudo leafpad /boot/cmdline.txt
- แก้ข้อความจาก ttyAMA0 ให้เป็น tty1
- ไปที่เมนู File เลือก Save แล้วปิดโปรแกรม
- Reboot บอร์ด โดยพิมพ์คำสั่ง sudo reboot
ทดลองเขียนโปรแกรม รับ/ส่ง Data กับ Computer ผ่านทาง Serial Port ด้วย QtserialPort
- ต่อบอร์ด RaspberryPi กับ USB to Serial และเชื่อมต่อ USB to Serial กับคอมพิวเตอร์ดังรูป
- เปิดโปรแกรม LXTerminal แล้วเปิดโปรแกรม Qt Creator ด้วยคำสั่ง sudo qtcreator
- สร้าง Project ใหม่ชื่อ serial
- เปิดไฟล์ serial.pro แล้วเพิ่มโค้ด
CONFIG += serialport
- ออกแบบหน้าตาโปรแกรมให้มี Widget ดังนี้
o Pushbutton 3 อัน โดยแสดงข้อความบน Button ดังนี้
“Open”
“Close”
“Send”
คลิกขวาที่ PushButton ทีละอัน แล้วสร้าง Slot เลือก Signal = clicked ให้ครบทั้ง 3 อัน
o Combo Box 1 อัน
o Text Edit 1 อัน
o Line Edit 1 อัน
ภาพรวมของหน้าตาโปรแกรม
- ไปที่ไฟล์ mainwindows.cpp- เพิ่ม include ไฟล์ QSerialPort กับ QSerialPortInfo และประกาศตัวแปล QSerialPort serial;
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
QSerialPort serial;
- เพิ่มโค้ดลงในฟังก์ชั่น MainWindow::MainWindow(QWidget *parent):QMainWindow (parent),ui(new Ui::MainWindow) ดังนี้
บรรทัดที่ 14 เมื่อโปรแกรมถูกเปิดขึ้นให้วนรอบอ่านข้อมูลของ Serial Port ทั้งหมดที่เชื่อมต่ออยู่กับ RaspberryPi
บรรทัดที่ 16 นำเอาชื่อของ Serial Port มาเพิ่มเข้าไปใน Combo Box
- เพิ่มโค้ดลงในฟังก์ชั่น void MainWindow::on_pushButton_clicked()ดังนี้
บรรทัดที่ 29 นำเอารายชื่อ Serial Port ที่อยู่ใน Combo Box มาใช้งาน
บรรทัดที่ 30 กำหนด Baud Rate = 9600 bps
บรรทัดที่ 31 กำหนด Data Bits = 8 bits
บรรทัดที่ 32 กำหนดให้ไม่ใช้งาน Parity Bit
บรรทัดที่ 33 กำหนด Stop Bit = 1 bit
บรรทัดที่ 34 กำหนดให้ไม่ใช้ Flow Control
บรรทัดที่ 35 กำหนด Signal และ Slot เมื่อมีข้อมูลเข้ามาจากฟังก์ชั่น readyRead() ให้เข้าไปทำงานในฟังก์ชั่น readData()
บรรทัดที่ 36 เปิดใช้งาน Serial Port แล้วตรวจสอบเงื่อนไข
บรรทัดที่ 38 หากสามารถเปิดใช้งาน Serial Port สำเร็จ ให้เคลียร์ข้อความทั้งหมดใน Text Edit ด้วยฟังก์ชั่น clear();
บรรทัดที่ 39 ให้แสดงข้อความ “Open Port Success” ใน Text Edit
บรรทัดที่ 44 หากไม่สามารถเปิดใช้งาน Serial Port สำเร็จ ให้แสดงข้อความ “Unable to Open Comm Port” ใน Text Edit
- สร้างฟังก์ชั่น readData() โดยเขียน Code ดังนี้
บรรทัดที่ 50 อ่านค่าที่ได้รับมาจาก Serial Port ด้วยฟังก์ชั่น readAll() มาเก็บในตัวแปร QByteArray ชื่อ data
บรรทัดที่ 51 แปลงตัวแปร data จาก QByteArray ให้เป็น QString และนำไปข้อความ ไปแสดงต่อจากข้อความเดิม ใน Text Edit
- ประกาศชื่อฟังก์ชั่น readData() ใน mainwindows.h
o ไปที่ไฟล์ mainwindows.h
o เพิ่มชื่อฟังก์ชั่น void readData(); วางไว้ภายใต้ private slots;
- เพิ่มโค้ดลงในฟังก์ชั่น void MainWindow::on_pushButton_2_clicked() ดังนี้
บรรทัดที่ 56 ปิดการใช้งาน Serial Port
- เพิ่มโค้ดลงในฟังก์ชั่น void MainWindow::on_pushButton_3_clicked() ดังนี้
บรรทัดที่ 61 แปลงตัวอักษรใน Line Edit เป็น UTF8 และส่งออกไปทาง Serial Port
- ทดลอง Run โปรแกรม
o เปิดโปรแกรม Putty บนเครื่องคอมพิวเตอร์ หากไม่มีสามารถ Download ได้ที่
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
o หน้าแรกในหัวข้อ Session เลือก Connect Type เป็น Serial
o จากนั้นเลือกหัวข้อ Connection > Serial แล้วกำหนดค่าต่างๆ
ตั้ง Serial line to connect ให้ตรงกับชื่อ COM Port ของ USB to Serial
ตั้ง Speed (baud)=9600
Data bits=8
Stop bits=1
Parity=None
Flow control=None
o คลิกปุ่ม Open บน PuTTY
o คลิกปุ่ม Open ในโปรแกรมที่เราสร้างขึ้นบนบอร์ด Raspberry Pi
o ทดสอบพิมพ์ข้อความ ThaiEasyElec ใน Line Edit และกดปุ่ม Send ข้อความใน Line Edit จะถูกส่งไปแสดงในโปรแกรม Putty ผ่านทาง Serial Port
o ทดสอบพิมพ์ข้อความ www.ThaiEasyElec.com ในโปรแกรม Putty ข้อความจะถูกนำไปแสดงใน Text Edit ผ่านทาง Serial Port
ไม่มีความคิดเห็น:
แสดงความคิดเห็น