ในตัวอย่างนี้อาจารย์จะสาธิตการเขียนคำสั่งในภาษา python และจำลอง serial port ทำการจำลองฝั่งผู้สร้างข้อมูล โดยรับคำสั่งจากผู้อ่านข้อมูลและส่งค่าข้อมูลสมมุติกลับมายังฝั่งที่อ่านข้อมูล
สิ่งที่ต้องจัดเตรียมเพื่อจำลองการอ่านและเขียนจาก serial port
- PC
- โปรแกรม python ดาวน์โหลดได้จาก https://www.python.org/downloads/
- โปรแกรมจำลอง port serial ดาวน์โหลดได้จาก https://download.cnet.com/Free-Virtual-Serial-Ports-Emulator/3000-2206_4-10836189.html
การจำลอง serial port
เปิดโปรแกรมจำลอง serial port จะปรากฎหน้าจอของโปรแกรมดังรูป
- ที่คำสั่ง Device เลือก Create ดังรูป
- เลือก Device type เป็น Connector และคลิ้ก Next ดังรูป
- เลือก port ที่ต้องการจำลอง ในที่นี้อาจารย์เลือก COM7 ดังรูป (เพื่อหลีกเลี่ยงการไปตรงกับ COM port อื่น ๆ ที่อาจจะมีการใช้งาน เช่น COM1 ต่ออุปกรณ์ USB อยู่ เป็นต้น) จากนั้นกดปุ่ม Finis
- หน้าจอโปรแกรมจะแสดงผลว่า COM7 พร้อมสำหรับการใช้งานแล้ว ดังรูป
การอ่านและเขียนข้อมูล serial port ด้วย python
เปิด editor สำหรับเขียนคำสั่งของ python ในที่นี้ อ.ใช้ Visual Studio Code ก่อนอื่นให้ติดตั้ง pyserial ด้วยคำสั่ง pip install pyserial ก่อน ด้วยการพิมพ์คำสั่งนี้ใน shell
pip install pyserial
จากนั้นเขียนคำสั่ง python โดยแบ่งเป็น 2 ไฟล์
ให้ไฟล์แรกเป็นฝั่งที่รับคำสั่งและสร้างข้อมูลส่งกลับไปยังฝั่งผู้อ่านข้อมูล ดังนี้
from time import sleep
import serial
try:
serialPort = serial.Serial(port = "COM7", baudrate=19200,bytesize=8, timeout=2, stopbits=serial.STOPBITS_ONE)
print("OK the port is opened!")
a = 0
v_text = ''
while(1):
if(serialPort.in_waiting > 0):
serialString = serialPort.readline()
# convert bytes to string
captured_data = serialString.decode('Ascii')
captured_data = [x.replace("\r\n","") for x in captured_data]
print(captured_data[0])
if(captured_data[0]=="R"):
print("Ok I have got your request and return 1 record of data for you.")
a += 1
v_text = "Data number " + str(a) +" from COM7"
serialPort.write(v_text.encode())
sleep(1)
else:
print("Ok I have got something")
sleep(1)
except serial.SerialException as error:
print("Failed {}".format(error))
ไฟล์ที่ 2 เป็นฝั่งผู้อ่านข้อมูล ส่งคำสั่ง R (เป็นข้อตกลงที่เรากำหนดเอง) และรอรับข้อมูลที่ส่งกลับมาจากฝั่งผู้สร้างข้อมูล ดังนี้
from time import sleep
import serial
try:
serialPort = serial.Serial(port = "COM7", baudrate=19200,bytesize=8, timeout=2, stopbits=serial.STOPBITS_ONE)
print("OK the port is opened!")
v_text = "R \r\n"
serialPort.write(v_text.encode())
print("Writing "+v_text)
sleep(2)
while(1):
if(serialPort.in_waiting > 0):
serialString = serialPort.readline()
# convert bytes to string
captured_data = serialString.decode('Ascii')
print("Reading "+captured_data)
break
else:
print("no data yet")
sleep(1)
except serial.SerialException as error:
print("Failed {}".format(error))
ทดสอบการทำงาน
- รันคำสั่งผู้ฝั่งสร้างข้อมูล จะมีข้อความแจ้งว่าสามารถเปิด port และกำลังรอการร้องขอข้อมูล
- รันคำสั่งฝั่งผู้อ่านข้อมูล จะมีข้อความแจ้งว่าสามารถเปิด port ได้ และเริ่มส่งคำสั่ง R เพื่อร้องขอข้อมูลจากฝั่งผู้สร้างข้อมูล
- ฝั่งผู้สร้างข้อมูลได้รับการร้องขอข้อมูลก็จะตอบกลับด้วยข้อมูล 1 รายการ
- ฝั่งผู้อ่านข้อมูลจะได้รับข้อมูลและจบโปรแกรมกลับเข้าสู่ command prompt
เป็นอันเสร็จสิ้นขั้นตอนการจำลองการใช้คำสั่ง python อ่านข้อมูลจาก serial port นะครับ ซึ่งในการใช้งานจริงเราสามารถเขียนคำสั่ง python ไว้ในเครื่องคอมพิวเตอร์ขนาดเล็กที่ติดตั้งไว้ที่สถานีตรวจวัดค่าต่าง ๆ และเชื่อมต่อ sensor กับ serial port ของเครื่องคอมพิวเตอร์ ทำให้เราสามารถอ่านค่าจาก sensor ได้ตามกำหนดเวลาที่เราต้องการ โดยการอ่านข้อมูลนั้นเราต้องศึกษา protocol ของ sensor ด้วยว่าต้องส่งคำสั่งใดผ่าน serial port ไปยัง sensor และทำให้ sensor ตอบกลับมาเป็นข้อมูลที่เราต้องการ
หวังว่าบทความสั้น ๆ นี้จะมีประโยชน์สำหรับนักศึกษาที่สนใจนำไปใช้งานในลักษณะที่คล้ายคลึงกัน