Visual Basic เพื่อติดต่อสื่อสารผ่านพอร์ต RS-232

Posted by Unknown Wednesday, April 24, 2013 0 comments
หลายคนที่ใช้ไมโครคอนโทรลเลอร์คงหนีไม่พ้นการสื่อสารกับคอมพิวเตอร์ โดยผ่านพอร์ต RS-232
หรือซีเรียลพอร์ต แต่บางครั้งก็ไม่รู้ว่าจะเริ่มต้นอย่างไรดี วันนี้ผมจะแนะนำการเขียนโปรแกรม
Visual Basic สื่อสารผ่าน RS-232 เป็นตัวอย่าง สำหรับผู้ที่กำลังมองหาโปรแกรมบนคอมพิวเตอร์
ตัวอย่างต่อไปนี้ใช้บอร์ดทดลองไมโครคอนโทรลเลอร์ PIC18F458 อ่าน A/D ไม่ใช่แค่ Channel เดียวนะครับ
เอาไปเลยมันมี 8 Channel ใช้มันทั้งหมดนี่แหละใช้ทรัพยากรให้คุ้มค่า
โปรเจคนี้ มีโปรแกรมอยู่ 2 ภาษา นะครับ คือ VB และ C (CCSC) สำหรับ PIC18F458


หลักการทำงานของโปรแกรมในส่วนของ Visual Basic

เนื่องจากในตัวอย่างนี้เป็นการรับข้อมูลเพียงอย่างเดียวจึงค่อนข้างยากในการรับข้อมูลหลายๆชุดแบบต่อเนื่อง
ต่างจากการเขียนให้ รับ-ส่ง คือส่ง Command ออกไป แล้วรอรับกลับวิธีนี้กำหนดได้ชัดเจนว่าต้องการข้อมูลอะไร
ตัวอย่างนี้กำหนดให้โปรแกรมทำงานแบบ Event เมื่อมีข้อมูลเข้ามาให้เกิดการกระตุ้นให้ทำงาน
และ เก็บค่าที่เข้ามาไว้ใน ตัวแปร Array 0-8 ( data0-data8 ) แล้วตรวจสอบว่า ถ้าค่าใหนเป็นส่วนหัวของชุดข้อมูล( ตัวอย่างนี้เป็นค่าคงที่ -9999 )
ให้ไส่ใว้ในตัวแปรอาเรย์”0” หรือ Data(0) และตัวถัดไปให้ไส่ลงไปใน ตัวแปรอาเรย์ ตัวถัดไป ขั้นตอนนี้ เป็นกระบวนการ กรอง
หรือคัดแยกข้อมูลที่เข้ามาแบบต่อเนื่อง ให้เป็นระเบียบก่อนการนำไปแสดงค่าต่อไป จากนั้นวนรับข้อมูลจนครบ 9 ชุด (data(8))
แล้วนำค่าที่ได้มาแสดงผลบน TextBox ที่กำหนด
หลักการทำงานของโปรแกรมในส่วนของ C (CCS C)
ส่งค่าคงที่ -9999 ซึ่งกำหนดให้เป็นส่วนหัวของชุดข้อมูล ออกไปอ่าน A/D จาก Channel 0-7 แล้วส่งค่าออก วนรอบการทำงาน
มีข้อควรระวังอยู่ว่าเนื่องจากเป็นการอ่าแบบ 8 Channel โปรแกรมนี้ควรต่อ VR10k ให้ครบทุก Channel หากช่องได้ไม่ได้ต่อ
ก็จะแสดงค่าออกมาแต่ค่าจะไม่เป็น “0”
มาเริ่มกันเลยครับ
เริ่มต้นโดยเปิดโปรเจคขึ้นมานะครับ ผมเลือกเป็น VB Enterprise Edition Controls ครับ
เครื่องมือเยอะดีครับ

เมื่อเลือกเสร็จแล้วหน้าตาจะเป็นแบบนี้ ให้ดับเบิ้ลคลิ๊กที่ Project (วงกลมสีแดง) แล้วคลิ๊กที่ Form1

หน้าตาก็จะออกมาดังนี้
เสร็จแล้วให้เลือก Mscomm จากทูลบาร์ เข้ามาวางในฟอร์ม โดย Mscomm เป็น คอนโทรล ที่เป็นตัว
จัดการการสื่อสารผ่าน พอร์ต RS-232 ซึ่งเป็นส่วนสำคัญทีขาดไม่ได้ในโปรเจคนี้

จากนั้นให้ลาก TextBox เข้ามาในฟอร์ม แล้ว เปลี่ยนค่า ของ TextBox ในหน้าต่าง Properties ดังนี้
Borderstyle = Fixed Single
Font = size 18
Forecolor = เลือกสีอักษรตามใจชอบ

จากนั้นให้คลิ๊กขวาที่ TextBox แล้วเลือก Copy แล้วคลิ๊กขวาที่ฟอร์ม แล้วเลือก Paste
จากนั้นจะมีป๊อบอัพขึ้นมาถาม ให้เลือก No ทำแบบนี้ซ้ำ จนได้ TextBox 8 รูป ดังภาพ
หลังจากนั้นให้คลิ๊กที่ TextBox อันแรก แล้วไปที่หน้าต่าง Properties ในช่อง Name ให้เปลี่ยนชื่อเป็น
Aray1 และ Aray2 ไปจนจนถึง Aray8
( หากต้องการเปลี่ยนอักษรที่โชว์บนTextBoxให้เปลี่ยนตรง Text )

เท่านี้ก็สำเร็จไปอีกขั้นนึงแล้วและต่อไปเป็นขั้นตอนที่ขาดไม่ได้นั่นก็คือ
การเขียนโค๊ตคำสั่ง เรามาเริ่มกันเลย ให้ดับเบิ้ลคลิ๊กที่ฟอร์มนะครับแล้วเขียนค่าดังนี้
หรือ Download ตัวอย่างได้จาก ตรงนี้ นะครับ


Option Explicit
Dim data(0 To 8) As String
Dim i As Byte

Private Sub Form_Load()
MSComm1.CommPort = 1
MSComm1.InBufferSize = 1024
MSComm1.OutBufferSize = 512
MSComm1.RThreshold = 1
MSComm1.Settings = "9600,n,8,1"
MSComm1.PortOpen = True
End Sub
Private Sub MSComm1_OnComm()
On Error Resume Next
i = i + 1
If MSComm1.CommEvent = comEvReceive Then
data(i) = MSComm1.Input
End If
If data(i) = -9999 Then
i = 0
End If
If i = 8 Then
Aray1.Text = data(1)
Aray2.Text = data(2)
Aray3.Text = data(3)
Aray4.Text = data(4)
Aray5.Text = data(5)
Aray6.Text = data(6)
Aray7.Text = data(7)
Aray8.Text = data(8)
i = -1
End If
ProgressBar1.Value = i
End Sub
สำหรับตัวอย่างการส่งข้อมูล ของ ไมโครคอนโทรลเลอร์ PIC18F458 อยู่ด้านล่างครับ
/******************************************************************************
* File : Analog To Digital.c
*****************************************************************************/
#include <18f458.h> // Standard Header file for the PIC18F458 device
#define TxD PIN_C6 // Define Transmitted Data
#define RxD PIN_C7 // Define Received Data
#define CLOCK_SP 10000000 // Clock Speed(Hz)
// Device Specification
#fuses HS // Oscillator mode HS
#fuses NOLVP, NOWDT // No Low Voltage Program, No Watchdog timer
#fuses NOPROTECT // Code no protection
#device ADC=10 // ADC 10 Bit (1111111111=1,023)
#use delay (clock=CLOCK_SP) // Use built-in function: delay_ms() & delay_us()
#use rs232(baud=9600, xmit=TxD,rcv=RxD) // Use serial I/O port (RS232)
#use fast_io(A) // programming of the direction register.
/***********************************************************************
* Constants
***********************************************************************/
#define Vbe 0.0048875855327468230694037145650049 // Vref/1023 (5/1023)
/***********************************************************************
* FUNCTION: main
***********************************************************************/
void main(void) {
int16 value;
float volt;
int8 Point;
setup_port_a(ALL_ANALOG); // A0 A1 A2 A3 A5 E0 E1 E2 Ref=Vdd
setup_adc(ADC_CLOCK_INTERNAL); // Clock RC

do {
Point=Point+1;
if(Point>7){
Point=0;
printf("nr-9999");
Delay_ms(1000);
}

set_adc_channel(Point); // Read Analog input RA0(channel=0-7)
delay_us(10);
value = Read_ADC();
delay_us(10);
volt = Vbe * (float) value;
printf("nr%f",volt);
delay_ms(1000);
} while (TRUE);
}
สำหรับบอร์อดที่ใช้ในตัวอย่างนี้เป็นบอร์ด CP-PIC V3 ของ ETT

โดยต่อ ต่อ VR10 k ที่พิน A0, A1, A2, A3, A5 ,E0, E1, E2
โดยต่อกับทุก Channel ในลักษณะแบบนี้นะครับ

เมื่อต่อสาย RS-232 ของ บอร์ดไมโครคอนโทรลเลอร์ ไปที่RS-232 ของคอมพิวเตอร์แล้ว เมื่อรันโปรแกรมแล้ว หน้าตาก็จะออกมาดังนี้

ตัวอย่างการประยุกค์ใช้งาน

หวังเป็นอย่างยิ่งว่าบทความนี้จะเป็นประโยชน์สำหรับผู้ที่สนใจ ที่จะเอาไปศึกษาพัฒนาต่อไปนะครับ
หากมีเวลาว่าจากการทำงาน คราวหน้าจะเขียนตัวอย่างการสื่อสาร แบบ RS-485 ด้วย Visual Basic กับไมโครคอนโทรลเลอร์ครับ
โดย : Calman