Download as pdf or txt
Download as pdf or txt
You are on page 1of 67

HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

MỤC LỤC
1. Mô phỏng giao tiếp và điều khiển thiết bị qua cổng COM ....................................................................... 3
1.1. Giao tiếp và điều khiển thiết bị qua COM giữa máy tính và vi điều khiển PIC18F4550 ...................... 3
1.1.1. Phân tích ví dụ minh họa ......................................................................................................... 3
1.1.2. Sơ đồ mô phỏng ...................................................................................................................... 4
1.1.3. Giải thuật và mã nguồn của chương trình điều khiển ............................................................... 5
1.1.3.1. Giải thuật............................................................................................................................. 5
1.1.3.2. Mã nguồn ............................................................................................................................ 6
1.1.4. Các bước mô phỏng............................................................................................................... 10
1.1.4.1. Bước 1 – Viết và biên dịch mã nguồn cho vi điều khiển PIC18F4550 trên phần mềm mikroC
10
1.1.4.2. Bước 2 – Vẽ mạch mô phỏng cho hệ thống trên phần mềm mô phỏng Protues ................. 16
1.1.4.3. Bước 3 – Nạp chương trình cho vi điều khiển PIC18F4550 trên phần mềm mô phỏng
Protues 16
1.1.4.4. Bước 4 – Sử dụng công cụ giả lập giao diện điều khiển thiết bị thông qua cổng COM trên
máy tính – SerialPort Terminal .............................................................................................................. 18
1.1.4.5. Bước 5 – Tạo mô phỏng kết nối giữa giao diện điều trên máy tính và hệ thống điều khiển
ngoại vi thông qua cổng COM dùng PIC18F4550 ................................................................................... 19
1.1.4.6. Bước 6 – Tiến hành mô phỏng điều khiển thiết bị .............................................................. 20
1.2. Giao tiếp và điều khiển thiết bị qua COM giữa máy tính và mạch Arduino Mega 2560 ................... 23
1.2.1. Phân tích ví dụ minh họa ....................................................................................................... 23
1.2.2. Sơ đồ mô phỏng .................................................................................................................... 23
1.2.3. Giải thuật và mã nguồn của chương trình điều khiển ............................................................. 23
1.2.3.1. Giải thuật........................................................................................................................... 24
1.2.3.2. Mã nguồn .......................................................................................................................... 25
1.2.4. Các bước mô phỏng............................................................................................................... 29
1.2.4.1. Bước 1 – Viết và biên dịch mã nguồn cho mạch Arduino Mega 2560 trên phần mềm Arduino
29
1.2.4.2. Bước 2 – Vẽ mạch mô phỏng cho hệ thống trên phần mềm mô phỏng Protues ................. 34
1.2.4.3. Bước 3 – Nạp chương trình cho mạch Arduino trên phần mềm mô phỏng Protues ............ 34
1.2.4.4. Bước 4 – Sử dụng công cụ giả lập giao diện điều khiển thiết bị thông qua cổng COM trên
máy tính – SerialPort Terminal .............................................................................................................. 36
1.2.4.5. Bước 5 – Tạo mô phỏng kết nối giữa giao diện điều trên máy tính và hệ thống điều khiển
ngoại vi thông qua cổng COM dùng mạch Arduino ................................................................................ 37
1.2.4.6. Bước 6 – Tiến hành mô phỏng điều khiển thiết bị .............................................................. 37
Giảng viên: Phạm Quang Trí Communication and Control for
Computer Peripheral Devices 1
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

1.3. Giao diện điều khiển trên máy tính ............................................................................................... 37


1.3.1. Tạo Project mới trong Visual Studio C# 2012 ......................................................................... 37
1.3.2. Phân tích ví dụ minh họa ....................................................................................................... 42
1.3.3. Xây dựng giao diện điều khiển thiết bị ngoại vi thông qua cổng COM trên máy tính............... 43
1.3.4. Giải thuật và mã nguồn của giao diện điều khiển ................................................................... 53
1.3.4.1. Giải thuật........................................................................................................................... 53
1.3.4.2. Mã nguồn .......................................................................................................................... 55
1.3.5. Vận hành giao diện điều khiển đã tạo ra ................................................................................ 66

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 2
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

1. Mô phỏng giao tiếp và điều khiển thiết bị qua cổng COM

SW1
MAX232 SW2
SW3

LED1
PIC18F4550 LED2
LED3
hoặc

Arduino
Mega 2560

Software Firmware Hardware

Hình 1. Minh họa tổng quan hệ thống giao tiếp và điều khiển thiết bị qua cổng COM.
1.1. Giao tiếp và điều khiển thiết bị qua COM giữa máy tính và vi điều khiển
PIC18F4550
1.1.1. Phân tích ví dụ minh họa
Trong ví dụ tham khảo này, chúng ta sẽ mô phỏng việc sử dụng một máy tính
(PC) có tích hợp cổng COM (RS232) để điều khiển thiết bị ngoại vi (LED và nút
nhấn) dùng bộ điều khiển là vi điều khiển PIC18F4550 thông qua truyền thông UART.
Ban đầu khi mới được cấp nguồn thì vi điều khiển PIC18F4550 sẽ điều khiển
làm cho LED tắt. Các hoạt động tiếp theo sẽ như sau:
 Nếu PIC18F4550 nhận được từ cổng COM chuỗi ký tự có định dạng là
“@le_on&” thì nó sẽ điều khiển LED sáng và đồng thời sau đó nó sẽ
truyền trở lại cổng COM chuỗi dữ liệu có định dạng là “@Lle_on&”.
 Nếu PIC18F4550 nhận được từ cổng COM chuỗi ký tự có định dạng là
“@le_of&” thì nó sẽ điều khiển LED tắt và đồng thời sau đó nó sẽ truyền
trở lại cổng COM chuỗi dữ liệu có định dạng là “@Lle_of&”.
Trong đó:
o Ký tự “@” là ký tự dùng để xác nhận bắt đầu chuỗi dữ liệu.

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 3
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

o Ký tự “&” là ký tự dùng để xác nhận kết thúc chuỗi dữ liệu.


o Chuỗi “le_on” và “le_of” là chuỗi tương ứng dùng để xác nhận
điều khiển LED sáng và tắt. Chuỗi này chỉ cho phép dài tối đa 9 ký
tự và miễn sao có chứa đúng nội dung được qui định như trên thì
LED sẽ được điều khiển tương ứng, ngược lại thì LED sẽ không bị
tác động và PIC18F4550 sẽ truyền trở lại cổng COM chuỗi dữ liệu
có định dạng là “@Error&”.
 Khi nhấn-nhả nút SW thì PIC18F4550 sẽ truyền ra cổng COM chuỗi dữ
liệu có định dạng là “@S…&”. Trong đó tại vị trí dấu “…” sẽ chính là số
lần nhấn-nhả nút SW, giả sử nút nhấn SW được nhấn-nhả 12 lần thì chuỗi
dữ liệu truyền ra cổng COM có định dạng là “@S12&”.
1.1.2. Sơ đồ mô phỏng
RXD

TXD

RTS

CTS

SELECT P1
RX
1
DCD
6
DSR
2
RXD
TX 7
RTS
3
TXD
SELECT 8
U1 CTS
4
DTR
2 15 9
RA0/AN0 RC0/T1OSO/T1CKI RI
3 16
RA1/AN1 RC1/T1OSI/CCP2/UOE
C7 Y1 4
RA2/AN2/VREF-/CVREF RC2/CCP1/P1A
17
20MHz 5 23
RA3/AN3/VREF+ RC4/D-/VM ERROR
OSC2 6 24
RA4/T0CKI/C1OUT/RCV RC5/D+/VP
7 25 TX COMPIM
RA5/AN4/SS/LVDIN/C2OUT RC6/TX/CK
22pF OSC2 14 26 RX
RA6/OSC2/CLKO RC7/RX/DT/SDO
OSC1 13
OSC1/CLKI
RE1
R3
C6 RB0 33 19 LED
RB0/AN12/INT0/FLT0/SDI/SDA RD0/SPP0 330
OSC1 34 20
RB1/AN10/INT1/SCK/SCL RD1/SPP1
35 21
RB2/AN8/INT2/VMO RD2/SPP2 +5V
22pF 36 22
RB3/AN9/CCP2/VPO RD3/SPP3
37 27
RB4/AN11/KBI0/CSSPP RD4/SPP4
38 28
+5V RB5/KBI1/PGM RD5/SPP5/P1B
39 29
RB6/KBI2/PGC RD6/SPP6/P1C
40 30
RB7/KBI3/PGD RD7/SPP7/P1D
R2
8 10K
RE0/AN5/CK1SPP
9 RE1
RE1/AN6/CK2SPP
R1 RE2/AN7/OESPP
10
18 1 MCLR MCLR
10K VUSB RE3/MCLR/VPP
PIC18F4550
RB0 C1 C10 RESET
220nF V I D U M I N H H OA GI A O T I EP QU A COM 0.1uF

SW T H I ET K E: PH A M QU A N G T R I

Hình 2. Sơ đồ mô phỏng giao tiếp cổng COM với PIC18F4550.

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 4
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

Cần lưu ý rằng Hình 2 chỉ là sơ đồ dùng cho việc mô phỏng hay còn được hiểu
là sơ đồ nguyên lý rút gọn và chưa đầy đủ, điều đó có nghĩa là với thiết kế rút gọn như
sơ đồ này thì không thể “chạy” được ngoài thực tế.
1.1.3. Giải thuật và mã nguồn của chương trình điều khiển
Công việc tiếp theo là chúng ta thực hiện việc viết chương trình điều khiển để
cho phép giao tiếp giữa thiết bị ngoại vi dùng vi điều khiển PIC và máy tính. Ở bài
hướng dẫn này chúng ta sẽ sử dụng phần mềm mikroC PRO for PIC để viết mã nguồn
của chương trình điều khiển làm một ví dụ đơn giản, bật/tắt một đèn LED trên thiết bị
từ giao diện điều khiển trên máy tính và hiển thị trên giao diện này số lần nhấn-nhả nút
trên thiết bị. Qua ví dụ này sẽ giúp chúng ta hiểu được việc giao tiếp và điều khiển
thiết bị qua COM giữa máy tính và vi điều khiển PIC.
Giải thuật và mã nguồn của chương trình điều khiển được viết trong phần mềm
mikroC PRO for PIC như sau:
1.1.3.1. Giải thuật
BEGIN
Main
Cấu hình các chân PIC
Digital I/O

Cấu hình Port


RB1: Ngõ vào
BEGIN
RE1: Ngõ ra + Tắt LED
Clear_buf_string_receive
Cấu hình các ngắt Xóa từng byte trong bộ đệm
EXT: Ngắt 0, cạnh lên chuỗi dữ liệu nhận
UART: Ngắt nhận
Chưa xóa Đ
Cấu hình UART hết bộ đệm
9600, 8N1
S
ENDMAIN ENDSUB

Xóa cờ báo ngắt ngoài


BEGIN
Interrupt Tăng biến đếm số
Sự kiện lần nhấn-nhả SW
Đ
A
ngắt ngoài 0?
Đóng gói định dạng
S dữ liệu “@S…&”
Sự kiện Đ
ngắt UART (nhận)?
B Gửi gói dữ liệu qua
UART
S C
ENDISR C

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 5
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

Xóa cờ báo ngắt UART

Đọc byte dữ liệu


nhận được từ UART

Lưu byte nhận vào bộ đệm


Đ Xóa bộ đếm thứ tự Lưu byte nhận vào bộ
Byte nhận là ký tự bắt đầu? chuỗi dữ liệu nhận theo
ký tự đã nhận đệm ký tự bắt đầu
thứ tự ký tự đã nhận
S
Lưu byte nhận vào bộ
Đ Lưu byte nhận vào bộ
Byte nhận là ký tự kết thúc? đệm chuỗi dữ liệu nhận
đệm ký tự kết thúc
theo thứ tự ký tự đã nhận
S
Đã nhận ký tự bắt Đ Xác nhận chuỗi dữ liệu Xóa bộ đếm thứ tự Xóa bộ đệm ký tự bắt
đầu và ký tự kết thúc? nhận ĐÚNG định dạng ký tự đã nhận đầu và ký tự kết thúc
S
Lưu byte nhận vào bộ
đệm chuỗi dữ liệu nhận
theo thứ tự ký tự đã nhận

Tăng giá trị bộ đếm


thứ tự ký tự đã nhận

Số lượng ký tự nhận Đ Xóa bộ đếm thứ tự


vượt quá qui định? ký tự đã nhận
S
Gửi gói dữ liệu phản
Chuỗi dữ liệu nhận Đ Dữ liệu nhận trùng Đ
đúng định dạng? mã điều khiển bật LED?
Điều khiển LED sáng hồi LED sáng qua
UART (@Lle_on&)
S S
Gửi gói dữ liệu phản
Dữ liệu nhận trùng Đ
mã điều khiển tắt LED?
Điều khiển LED tắt hồi LED tắt qua
UART (@Lle_of&)
S
Gửi gói dữ liệu phản hồi
không trùng mã điều khiển
qua UART (@Error&)

Xóa biến xác nhận định


dạng chuỗi dữ liệu

Xóa bộ đếm thứ tự


ký tự đã nhận

Xóa bộ đệm chuỗi


dữ liệu nhận

1.1.3.2. Mã nguồn
 Các thư viện của phần mềm mikroC PRO for PIC được sử dụng trong
chương trình: UART, Button, C_String, C_Type, Sprintf.
 Các khai báo biến, hằng, ký hiệu:
#define led_on 1 // Muc logic dieu khien trang thai LED
#define led_off 0
#define max_count_ReceiveData 10 // Qui dinh so luong ky tu (du lieu) toi da trong chuoi
#define len_code 5
Giảng viên: Phạm Quang Trí Communication and Control for
Computer Peripheral Devices 6
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

// Qui dinh so ky tu cua ma nhan dang xac nhan ("le_on", "le_of": 5 ky tu)
char ReceiveData; // Chua byte du lieu nhan duoc
char buffer[15]; // Bo dem du lieu gui di
int count = 0; // Chua so lan nhan SW
bit oldstate; // Co bao trang thai cho SW
char led_on_code[] = "le_on"; // Ma nhan dang xac nhan dieu khien LED sang (chi 5 ky tu)
char led_off_code[] = "le_of"; // Ma nhan dang xac nhan dieu khien LED tat (chi 5 ky tu)
char start_sign = '@'; // Ma nhan dang xac nhan ky tu bat dau chuoi du lieu
char end_sign = '&'; // Ma nhan dang xac nhan ky tu ket thuc chuoi du lieu
char count_ReceiveData = 0; // Con tro, dem so byte du lieu nhan duoc
char buf_string_receive[max_count_ReceiveData]; // Chua du lieu nhan duoc o dang chuoi
char start_Data, end_Data; // Chua du lieu bat dau va ket thuc chuoi du lieu
char receive_complete = 0; // Co bao hoan thanh nhan du lieu (0: Chua, 1: Xong)

 Đoạn chương trình con xóa nội dung bộ đệm nhận dữ liệu:
void Clear_buf_string_receive(void)
{
// Khai bao
unsigned char i;
// Chuong trinh
for (i=0;i<=max_count_ReceiveData;i++)
{
buf_string_receive[i] = '\0'; // Xoa tung byte trong chuoi
}
}

 Đoạn chương trình con phục vụ ngắt (ngắt ngoài và ngắt UART):
void interrupt(void)
{
if(INTCON.INT0IF == 1)
{
INTCON.INT0IF = 0; // Clear interrupt bit
count++; // Tang bien dem
//----------------------------------
sprintf(buffer,"@S%d&",count); // Gui du lieu co nhan dang ky tu bat dau (@)
UART1_Write_Text(buffer); // va va ky tu ket thuc (&) cua chuoi du lieu (@.........&)
//----------------------------------
//UART1_Write(count); // Gui du lieu khong co nhan dang (chi truyen du lieu)
//----------------------------------
}
else if(PIR1.RCIF == 1)
{
PIR1.RCIF = 0; // Clear interrupt bit
ReceiveData = UART1_Read(); // Doc du lieu tu UART
//----------- Xu ly luu tru chuoi du lieu nhan
if (ReceiveData == start_sign) // Byte nhan duoc la ky hieu bat dau chuoi du lieu

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 7
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

{
count_ReceiveData = 0; // Xoa bo dem
start_Data = ReceiveData; // Luu ky hieu bat dau chuoi du lieu
buf_string_receive[count_ReceiveData] = ReceiveData;
}
if (ReceiveData == end_sign) // Byte nhan duoc la ky hieu ket thuc chuoi du lieu
{
end_Data = ReceiveData; // Luu ky hieu ket thuc chuoi du lieu
buf_string_receive[count_ReceiveData] = ReceiveData;
}
if ((start_Data == start_sign) && (end_Data == end_sign))
// Xac nhan hoan thanh nhan day du 1 chuoi du lieu
{
receive_complete = 1; // Thong bao da nhan dung dinh dang chuoi du lieu
count_ReceiveData = 0; // Xoa bo dem
start_Data = '\0'; // Xoa bo dem ky hieu bat dau chuoi du lieu
end_Data = '\0'; // Xoa bo dem ky hieu ket thuc chuoi du lieu
}
else // Xac nhan byte du lieu nhan la cac ky tu trong chuoi (chua ket thuc chuoi)
{
buf_string_receive[count_ReceiveData] = ReceiveData;
count_ReceiveData++;
if (count_ReceiveData > max_count_ReceiveData)
{
count_ReceiveData = 0; // Xoa bo dem
}
}
//----------- Xu ly so sanh, dieu khien va gui phan hoi
if (receive_complete == 1) // Xu ly khi hoan tat doc 1 chuoi du lieu
{
if (strncmp(strstr(buf_string_receive,led_on_code),led_on_code,len_code) == 0)
// So sanh chuoi du lieu nhan duoc de dieu khien LED
{
LATE.LATE1 = led_on; // Bat LED
//--------- Gui du lieu phan hoi
UART1_Write_Text("@Lle_on&"); // Gui du lieu co nhan dang ky tu bat dau (@)
// va va ky tu ket thuc (&) cua chuoi du lieu (@.........&)
//----------------------------------
}
else if (strncmp(strstr(buf_string_receive,led_off_code),led_off_code,len_code) == 0)
// So sanh chuoi du lieu nhan duoc de dieu khien LED
{
LATE.LATE1 = led_off; // Tat LED
//--------- Gui du lieu phan hoi
UART1_Write_Text("@Lle_of&"); // Gui du lieu co nhan dang ky tu bat dau (@)
// va va ky tu ket thuc (&) cua chuoi du lieu (@.........&)
Giảng viên: Phạm Quang Trí Communication and Control for
Computer Peripheral Devices 8
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

//----------------------------------
}
else
{
//--------- Gui du lieu phan hoi
UART1_Write_Text("@Error&"); // Gui du lieu co nhan dang ky tu bat dau (@)
// va va ky tu ket thuc (&) cua chuoi du lieu (@.........&)
//----------------------------------
}
receive_complete = 0; // Thong bao chua nhan dung chuoi dinh dang
count_ReceiveData = 0; // Xoa bo dem
Clear_buf_string_receive(); // Xoa chuoi
}
// -------------------------------------
}
}

 Đoạn chương trình chính:


void main()
{
// Khai bao
// Chuong trinh
ADCON1 |= 0x0F; // Tat ca chan Analog thanh chan Digital
CMCON |= 7; // Cam modul Comparators
// Cau hinh Port B
PORTB = 0x01; LATB = 0x01;
TRISB.TRISB0 = 1;
//INTCON2.RBPU = 0;
// Cau hinh Port E
PORTE = 0x00; LATE = 0x00;
TRISE.TRISE1 = 0;
// Cau hinh ngat
INTCON.INT0IF = 0; // Clear interrupt bit
INTCON.INT0IE = 1; // Enable external interrupts
INTCON2.INTEDG0 = 1; // External interrupt on rising edge
PIR1.RCIF = 0; // Clear interrupt bit
PIE1.RCIE = 1; // Enable the EUSART receive interrupt
INTCON.GIE = 1; // Enable global interrupt
INTCON.PEIE = 1; // Enable periphiral interrupts
// Cau hinh modul UART
// Mode: receiver enabled, transmitter enabled,
// frame size 8 bits, 1 STOP bit, parity mode disabled
// asynchronous operation
UART1_Init(9600); // Baud = 9600bps
delay_ms(100); // Doi de modul UART on dinh
while(1);

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 9
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

1.1.4. Các bước mô phỏng


1.1.4.1. Bước 1 – Viết và biên dịch mã nguồn cho vi điều khiển
PIC18F4550 trên phần mềm mikroC
Khởi động phần mềm mikroC PRO for PIC và tạo một Project mới cho chương
trình điều khiển PIC. Từ thanh menu lệnh ta thực hiện lệnh “File  New  New
Project…”, khi đó hộp thoại qui trình tạo ra một Project mới sẽ xuất hiện như minh
họa trong Hình 3. Trong hộp thoại này, ở bước 1 ta thực hiện chọn loại “Standard
Project” và nhấp chuột vào nút “Next” để tiếp tục.

Hình 3. Hộp thoại chọn loại Project.


Tiếp theo ở bước 2 như minh họa trong Hình 4, ta thực hiện điều chỉnh các
thông tin:
 Tên Project (Project Name): tùy chọn
 Thư mục lưu trữ Project (Project Folder): tùy chọn
 Tên vi điều khiển PIC (Device Name): P18F4550
 Tần số thạch anh (Device Clock): 20MHz
Đánh dấu chọn vào ô thiết lập các bit cấu hình “Open Edit Project window to
set Configuration bits” để mở cửa sổ hiệu chỉnh thông số cài đặt cho Project.

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 10
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

Hình 4. Hộp thoại cài đặt cấu hình Project.


Sau khi hiệu chỉnh các thông tin xong ta nhấp chuột vào nút “Next” để tiếp tục.
Tiếp theo ở bước 3, hộp thoại bổ sung tập tin vào Project xuất hiện như minh họa
trong Hình 5, ta bỏ qua hộp thoại này và nhấp chuột vào nút “Next” để tiếp tục.

Hình 5. Hộp thoại bổ sung tập tin vào Project.


Tiếp theo ở bước 4, hộp thoại bổ sung các thư viện cần sử dụng vào trong
Project sẽ xuất hiện như minh họa trong Hình 6. Trong mục “Include Libraries” ta
chọn “Include None (Advanced)” nhằm mục đích sẽ chỉ chọn những thư viện cần
thiết để bổ sung vào Project mà thôi. Việc bổ sung thư viện sẽ được thực hiện trong
các thao tác tiếp theo.

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 11
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

Hình 6. Hộp thoại bổ sung thư viện vào Project.


Nhấp chuột vào nút “Finish” để kết thúc công đoạn tạo mới Project và chuyển
sang công đoạn cài đặt cấu hình cho Project. Khi đó trên màn hình sẽ xuất hộp thoại
“Edit Project”, trong hộp thoại này ta chú ý phải chọn thật chính xác các mục được
đánh dấu khoanh tròn màu đỏ như minh họa trong Hình 7 và Hình 8. Sau khi đã hoàn
chỉnh việc cài đặt cấu hình cho Project ta nhấp chuột vào nút “OK”.

Hình 7. Hộp thoại cài đặt cấu hình cho Project (chế độ HS).

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 12
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

Hình 8. Hộp thoại cài đặt cấu hình cho Project (chế độ HS).
Tiếp theo ta chọn các thư viện UART, Button, C_String, C_Type, Sprintf (đã
được liệt kê trong mục 1.1.3.2) để nhúng vào trong mã nguồn của chương trình điều
khiển. Việc này được thực hiện bằng cách chọn tab “Library Manager”, sau đó tìm
và đánh dấu chọn vào mục UART, Button, C_String, C_Type, Sprintf để chọn các thư
viện này. Xem minh họa trong Hình 9.

Hình 9. Minh họa chọn các thư viện để nhúng vào trong mã nguồn.
Giảng viên: Phạm Quang Trí Communication and Control for
Computer Peripheral Devices 13
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

Đến đây là việc tạo Project đã hoàn tất, tiếp theo ta thực hiện việc viết mã
nguồn của chương trình điều khiển vào trong màn hình soạn thảo. Tham khảo phần mã
nguồn chương trình điều khiển “MyProject.c” đã được trình bày trong mục 1.1.3.2
bên trên để viết mã nguồn. Sau khi viết xong mã nguồn của chương trình chính vào
trong màn hình soạn thảo thì ta tiến hành lưu tập tin này vào trong máy tính bằng cách
từ thanh menu lệnh chọn “File  Save As…”. Trong hộp thoại “Save As” hiện trên
màn hình, ta chọn nơi lưu trữ tập tin, đặt tên tập tin và nhấp chuột vào nút “Save” để
lưu tập tin vào máy tính.
Phần mã nguồn của chương trình điều khiển coi như đã xong như được minh
họa trong Hình 10 bên dưới.

Hình 10. Minh họa màn hình soạn thảo chương trình điều khiển “MyProject.c”.
Tiếp theo ta thực hiện biên dịch và kiểm tra lỗi cú pháp của chương trình điều

khiển bằng cách nhấp chuột vào biểu tượng “Build” trên thanh công cụ của màn
hình soạn thảo. Việc biên dịch và kiểm tra lỗi cú pháp của chương trình điều khiển
được xem là thành công khi trong cửa sổ “Message” xuất hiện dòng chữ có nội dung
“Finished successfully”. Hình 11 bên dưới minh họa việc biên dịch thành công
chương trình điều khiển (firmware).

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 14
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

Hình 11. Minh họa việc biên dịch thành công chương trình điều khiển (firmware).
Lúc này phần mềm mikroC sẽ tạo ra tập tin mã HEX (firmware) và lưu trữ tập
tin này trong cùng thư mục với Project đang thực hiện, xem minh họa trong Hình 12.

Hình 12. Tập tin mã HEX (firmware) của chương trình sau khi biên dịch thành công.

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 15
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

1.1.4.2. Bước 2 – Vẽ mạch mô phỏng cho hệ thống trên phần mềm mô


phỏng Protues
Khởi động phần mềm Protues và tiến hành vẽ sơ đồ mạch mô phỏng của hệ
thống điều khiển ngoại vi thông qua cổng COM như trong Hình 2.
1.1.4.3. Bước 3 – Nạp chương trình cho vi điều khiển PIC18F4550 trên
phần mềm mô phỏng Protues
Để nạp chương trình điều khiển cho PIC18F4550 trong mạch mô phỏng ta nhấp
đúp chuột vào vi mạch PIC18F4550 trong sơ đồ. Trên màn hình xuất hiện hộp thoại
“Edit Component” như Hình 13 bên dưới.

Hình 13. Hộp thoại hiệu chỉnh thông số làm việc cho PIC18F4550.
Trong hộp thoại “Edit Component”, để đảm bảo tính chính xác về mặt thời
gian, tốc độ điều khiển trong khi chạy mô phỏng trên máy tính thì ta cần chọn chính
xác tần số xung clock cấp cho vi điều khiển trong mục “Processor Clock
Frequency”, trong trường hợp ví dụ này ta nhập vào 20MHz như minh họa trong
Hình 13 bên trên. Ngoài ra, cũng trong hộp thoại “Edit Component” này ở mục
“Program File” ta sẽ phải chỉ đường dẫn đến nơi lưu trữ tập tin chương trình điều
khiển được tạo ra ở Bước 1 và chọn tập tin này, sau đó nhấp chuột vào nút “Open”
trong hộp thoại “Select File Name” để chọn nó như minh họa trong Hình 14 và kết

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 16
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

thúc việc nạp chương trình điều khiển cho PIC18F4550 bằng cách nhấp chuột vào nút
“OK” trong hộp thoại “Edit Component”.

Hình 14. Hộp thoại chọn tập tin chương trình điều khiển cho PIC18F4550.
Sau khi đã chọn tập tin chương trình điều khiển cho PIC18F4550 thì ta tiến
hành thiết lập thông số hoạt động cho cổng COM mô phỏng trên phần mềm Protues.
Tiến hành việc này bằng cách nhấp đúp chuột vào cổng COM mô phỏng trong sơ đồ
để mở hộp thoại “Edit Component” như Hình 15 bên dưới.

Hình 15. Hộp thoại hiệu chỉnh thông số hoạt động cho cổng COM mô phỏng.
Trong hộp thoại này ta cần hiệu chỉnh chính xác các thông số như sau:
Giảng viên: Phạm Quang Trí Communication and Control for
Computer Peripheral Devices 17
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

o Tên cổng COM (Physical Port): COM1


o Tốc độ truyền dữ liệu (Physical/Virtual Baud Rate): 9600
o Số bit dữ liệu (Physical/Virtual Data Bits): 8
o Bit kiểm tra (Physical/Virtual Parity): NONE
o Số bit dừng (Physical/Virtual Stop Bits): 1
Sau khi đã hiệu chỉnh chính xác các thông số này thì ta sẽ kết thúc bằng cách
nhấp chuột vào nút “OK” trong hộp thoại “Edit Component”.
1.1.4.4. Bước 4 – Sử dụng công cụ giả lập giao diện điều khiển thiết bị
thông qua cổng COM trên máy tính – SerialPort Terminal
Do thời điểm này ta chưa học cách tạo giao diện điều khiển trên máy tính nên ta
cần phải tạm thời sử dụng một giao diện có sẵn để giả lập môi trường tác động điều
khiển từ máy tính thông qua cổng COM. Để giả lập giao diện điều khiển trên máy tính
ta sử dụng các phần mềm Terminal dùng cho cổng COM, trong bài này sẽ giới thiệu
cách thức sử dụng phần mềm SerialPort Terminal để làm việc này. Khởi động phần
mềm SerialPort Terminal và hiệu chỉnh chính xác các thông số như sau:
o Tên cổng COM (COM Port): COM2
o Tốc độ truyền dữ liệu (Baud Rate): 9600
o Số bit dữ liệu (Data Bits): 8
o Bit kiểm tra (Parity): None
o Số bit dừng (Stop Bits): One

Hình 16. Giao diện điều khiển của phần mềm SerialPort Terminal.
Giảng viên: Phạm Quang Trí Communication and Control for
Computer Peripheral Devices 18
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

1.1.4.5. Bước 5 – Tạo mô phỏng kết nối giữa giao diện điều trên máy
tính và hệ thống điều khiển ngoại vi thông qua cổng COM dùng
PIC18F4550
Khởi động phần mềm “Virtual Serial Port Driver” và thực hiện việc cấu hình
chế độ hoạt động của phần mềm để tạo ra sự kết nối mô phỏng giữa giao diện điều
khiển trên máy tính (đại diện là phần mềm SerialPort Terminal) và hệ thống điều
khiển ngoại vi thông qua cổng COM dùng PIC18F4550 (đại diện là phần mềm
Protues). Như bước thao tác trên đã trình bày thì phía giao diện điều khiển trên máy
tính sẽ được đại diện là COM2 và phía hệ thống điều khiển ngoại vi thông qua cổng
COM dùng PIC18F4550 sẽ được đại diện là COM1.

Hình 17. Giao diện phần mềm Virtual Serial Port Driver.
Trong thẻ “Manage Ports” trên giao diện của phần mềm ta chọn COM1 cho
mục “First Port” và COM2 cho mục “Second Port”, sau đó nhấp chuột vào nút
“Add Pair” để thực hiện việc kết nối cổng. Khi đó tại phần cửa sổ phía bên trái giao
diện của phần mềm sẽ xuất hiện biểu tượng minh họa cho việc cổng COM1 và COM2
đã được kết nối với nhau.

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 19
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

Hình 18. Minh họa kết nối giữa COM1 và COM2.


Tại thời điểm này việc truyền dữ liệu chưa bắt đầu nên cổng COM sẽ chưa được
mở, cho nên tại phần cửa sổ phía bên trái giao diện của phần mềm “Virtual Serial Port
Driver” sẽ hiển thị thông tin như minh họa trong Hình 19 dưới đây.

Hình 19. Các cổng COM chưa được mở.


1.1.4.6. Bước 6 – Tiến hành mô phỏng điều khiển thiết bị
Để bắt đầu quá trình mô phỏng, đầu tiên ta cần phải kích hoạt giao diện điều
khiển trên máy tính. Việc này được thực hiện bằng cách nhấp chuột vào nút “Open
Port” trên phần mềm SerialPort Terminal.
Tiếp theo ta kích hoạt mô phỏng hệ thống điều khiển ngoại vi thông qua cổng
COM dùng PIC18F4550, việc này được thực hiện bằng cách nhấp chuột vào nút “Run
Simulation” trên phần mềm Protues.
Giảng viên: Phạm Quang Trí Communication and Control for
Computer Peripheral Devices 20
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

Tiến hành việc gửi dữ liệu từ máy tính (giao diện điều khiển) sang thiết bị ngoại
vi (PIC18F4550) như sau:
 Nhập chuỗi ký tự “@le_on&” vào ô “Send Data” và nhấp chuột vào nút
“Send” trên cửa sổ phần mềm SerialPort Terminal. Quan sát bên cửa sổ
phần mềm Protues ta nhận thấy LED sáng và quan sát bên cửa sổ phần
mềm SerialPort Terminal ta nhận thấy chuỗi dữ liệu phản hồi trở lại là
“@Lle_on&”, xem minh họa trong Hình 20.
 Nhập chuỗi ký tự “@le_of&” vào ô “Send Data” và nhấp chuột vào nút
“Send” trên cửa sổ phần mềm SerialPort Terminal. Quan sát bên cửa sổ
phần mềm Protues ta nhận thấy LED tắt và quan sát bên cửa sổ phần
mềm SerialPort Terminal ta nhận thấy chuỗi dữ liệu phản hồi trở lại là
“@Lle_of&”.

Hình 20. Minh họa truyền từ máy tính chuỗi ký tự “@le_on&”.


Tiến hành việc gửi dữ liệu từ thiết bị ngoại vi (PIC18F4550) sang máy tính
(giao diện điều khiển) như sau:

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 21
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

 Nhấn-nhả nút SW lần đầu tiên trên cửa sổ phần mềm Protues. Quan sát
bên cửa sổ phần mềm SerialPort Terminal ta nhận thấy nhận được chuỗi
dữ liệu “@S1&”, xem minh họa trong Hình 21.
 Nhấn-nhả nút SW lần thứ hai trên cửa sổ phần mềm Protues. Quan sát
bên cửa sổ phần mềm SerialPort Terminal ta nhận thấy nhận được chuỗi
dữ liệu “@S2&”, tương tự như vậy cho các lần nhấn-nhả nút SW tiếp
theo.

Hình 21. Minh họa nhận từ thiết bị ngoại vi chuỗi dữ liệu “@S1&”.
Quan sát trên cửa sổ phần mềm “Virtual Serial Port Driver”, ta nhận thấy rằng
cả hai cổng COM (COM1 và COM2) đã được mở và đã có dữ liệu truyền qua cổng.

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 22
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

Hình 22. Minh họa cổng COM đã được mở và dữ liệu bắt đầu truyền qua COM.
1.2. Giao tiếp và điều khiển thiết bị qua COM giữa máy tính và mạch Arduino
Mega 2560
1.2.1. Phân tích ví dụ minh họa
Ví dụ minh họa trong phần này cũng tương tự như đã trình bày trong phần giao
tiếp và điều khiển thiết bị qua COM giữa máy tính và vi điều khiển PIC18F4550, xem
chi tiết trong mục “1.1.1. Phân tích ví dụ minh họa”.
1.2.2. Sơ đồ mô phỏng
Cần lưu ý rằng Hình 23 chỉ là sơ đồ dùng cho việc mô phỏng hay còn được hiểu
là sơ đồ nguyên lý rút gọn và chưa đầy đủ, điều đó có nghĩa là với thiết kế rút gọn như
sơ đồ này thì không thể “chạy” được ngoài thực tế.
1.2.3. Giải thuật và mã nguồn của chương trình điều khiển
Công việc tiếp theo là chúng ta thực hiện việc viết chương trình điều khiển để
cho phép giao tiếp giữa thiết bị ngoại vi dùng mạch Arduino và máy tính. Ở bài hướng
dẫn này chúng ta sẽ sử dụng phần mềm Arduino để viết mã nguồn của chương trình
điều khiển làm một ví dụ đơn giản, bật/tắt một đèn LED trên thiết bị từ giao diện điều
khiển trên máy tính và hiển thị trên giao diện này số lần nhấn-nhả nút trên thiết bị.
Qua ví dụ này sẽ giúp chúng ta hiểu được việc giao tiếp và điều khiển thiết bị qua
COM giữa máy tính và vi điều khiển PIC.

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 23
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

TERMINAL
TX_TER
RXD
RX_TER
TXD

RTS

CTS

P1 COMPUTER
+5V
1
VI DU MINH HOA GIAO TIEP QUA COM 6
DCD
DSR
RX 2
THIET KE: PHAM QUANG TRI 7
RXD
RTS
TX 3
TXD
R2 8
CTS
10K SIM1 4
DTR
SIMULINO MEGA 9
RI
RESET
ERROR
C10 www.arduino.cc
blogembarcado.blogspot.com
COMPIM
0.1uF AREF

13 LED LED
13
12 LED
R4
RESET 12
11
~11 330
10
5V ~10
9
~9
8
POWER

GND 8
ATMEGA2560
AT MEL

7
DIGITAL (PWM~)

7
A0 A0 6
~6
ANALOG IN

A1 5
A1 ~5
A2 4
ARDUINO

A2 4
A3 3
A3 ~3
A4 2 SW
A4 2
A5 1 TX_TER
A5 TX0 > 1
A6 0 RX_TER
SIMULINO MEGA

A6 RX0 < 0
A7 SW
A7
14 TX
COMMUNICATION

TX3 14
A8 15 RX
A8 RX3 15
A9 16
A9 16
A10
A10
TX2
RX2 17
17 SW
A11 18
A11 TX1 18
A12 19
A12 RX1 19
A13 20
A13 SDA 20
A14 21
A14 SCL 21
A15
A15
DIGITAL
52
50

48
46
44
42

40
38
36
34

32
30
28

26
24
22
53
51
49

47
45
43

41
39
37
35

33
31
29
27

25
23

Hình 23. Sơ đồ mô phỏng giao tiếp cổng COM với mạch Arduino.
Giải thuật và mã nguồn của chương trình điều khiển được viết trong phần mềm
Arduino như sau:
1.2.3.1. Giải thuật
BEGIN BEGIN BEGIN
Setup Loop Clear_buf_string_receive
Cấu hình chân Arduino ENDLOO P Xóa từng byte trong bộ đệm
Chân 2: Ngõ vào + Điện trở kéo chuỗi dữ liệu nhận
Chân 13: Ngõ ra + Tắt LED
BEGIN Chưa xóa Đ
Cấu hình các ngắt SW_ISR hết bộ đệm
EXT: Ngắt 0, cạnh lên
Tăng biến đếm số S
lần nhấn-nhả SW
Cấu hình Serial_3 ENDSUB
9600, 8N1
Đóng gói định dạng
dữ liệu “@S…&”
Xuất thông tin giới
thiệu ra Serial_0
Gửi gói dữ liệu qua
Serial_3 và Serial_0
ENDSETU P
ENDSW_ISR

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 24
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

BEGIN
serialEvent3
Đọc byte dữ liệu nhận
được từ Serial_3

Lưu byte nhận vào bộ đệm


Đ Xóa bộ đếm thứ tự Lưu byte nhận vào bộ
Byte nhận là ký tự bắt đầu? chuỗi dữ liệu nhận theo
ký tự đã nhận đệm ký tự bắt đầu
thứ tự ký tự đã nhận
S
Lưu byte nhận vào bộ
Đ Lưu byte nhận vào bộ
Byte nhận là ký tự kết thúc? đệm chuỗi dữ liệu nhận
đệm ký tự kết thúc
theo thứ tự ký tự đã nhận
S
Đã nhận ký tự bắt Đ Xác nhận chuỗi dữ liệu Xóa bộ đếm thứ tự Xóa bộ đệm ký tự bắt
đầu và ký tự kết thúc? nhận ĐÚNG định dạng ký tự đã nhận đầu và ký tự kết thúc
S
Lưu byte nhận vào bộ
đệm chuỗi dữ liệu nhận
theo thứ tự ký tự đã nhận

Tăng giá trị bộ đếm


thứ tự ký tự đã nhận

Số lượng ký tự nhận Đ Xóa bộ đếm thứ tự


vượt quá qui định? ký tự đã nhận
S
Gửi gói dữ liệu phản
Chuỗi dữ liệu nhận Đ Dữ liệu nhận trùng Đ
đúng định dạng? mã điều khiển bật LED?
Điều khiển LED sáng hồi LED sáng qua
Serial_3 (@Lle_on&)
S S
Gửi gói dữ liệu phản
Dữ liệu nhận trùng Đ
mã điều khiển tắt LED?
Điều khiển LED tắt hồi LED tắt qua
Serial_3 (@Lle_of&)
S
Gửi gói dữ liệu phản hồi
không trùng mã điều khiển
qua Serial_3 (@Error&)

Xóa biến xác nhận định


dạng chuỗi dữ liệu

Xóa bộ đếm thứ tự


ký tự đã nhận

Xóa bộ đệm chuỗi


dữ liệu nhận

ENDserialEvent3

1.2.3.2. Mã nguồn
 Các thư viện của phần mềm Arduino được sử dụng trong chương trình:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

 Các khai báo biến, hằng, ký hiệu:


// Khai bao ten cho cac chan Arduino
#define led_Pin 13 // Chan noi LED
#define sw_Pin 2 // Chan noi SW
// Khai bao bien va du lieu
Giảng viên: Phạm Quang Trí Communication and Control for
Computer Peripheral Devices 25
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

#define led_on HIGH // Muc logic dieu khien trang thai LED
#define led_off LOW
#define max_count_ReceiveData 10 // Qui dinh so luong ky tu (du lieu) toi da trong chuoi
#define len_code 5 // Qui dinh so ky tu cua ma nhan dang xac nhan
char ReceiveData; // Chua byte du lieu nhan duoc
int count = 0; // Chua so lan nhan SW
String buf_string_send = ""; // Chua du lieu gui di o dang chuoi
char led_on_code[] = "le_on"; // Ma nhan dang xac nhan dieu khien LED sang (chi 5 ky tu)
char led_off_code[] = "le_of"; // Ma nhan dang xac nhan dieu khien LED tat (chi 5 ky tu)
char start_sign = '@'; // Ma nhan dang xac nhan ky tu bat dau chuoi du lieu
char end_sign = '&'; // Ma nhan dang xac nhan ky tu ket thuc chuoi du lieu
char count_ReceiveData = 0; // Con tro, dem so byte du lieu nhan duoc
char buf_string_receive[max_count_ReceiveData]; // Chua du lieu nhan duoc o dang chuoi
char start_Data, end_Data; // Chua du lieu bat dau va ket thuc chuoi du lieu
char receive_complete = 0; // Co bao hoan thanh nhan du lieu (0: Chua, 1: Xong)

 Đoạn chương trình cấu hình:


void setup()
{
// Khoi tao cau hinh chan noi voi cac LED
pinMode(led_Pin, OUTPUT);
digitalWrite(led_Pin, led_off); // Dieu khien LED = OFF
// Khoi tao cau hinh chan noi voi cac SW
pinMode(sw_Pin, INPUT_PULLUP); // configure as an input and enable the internal pull-up
// Cau hinh Serial Port
Serial3.begin(9600,SERIAL_8N1); // Data = 8, Parity = None, Stop = 1
// Cau hinh ngat
attachInterrupt(0, SW_ISR, RISING);
// Cau hinh Serial Port giao tiep Terminal kiem tra hoat dong
Serial.begin(9600); // Cong UART giao tiep Terminal (PC)
Serial.println("Setup Terminal Baudrate = 9600");
Serial.println("Connection for Arduino Mega:");
Serial.println(" Device Arduino Mega");
Serial.println(" 15 - [GND] MAX232 GND ");
Serial.println(" 11 - [RX] MAX232 14 - TX3 ");
Serial.println(" 12 - [TX] MAX232 15 - RX3 ");
Serial.println(" 1 - [ANODE] LED 13 - ");
Serial.println(" 2 - [CATHODE] LED GND ");
Serial.println(" 1 - [ANODE] SW 2 - ");
Serial.println(" 2 - [CATHODE] SW GND ");
Serial.println("-----------------------------------");
Serial.println("Active MAX232 Module ");
Serial.println("-----------------------------------");
Serial.println("Starting RS232 (COM)...");
}

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 26
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

 Đoạn chương trình chính:


void loop()
{}

 Đoạn chương trình con phục vụ ngắt ngoài:


void SW_ISR() // ISR cho nut nhan
{
count++; // Tang so lan nhan SW
//----------------------------------
buf_string_send = "@S" + String(count) + '&';
// Gui du lieu co nhan dang ky tu bat dau (@)
Serial3.print(buf_string_send);
// va va ky tu ket thuc (&) cua chuoi du lieu (@.........&)
//----------------------------------
//Serial3.write(count); // Gui du lieu khong co nhan dang (chi truyen du lieu)
//----------------------------------
Serial.println(buf_string_send); // Hien thi tren Serial Monitor
}

 Đoạn chương trình con phục vụ ngắt ngắt UART:


void serialEvent3() // ISR cho UART
{
ReceiveData = Serial3.read(); // Doc du lieu tu Serial Port
//----------- Xu ly luu tru chuoi du lieu nhan
if (ReceiveData == start_sign) // Byte nhan duoc la ky hieu bat dau chuoi du lieu
{
count_ReceiveData = 0; // Xoa bo dem
start_Data = ReceiveData; // Luu ky hieu bat dau chuoi du lieu
buf_string_receive[count_ReceiveData] = ReceiveData;
}
if (ReceiveData == end_sign) // Byte nhan duoc la ky hieu ket thuc chuoi du lieu
{
end_Data = ReceiveData; // Luu ky hieu ket thuc chuoi du lieu
buf_string_receive[count_ReceiveData] = ReceiveData;
}
if ((start_Data == start_sign) && (end_Data == end_sign))
// Xac nhan hoan thanh nhan day du 1 chuoi du lieu
{
receive_complete = 1; // Thong bao da nhan dung dinh dang chuoi du lieu
count_ReceiveData = 0; // Xoa bo dem
start_Data = NULL; // Xoa bo dem ky hieu bat dau chuoi du lieu
end_Data = NULL; // Xoa bo dem ky hieu ket thuc chuoi du lieu
}
else // Xac nhan byte du lieu nhan la cac ky tu trong chuoi (chua ket thuc chuoi)
{
buf_string_receive[count_ReceiveData] = ReceiveData;
Giảng viên: Phạm Quang Trí Communication and Control for
Computer Peripheral Devices 27
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

count_ReceiveData++;
if (count_ReceiveData > max_count_ReceiveData)
{
count_ReceiveData = 0; // Xoa bo dem
}
}
//----------- Xu ly so sanh, dieu khien va gui phan hoi
if (receive_complete == 1) // Xu ly khi hoan tat doc 1 chuoi du lieu
{
Serial.println(buf_string_receive); // Hien thi tren Serial Monitor
if (strncmp(strstr(buf_string_receive,led_on_code),led_on_code,len_code) == 0)
// So sanh chuoi du lieu nhan duoc de dieu khien LED
{
digitalWrite(led_Pin,led_on); // Bat LED
//--------- Gui du lieu phan hoi
Serial3.print("@Lle_on&"); // Gui du lieu co nhan dang ky tu bat dau (@)
// va va ky tu ket thuc (&) cua chuoi du lieu (@.........&)
//----------------------------------
}
else if (strncmp(strstr(buf_string_receive,led_off_code),led_off_code,len_code) == 0)
// So sanh chuoi du lieu nhan duoc de dieu khien LED
{
digitalWrite(led_Pin,led_off); // Tat LED
//--------- Gui du lieu phan hoi
Serial3.print("@Lle_of&"); // Gui du lieu co nhan dang ky tu bat dau (@)
// va va ky tu ket thuc (&) cua chuoi du lieu (@.........&)
//----------------------------------
}
else
{
//--------- Gui du lieu phan hoi
Serial3.print("@Error&"); // Gui du lieu co nhan dang ky tu bat dau (@)
// va va ky tu ket thuc (&) cua chuoi du lieu (@.........&)
//----------------------------------
}
receive_complete = 0; // Thong bao chua nhan dung chuoi dinh dang
count_ReceiveData = 0; // Xoa bo dem
Clear_buf_string_receive(); // Xoa chuoi
}
// -------------------------------------
}

 Đoạn chương trình con xóa nội dung bộ đệm nhận dữ liệu:
// Chuong trinh con xoa noi dung bo dem nhan du lieu
void Clear_buf_string_receive(void)
{

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 28
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

for (char i=0;i<=max_count_ReceiveData;i++)


{
buf_string_receive[i] = NULL;
}
}

1.2.4. Các bước mô phỏng


1.2.4.1. Bước 1 – Viết và biên dịch mã nguồn cho mạch Arduino Mega
2560 trên phần mềm Arduino
Khởi động phần mềm Arduino và tạo một Sketch mới cho chương trình điều
khiển Atmega2560. Trên màn hình soạn thảo của phần mềm Arduino có hai phân
vùng để nhập mã nguồn của chương trình điều khiển, phân vùng “void setup{…}” và
phân vùng “void loop{…}”. Trong phân vùng “void setup{…}”, ta sẽ nhập vào đoạn
mã nguồn thiết lập cấu hình hoạt động ban đầu cho mạch Arduino và các thiết bị ngoại
vi, lưu ý rằng đoạn mã nguồn trong phân vùng này chỉ được chạy một lần. Trong phân
vùng “void loop{…}”, ta sẽ nhập vào đoạn mã nguồn của chương trình điều khiển
chính, lưu ý rằng đoạn mã nguồn trong phân vùng này sau khi chạy hết đến lệnh cuối
cùng sẽ tự động quay trở về thực hiện lại lệnh đầu tiên trong phân vùng.

Hình 24. Cửa sổ soạn thảo chương trình điều khiển của phần mềm Arduino.
Đến đây là việc tạo Sketch đã hoàn tất, tiếp theo ta thực hiện việc viết mã nguồn
của chương trình điều khiển vào trong màn hình soạn thảo. Tham khảo phần mã nguồn
chương trình điều khiển “MySample_Mega2560.ino” đã được trình bày trong mục
Giảng viên: Phạm Quang Trí Communication and Control for
Computer Peripheral Devices 29
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

1.2.3.2 bên trên để viết mã nguồn. Sau khi viết xong mã nguồn của chương trình chính
vào trong màn hình soạn thảo thì ta tiến hành lưu tập tin này vào trong máy tính bằng
cách từ thanh menu lệnh chọn “File  Save As…”. Trong hộp thoại “Save As” hiện
trên màn hình, ta chọn nơi lưu trữ tập tin, đặt tên tập tin và nhấp chuột vào nút “Save”
để lưu tập tin vào máy tính.
Phần mã nguồn của chương trình điều khiển coi như đã xong như được minh
họa trong Hình 25 bên dưới.

Hình 25. Minh họa màn hình soạn thảo chương trình điều khiển
“MySample_Mega2560.ino”.
Tiếp theo ta thực hiện biên dịch và kiểm tra lỗi cú pháp của chương trình điều

khiển bằng cách nhấp chuột vào biểu tượng “Verify” trên thanh công cụ của màn
hình soạn thảo. Việc biên dịch và kiểm tra lỗi cú pháp của chương trình điều khiển
được xem là thành công khi trong cửa sổ “Message” xuất hiện dòng chữ có nội dung
“Done Compiling”. Hình 26 bên dưới minh họa việc biên dịch thành công chương
trình điều khiển (firmware).

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 30
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

Hình 26. Giao diện chương trình sau khi biên dịch thành công.
Lúc này phần mềm Arduino sẽ tạo ra tập tin mã HEX (firmware) và lưu trữ tập
tin này trong thư mục mà ta đã chỉ định trong mục “Preferences” của phần mềm.

Hình 27. Tập tin mã HEX (firmware) của chương trình sau khi biên dịch thành công.

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 31
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

 Lưu ý: Cần lưu ý rằng mặc định thì sau khi đã biên dịch thành công
phần mềm Arduino sẽ không tự tạo ra tập tin mã HEX. Việc phần mềm Arduino “có
tạo ra tập tin mã HEX hay không?” hoặc “lưu trữ tập tin mã HEX này tại đâu trong
máy tính?” hoàn toàn do người sử dụng thiết lập các thông số làm việc trong phần
mềm lúc ban đầu. Muốn làm được việc này thì ta cần phải điều chỉnh và bổ sung lại
các thông số cho tập tin “Preferences.txt”. Việc này có thể được thực hiện bằng cách,
từ thanh “Menu” ta nhấp chuột vào “File”  “Preferences”.

Hình 28. Chọn tính năng Preferences trong phần mềm Arduino.
Khi đó trên màn hình sẽ xuất hiện hộp thoại “Preferences”. Trong hộp thoại
này ta nhấp chuột đánh dấu vào tính năng “Compilation” nằm trong mục “Show
verbose output during”. Sau đó nhấp chuột vào dòng chữ minh họa đường dẫn lưu
tập tin mã HEX như được trình bày trong Hình 29 dưới đây.

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 32
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

Hình 29. Điều chỉnh tính năng Preferences trong phần mềm Arduino.
Một cửa sổ mới xuất hiện, chỉ ra nơi lưu trữ của tập tin “Preferences.txt”. Ta
nhấp đúp chuột vào tên tập tin này để mở nó ra và tiến hành bổ sung thông tin cấu
hình cho phần mềm Arduino.

Hình 30. Tập tin Preferences dùng để cấu hình hoạt động cho phần mềm Arduino.

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 33
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

Trong màn hình soạn thảo của tập tin “Preferences.txt”, ta nhập bổ sung thêm
dòng lệnh “build.path = ……….…….” như minh họa trong Hình 31 dưới đây (trong
đó phần “……….…….” sẽ được thay thế là đường dẫn nơi mà người sử dụng muốn
lưu trữ tập tin mã HEX). Kết thúc việc bổ sung và hiệu chỉnh bằng cách lưu lại tập tin
“Preferences.txt” và nhấp chuột vào nút “OK” trong hộp thoại “Preferences”.
Tiến hành khởi động lại phần mềm Arduino để cập nhật sự thay đổi này và tiến
hành biên dịch lại chương trình điều khiển để có được tập tin mã HEX tại thư mục
mong muốn.

Hình 31. Điều chỉnh lại nơi lưu tập tin mã HEX.
1.2.4.2. Bước 2 – Vẽ mạch mô phỏng cho hệ thống trên phần mềm mô
phỏng Protues
Khởi động phần mềm “Protues” và tiến hành vẽ sơ đồ mạch mô phỏng của hệ
thống điều khiển ngoại vi thông qua cổng COM như trong Hình 23.
1.2.4.3. Bước 3 – Nạp chương trình cho mạch Arduino trên phần mềm
mô phỏng Protues
Để nạp chương trình điều khiển cho Atmega2560 trong mạch mô phỏng ta nhấp
đúp chuột vào vi mạch Atmega2560 trong sơ đồ. Trên màn hình xuất hiện hộp thoại
“Edit Component” như Hình 32 bên dưới.
Giảng viên: Phạm Quang Trí Communication and Control for
Computer Peripheral Devices 34
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

Hình 32. Hộp thoại hiệu chỉnh thông số làm việc cho mạch Arduino.
Trong hộp thoại “Edit Component”, để đảm bảo tính chính xác về mặt thời
gian, tốc độ điều khiển trong khi chạy mô phỏng trên máy tính thì ta cần chọn chính
xác tần số xung clock cấp cho vi điều khiển trong mục “Clock Frequency”, trong
trường hợp ví dụ này ta nhập vào 16MHz như minh họa trong Hình 32 bên trên. Ngoài
ra, cũng trong hộp thoại “Edit Component” này ở mục “Program File” ta sẽ phải chỉ
đường dẫn đến nơi lưu trữ tập tin chương trình điều khiển được tạo ra ở Bước 1 và
chọn tập tin này, sau đó nhấp chuột vào nút “Open” trong hộp thoại “Select File
Name” để chọn nó như minh họa trong Hình 33 và kết thúc việc nạp chương trình
điều khiển cho Atmega2560 bằng cách nhấp chuột vào nút “OK” trong hộp thoại
“Edit Component”.

Hình 33. Hộp thoại chọn tập tin chương trình điều khiển cho Atmega2560.
Giảng viên: Phạm Quang Trí Communication and Control for
Computer Peripheral Devices 35
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

Sau khi đã chọn tập tin chương trình điều khiển cho Atmega2560 thì ta tiến
hành thiết lập thông số hoạt động cho cổng COM mô phỏng trên phần mềm Protues.
Tiến hành việc này bằng cách nhấp đúp chuột vào cổng COM mô phỏng trong sơ đồ
để mở hộp thoại “Edit Component” như Hình 34 bên dưới.

Hình 34. Hộp thoại hiệu chỉnh thông số hoạt động cho cổng COM mô phỏng.
Trong hộp thoại này ta cần hiệu chỉnh chính xác các thông số như sau:
o Tên cổng COM (Physical Port): COM1
o Tốc độ truyền dữ liệu (Physical/Virtual Baud Rate): 9600
o Số bit dữ liệu (Physical/Virtual Data Bits): 8
o Bit kiểm tra (Physical/Virtual Parity): NONE
o Số bit dừng (Physical/Virtual Stop Bits): 1
Sau khi đã hiệu chỉnh chính xác các thông số này thì ta sẽ kết thúc bằng cách
nhấp chuột vào nút “OK” trong hộp thoại “Edit Component”.
1.2.4.4. Bước 4 – Sử dụng công cụ giả lập giao diện điều khiển thiết bị
thông qua cổng COM trên máy tính – SerialPort Terminal
Thực hiện tương tự như đã trình bày trong phần giao tiếp và điều khiển thiết bị
qua COM giữa máy tính và vi điều khiển PIC18F4550, xem chi tiết trong mục
Giảng viên: Phạm Quang Trí Communication and Control for
Computer Peripheral Devices 36
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

“1.1.4.4. Bước 4 – Sử dụng công cụ giả lập giao diện điều khiển thiết bị thông qua
cổng COM trên máy tính – SerialPort Terminal”.
1.2.4.5. Bước 5 – Tạo mô phỏng kết nối giữa giao diện điều trên máy
tính và hệ thống điều khiển ngoại vi thông qua cổng COM dùng
mạch Arduino
Thực hiện tương tự như đã trình bày trong phần giao tiếp và điều khiển thiết bị
qua COM giữa máy tính và vi điều khiển PIC18F4550, xem chi tiết trong mục
“1.1.4.5. Bước 5 – Tạo mô phỏng kết nối giữa giao diện điều trên máy tính và hệ
thống điều khiển ngoại vi thông qua cổng COM dùng PIC18F4550”.
1.2.4.6. Bước 6 – Tiến hành mô phỏng điều khiển thiết bị
Thực hiện tương tự như đã trình bày trong phần giao tiếp và điều khiển thiết bị
qua COM giữa máy tính và vi điều khiển PIC18F4550, xem chi tiết trong mục
“1.1.4.6. Bước 6 – Tiến hành mô phỏng điều khiển thiết bị”.
1.3. Giao diện điều khiển trên máy tính
Để có thể nhanh chóng tiếp cận với cách thức xây dựng một giao diện điều
khiển thiết bị thông qua cổng COM trên máy tính trong các bài học sau, thì với mức
độ cơ bản sinh viên chỉ cần tham khảo thật kỹ và nắm thật vững các thao tác thực hiện
trong bài ví dụ dưới đây. Tuy nhiên để có thể thực hiện xây dựng một giao diện điều
khiển trên máy tính có mức độ phức tạp cao hơn thì cần tìm kiếm và tham khảo thêm
các tài liệu về phần mềm Visual Studio C# 2012.
1.3.1. Tạo Project mới trong Visual Studio C# 2012
Sau khi đã cài đặt phần mềm Visual Studio C# 2012 vào máy tính, ta tiến hành
khởi động phần mềm. Tùy thuộc vào phiên bản phần mềm đã cài đặt mà một cửa sổ
khởi động (Start Page) sẽ xuất hiện như hình minh họa bên dưới.

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 37
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

Hình 35. Cửa sổ khởi động của phần mềm Visual Studio.
Để tạo một Project mới, ta nhấp chuột vào mục “New Project” trong phần mục
“Start” phía bên trái cửa sổ làm việc hoặc từ thanh menu lệnh ta chọn lệnh “File” 
“New”  “Project…”, xem minh họa trong Hình 36.

Hình 36. Khởi động một Project mới.


Trong cửa sổ “New Project” ta chọn kiểu Project muốn tạo là “Windows
Forms Application” như hình minh họa trong hình bên dưới. Để có được kiểu Project
này ta nhớ lưu ý rằng phải chọn đúng thứ tự các mục trong phần phía bên trái cửa sổ
“New Project” là “Installed  Templates  Visual C#  Windows”.

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 38
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

Hình 37. Chọn kiểu Project cần tạo.


Trong cửa sổ “New Project” này ta cũng cần ghi nhớ và điều chỉnh lại tên
Project (điều chỉnh trong mục “Name”), nơi lưu trữ trong máy tính (điều chỉnh trong
mục “Location”) ở phần phía dưới của cửa sổ này, xem minh họa trong Hình 37. Sau
khi đã thực hiện xong các công việc trên ta nhấp chuột vào nút “OK” để hoàn tất việc
tạo mới một Project.
Khi đó trên màn hình sẽ xuất hiện cửa sổ làm việc để tạo giao diện điều khiển
như hình minh họa bên dưới.

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 39
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

Quản lý

Giao diện

Thuộc tính
Công cụ

Hình 38. Cửa sổ làm việc của Visual Studio để tạo giao diện điều khiển.
 Phần giao diện (Form): Đây chính là cửa sổ giao diện chính của chương
trình điều khiển sẽ xuất hiện ở giữa màn hình làm việc của máy tính.
Trong cửa sổ giao diện này chúng ta sẽ đặt vào đó tất cả các đối tượng
điều khiển (như nút nhấn, nhãn, hộp thoại, nút chọn chức năng,…).

Hình 39. Giao diện điều khiển (Form).


 Phần công cụ (Toolbox): Chứa toàn bộ các đối tượng điều khiển mà
chúng ta sẽ cần đến để tạo ra một giao diện cho chương trình điều khiển
của chúng ta. Tất cả các phần việc chúng ta cần phải làm chỉ đơn giản là
nhấp và giữ chuột vào đối tượng điều khiển trong hộp công cụ (Toolbox),
Giảng viên: Phạm Quang Trí Communication and Control for
Computer Peripheral Devices 40
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

sau đó rê và thả chúng vào trong phần giao diện điều khiển (Form) tại vị
trí mong muốn. Các đối tượng điều khiển thường được gom chung vào
trong các tính năng điều khiển khác nhau như “All Windows Forms”,
“Common Controls”, “Containers”,… Để thấy được tất cả các đối
tượng điều khiển trong mỗi nhóm ta cần nhấp chuột vào dấu “+” để cho
phép chúng hiển thị lên màn hình của hộp công cụ. Trong trường hợp
chúng ta không nhìn thấy cửa sổ của hộp công cụ từ thanh menu lệnh ta
chọn lệnh “View”  “Toolbox” để cho phép hộp công cụ hiển thị trên
màn hình làm việc.

Hình 40. Hộp công cụ (Toolbox).


 Thuộc tính (Properties) và quản lý chương trình (Solution Explorer):
Mỗi đối tượng điều khiển, chẳng hạn như một nút nhấn, đều phải có
những thuộc tính của nó. Một thuộc tính của đối tượng điều khiển là
những thông tin như chiều cao, chiều rộng, kích cỡ, tên, nhãn,…. Để nhìn
thấy được thuộc tính của một đối tượng điều khiển nào đó ta cần phải
chọn đối tượng điều khiển này, bằng cách từ trên màn hình giao diện ta sẽ
nhấp chuột vào đối tượng (lưu ý là chỉ nhấp chuột 1 lần vào đối tượng,
không nhấp được nhấp đúp), sau đó quan sát các thuộc tính của đối tượng
điều khiển trong phần nội dung (Properties) nằm ở góc dưới bên phải của
cửa sổ làm việc. Việc điều chỉnh các thông số thuộc tính này đòi hỏi sinh
Giảng viên: Phạm Quang Trí Communication and Control for
Computer Peripheral Devices 41
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

viên phải tự mình nắm vững và tìm hiểu thêm trong nhiều tài liệu khác
nhau nhằm đảm bảo tính chính xác của từng thuộc tính. Trong phần quản
lý chương trình (Solution Explorer) là phần nội dung nằm ở góc trên bên
phải của cửa sổ làm việc, sẽ cho chúng ta biết tên của Project, số lượng
các cửa sổ (Form) có trong một Project, mã nguồn của Project,…

Hình 41. Thuộc tính (Properties) và quản lý chương trình (Solution Explorer).
Sau khi đã hoàn chỉnh việc tạo một Project mới ta tiến hành lưu lại các công
việc đã thực hiện của chúng ta bằng cách nhấp chuột vào biểu tượng “Save All” trên
thanh công cụ hoặc từ Menu lệnh ta chọn lệnh “File”  “Save All”.
1.3.2. Phân tích ví dụ minh họa
Trong phần này sẽ trình bày chi tiết cách thức dùng phần mềm Visual Studio C#
để tạo ra một giao diện điều khiển trên máy tính để giao tiếp với thiết bị ngoại vi thông
qua cổng COM. Lưu ý rằng giao diện này sẽ được dùng để mô phỏng giao tiếp và điều
khiển ngoại vi thông qua cổng COM cho hệ thống thiết bị ngoại vi dùng vi điều khiển
PIC18F4550 hoặc mạch Arduino Mega 2560 mà ta đã thực hiện trong bài học trước
(xem lại các mục 1.1 và mục 1.2). Vì vậy để thực hiện tốt nội dung trong mục này, các
sinh viên cần phải xem lại và thực hiện một cách hoàn chỉnh các nội dung của bài học
trước, đây là chính là yêu cầu bắt buộc cần phải đáp ứng.
Yêu cầu giao diện:
 Phần thiết lập truyền thông:
o Hộp chọn lựa cổng COM.
Giảng viên: Phạm Quang Trí Communication and Control for
Computer Peripheral Devices 42
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

o Hộp chọn lựa tốc độ.


o Ô thông tin hiển thị trạng thái kết nối cổng COM.
o Nút nhấn kết nối cổng COM.
o Nút nhấn ngắt kết nối cổng COM.
 Phần điều khiển thiết bị:
o Nút nhấn điều khiển bật LED.
o Nút nhấn điều khiển tắt LED.
 Phần đọc trạng thái thiết bị:
o Ô thông tin hiển thị số lần nhấn-nhả nút SW.
 Phần truyền/nhận dữ liệu:
o Ô thông tin nhập dữ liệu cần gửi đi.
o Ô thông tin hiển thị dữ liệu nhận được.
 Các thành phần khác:
o Nút nhấn thoát chương trình.
Kết quả giao diện sau khi tạo xong sẽ như hình minh họa bên dưới.

Hình 42. Giao diện của chương trình giao tiếp và điều khiển.
1.3.3. Xây dựng giao diện điều khiển thiết bị ngoại vi thông qua cổng
COM trên máy tính
Trong phần này sẽ trình bày chi tiết cách thức tạo ra một giao diện điều khiển sử
dụng phần mềm Visual Studio C#. Để tạo ra giao diện của chương trình giao tiếp và
điều khiển như trên thì ta cần sử dụng một số đối tượng với tên điều khiển, tên hiển thị
và thuộc tính được hiệu chỉnh so với mặc định như trong Bảng 1.

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 43
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

Bảng 1. Liệt kê các đối tượng trên giao diện điều khiển.
STT Đối tượng Tên hiển thị Tên điều khiển Các thuộc tính được hiệu chỉnh
1 Button Connect button_Connect
2 Button Send button_DataSend
3 Button Disconnect button_DisConnect
4 Button Exit Program button_Exit
5 Button OFF button_OFF
6 Button ON button_ON
DropDownStyle = DropDownList
7 ComboBox comboBox_BaudRate
Items = (Collection)
DropDownStyle = DropDownList
8 ComboBox comboBox_COMPort
Items = (Collection)
9 CheckBox checkBox_DataSend
Sample AutoScaleMode = Font
Interface - FormBorderStyle = FixedSingle
10 Form Form_SampleCOM
RS232 MaximumBox = False
Communication StartPosition = CenterScreen
Communication
11 GroupBox groupBox_COMSetup
Setup
Data
12 GroupBox groupBox_DataSendReceive
Send/Receive
13 GroupBox Switch Status groupBox_Kit2PC
14 GroupBox LED Control groupBox_PC2Kit
15 Label Baud Rate label_BaudRate
16 Label COM Port label_COMPort
17 Label Counter label_Counter
18 Label Send label_DataSend
19 Label LED On/Off label_LEDOnOff
Designed by TextAlign = MiddleCenter
20 Label label_NameDesigned
pqtri2002 ForeColor = Blue
TextAlign = MiddleCenter
RS232 (COM)
Font = Microsoft Sans Serif, 10pt,
21 Label Communication label_NameLab
style=Bold
Lab
ForeColor = Blue
22 Label Receive label_Receive
BackColor = White
23 OvalShape ovalShape_LED
BackStyle = Opaque
24 SerialPort Serial_Port
25 ShapeContainer shapeContainer1
26 TextBox textBox_DataReceive BackColor = White
Giảng viên: Phạm Quang Trí Communication and Control for
Computer Peripheral Devices 44
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

Font = Microsoft Sans Serif, 8.25pt,


style=Bold
ReadOnly = True
TextAlign = Center
BackColor = White
Font = Microsoft Sans Serif, 8.25pt,
27 TextBox textBox_DataSend style=Bold
ReadOnly = True
TextAlign = Center
BackColor = Red
Font = Microsoft Sans Serif, 8.25pt,
28 TextBox textBox_Status style=Bold
ReadOnly = True
TextAlign = Center
BackColor = DodgerBlue
Font = Microsoft Sans Serif, 8.25pt,
29 TextBox textBox_SW style=Bold
ReadOnly = True
TextAlign = Center

Đầu tiên ta khởi động phần mềm Visual Studio C# 2012 để tạo mới, đặt tên và
lưu trữ một Project mới, vần đề này đã được trình bày ở phần đầu của mục này, xem
chi tiết trình bày trong mục 1.3.1.

Hình 43. Tạo một Project mới.


Giảng viên: Phạm Quang Trí Communication and Control for
Computer Peripheral Devices 45
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

Tiếp theo ta thực hiện đổi tên hiển thị và tên điều khiển của giao diện điều khiển
(Form):

Hình 44. Minh họa tạo giao diện điều khiển “Sample Interface - RS232
Communication”.
 Điều chỉnh các thuộc tính của đối tượng này như trình bày trong Bảng 1.
 Kết quả thực hiện như minh họa trong Hình 45 bên dưới.

Hình 45. Minh họa hoàn tất tạo giao diện điều khiển “Sample Interface - RS232
Communication”.
Tiếp theo ta tạo nhãn (Label) “RS232 (COM) Communication Lab” và
“Designed by pqtri2002”: Vào “Toolbox  Common Controls”, chọn “Label” và
đưa ra giao diện.

Hình 46. Minh họa tạo nhãn “RS232 (COM) Communication Lab” và “Designed by
pqtri2002”.

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 46
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

 Điều chỉnh các thuộc tính của các đối tượng này như trình bày tại Bảng 1.
 Kết quả thực hiện như minh họa trong Hình 47 bên dưới.

Hình 47. Minh họa hoàn tất tạo nhãn “RS232 (COM) Communication Lab” ” và
“Designed by pqtri2002”.
Tiếp theo ta tạo các hộp nhóm (GroupBox) “Communication Setup”, “Data
Send/Receive”, “Switch Status” và “LED Control”: Vào “Toolbox  Containers”,
chọn “GroupBox” và đưa ra giao diện.

Hình 48. Minh họa tạo hộp nhóm “Communication Setup”, “Data Send/Receive”,
“Switch Status” và “LED Control”.
 Điều chỉnh các thuộc tính của các đối tượng này như trình bày tại Bảng 1.
 Kết quả thực hiện như minh họa trong Hình 49 bên dưới.

Hình 49. Minh họa hoàn tất tạo hộp nhóm “Communication Setup”, “Data
Send/Receive”, “Switch Status” và “LED Control”.

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 47
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

Tiếp theo ta tạo các hộp thả xuống (ComboBox) cùng với các nhãn (Label)
tương ứng kèm theo “COM Port” và “Baud Rate” trong hộp nhóm “Communication
Setup”: Vào “Toolbox  Common Controls”, chọn “ComboBox” (để tạo hộp thả
xuống) hoặc chọn “Label” (để tạo nhãn) và đưa ra giao diện.

Hình 50. Minh họa tạo hộp thả xuống cùng với các nhãn tương ứng kèm theo “COM
Port” và “Baud Rate”.
 Điều chỉnh các thuộc tính của các đối tượng này như trình bày tại Bảng 1.
o Các biểu tượng (Items) trong phần hộp thả xuống “Baud Rate”:
Nhấp vào mục “Collection” và nhập vào nội dung như hình minh
họa bên dưới, sau đó nhấp chuột vào nút “OK”.

Hình 51. Nhập vào các giá trị tốc độ truyền dữ liệu.
 Kết quả thực hiện như minh họa trong Hình 52 bên dưới.

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 48
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

Hình 52. Minh họa hoàn tất tạo hộp thả xuống cùng với các nhãn tương ứng kèm theo
“COM Port” và “Baud Rate”.
Tiếp theo ta tạo các nút nhấn (Button) “Connect”, “Disconnect”, “ON”, “OFF”,
“Send” và “Exit Program” trong các hộp nhóm “Communication Setup”, “LED
Control” và trên giao diện: Vào “Toolbox  Common Controls”, chọn “Button” và
đưa ra giao diện

Hình 53. Minh họa tạo các nút nhấn “Connect”, “Disconnect”, “ON”, “OFF”, “Send”
và “Exit Program”.
 Điều chỉnh các thuộc tính của các đối tượng này như trình bày tại Bảng 1.
 Kết quả thực hiện như minh họa trong Hình 54 bên dưới.

Hình 54. Minh họa hoàn tất tạo các nút nhấn “Connect”, “Disconnect”, “ON”, “OFF”,
“Send” và “Exit Program”.

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 49
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

Tiếp theo ta tạo hộp dữ liệu (TextBox) “Disconnected!” trong hộp nhóm
“Communication Setup”: Vào “Toolbox  Common Controls”, chọn “TextBox” và
đưa ra giao diện.

Hình 55. Minh họa tạo hộp dữ liệu “Disconnected!”.


 Điều chỉnh các thuộc tính của các đối tượng này như trình bày tại Bảng 1.
 Kết quả thực hiện như minh họa trong Hình 56 bên dưới.

Hình 56. Minh họa hoàn tất tạo hộp dữ liệu “Disconnected!”.
Tiếp theo ta tạo hộp dữ liệu (TextBox) cùng với nhãn (Label) kèm theo
“Counter (SW)”, “Send” và “Receive” trong hộp nhóm “Switch Status”, “LED
Control” và “Data Send/Receive”: Vào “Toolbox  Common Controls”, chọn
“TextBox” (để tạo hộp dữ liệu) hoặc “Label” (để tạo nhãn) và đưa ra giao diện.

Hình 57. Minh họa tạo hộp dữ liệu cùng với các nhãn kèm theo “Counter (SW)”,
“Send” và “Receive”.

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 50
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

 Điều chỉnh các thuộc tính của các đối tượng này như trình bày tại Bảng 1.
 Kết quả thực hiện như minh họa trong Hình 58 bên dưới.

Hình 58. Minh họa hoàn tất tạo hộp dữ liệu cùng với các nhãn kèm theo “Counter
(SW)”, “Send” và “Receive”.
Tiếp theo ta tạo hộp đánh dấu (CheckBox) “Send” trong hộp nhóm “Data
Send/Receive”: Vào “Toolbox  Common Controls”, chọn “CheckBox” (để tạo ô
đánh dấu) và đưa ra giao diện.

Hình 59. Minh họa tạo hộp đánh dấu “Send”.


 Điều chỉnh các thuộc tính của các đối tượng này như trình bày tại Bảng 1.
 Kết quả thực hiện như minh họa trong Hình 60 bên dưới.

Hình 60. Minh họa hoàn tất tạo hộp đánh dấu “Send”.
Tiếp theo ta tạo hình vẽ bầu dục (OvalShape) cùng với nhãn (Label) kèm theo
“LED On/Off” trong hộp nhóm “LED Control”: Vào “Toolbox  Visual Basic

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 51
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

PowerPack”, chọn “OvalShape” (để tạo hình vẽ bầu dục) hoặc “Label” (để tạo nhãn)
và đưa ra giao diện.

Hình 61. Minh họa tạo hình vẽ bầu dục cùng với các nhãn kèm theo “LED On/Off”.
 Điều chỉnh các thuộc tính của các đối tượng này như trình bày tại Bảng 1.
 Kết quả thực hiện như minh họa trong Hình 62 bên dưới.

Hình 62. Minh họa hoàn tất tạo hình vẽ bầu dục cùng với các nhãn kèm theo “LED
On/Off”.
Cuối cùng trong phần tạo giao diện là phải tạo giao tiếp cổng COM
“SerialPort” cho giao diện: Vào “Toolbox  Components”, chọn “SerialPort” và
đưa ra giao diện.
 Điều chỉnh các thuộc tính của các đối tượng này như trình bày tại Bảng 1.
 Kết quả thực hiện như minh họa trong Hình 63 bên dưới.

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 52
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

Hình 63. Minh họa hoàn tất tạo giao tiếp cổng COM “SerialPort”.
1.3.4. Giải thuật và mã nguồn của giao diện điều khiển
1.3.4.1. Giải thuật
BEGIN BEGIN BEGIN BEGIN
Form_SampleCOM_Load comboBox_COMPort_Selected comboBox_BaudRate_Selected Send_Data
Cấu hình Serial_Port Đóng cổng COM Đóng cổng COM Gửi chuỗi trong
9600, 8N1 “Send_Text” qua cổng COM
Xử lý đồ họa giao diện Xử lý đồ họa giao diện
Đọc tên các cổng COM Hiển thị chuỗi đã gửi
có trong máy tính ENDCOMPortSelected ENDBaudRateSelected trong hộp dữ liệu “Send”

Lưu tên các cổng COM vào ENDSend_Data


hộp thả xuống “COM Port”

ENDLo ad

BEGIN
checkBox_DataSend_CheckedChanged

Đ
Có đánh dấu xác nhận?

S
Cấm sử dụng nút Cho phép sử dụng nút
“Send” và nhập dữ liệu “Send” và nhập dữ liệu
vào hộp dữ liệu “Send” vào hộp dữ liệu “Send”

ENDCheck_Send

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 53
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

BEGIN
button_Connect_Click

Đ Hộp thoại cảnh báo


Chưa chọn cổng COM?
"Yêu cầu chọn cổng COM"
S
Đ Hộp thoại cảnh báo
Chưa chọn tốc độ?
"Yêu cầu chọn tốc độ"
S
Đ Đ Hộp thoại thông báo
Kiểm tra xử lý ngoại lệ? Cổng COM đang mở?
"Cổng COM đã mở"
S S
Mở cổng COM được chọn

Hộp thoại thông báo


"Cổng COM được chọn đã mở"

Xử lý đồ họa giao diện Xử lý đồ họa giao diện

Hộp thoại thông báo lỗi Xóa bộ đệm nhận và


"Có lỗi xảy ra khi mở cổng COM" gửi dữ liệu

ENDConnect

BEGIN
button_DisConnect_Click

Đ Đ
Kiểm tra xử lý ngoại lệ? Cổng COM đang mở? Đóng cổng COM được chọn

S S Hộp thoại thông báo


Hộp thoại thông báo lỗi Hộp thoại thông báo "Cổng COM được chọn đã đóng"
"Có lỗi xảy ra khi mở cổng COM" "Cổng COM đã đóng"
Xử lý đồ họa giao diện

ENDDisConnect

BEGIN
button_Exit_Click
Hộp thoại hỏi đáp
"Đồng ý thoát chương trình"

Đ Đ Đóng cổng COM


Xác nhận đồng ý? Cổng COM đang mở?
được chọn
S S
Đóng giao diện
chương trình

ENDExit

BEGIN
button_ON_Click

Đ Đ Chuỗi dữ liệu
Kiểm tra xử lý ngoại lệ? Cổng COM đang mở?
“@le_on&”
S S Gửi chuỗi dữ liệu
Hộp thoại thông báo lỗi Xử lý đồ họa giao diện qua cổng COM
"Có lỗi xảy ra khi mở cổng COM"
Hộp thoại thông báo
"Cổng COM chưa được mở"

ENDON

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 54
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

BEGIN
button_OFF_Click

Đ Đ Chuỗi dữ liệu
Kiểm tra xử lý ngoại lệ? Cổng COM đang mở?
“@le_of&”
S S Gửi chuỗi dữ liệu
Hộp thoại thông báo lỗi Xử lý đồ họa giao diện qua cổng COM
"Có lỗi xảy ra khi mở cổng COM"
Hộp thoại thông báo
"Cổng COM chưa được mở"

ENDOFF

BEGIN
button_DataSend_Click

Đ Đ Đọc chuỗi dữ liệu từ


Kiểm tra xử lý ngoại lệ? Cổng COM đang mở?
hộp dữ liệu “Send”
S S Gửi chuỗi dữ liệu
Hộp thoại thông báo lỗi Xử lý đồ họa giao diện qua cổng COM
"Có lỗi xảy ra khi mở cổng COM"
Hộp thoại thông báo
"Cổng COM chưa được mở"

ENDDataSen d

BEGIN
Serial_Port_DataReceived
Đọc từng byte lưu vào bộ đệm
chuỗi dữ liệu nhận

Nhận hoàn tất Đ


chuỗi dữ liệu?

S
Hiển thị chuỗi dữ liệu lên
hộp dữ liệu “Receive”

Tách dữ liệu số lần nhấn-


Đ Xóa bộ đệm
Dữ liệu nhấn nút SW? nhả SW và hiển thị lên hộp
nhận dữ liệu
dữ liệu “Counter(SW)”
S
Đ Đ Xử lý đồ họa giao
Dữ liệu điều khiển LED? Điều khiển LED sáng?
diện LED sáng
S S
Đ Xử lý đồ họa giao
Điều khiển LED tắt?
diện LED tắt
S

ENDD ataReceived

1.3.4.2. Mã nguồn
Sau khi hoàn tất việc tạo các đối tượng điều khiển trong giao diện thì ta tiếp tục
chuyển sang phần tạo mã nguồn cho giao diện này nhằm mục đích đạt được các chức
năng điều khiển theo yêu cầu đặt ra ban đầu. Để tạo mã nguồn ta nhấp phải chuột vào
giao diện vừa mới tạo ra và chọn “View Code”, khi đó một cửa sổ được mở ra để cho
ta nhập mã nguồn của giao diện vào.
Giảng viên: Phạm Quang Trí Communication and Control for
Computer Peripheral Devices 55
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

Đầu tiên ta viết và bổ sung (nếu chưa được tạo sẵn) khai báo các thư viện sử
dụng trong phần tạo code cho giao diện, đặc biệt chú ý đến dòng khai báo thư viện
“using System.IO.Ports” vì nó cho phép ta truy xuất đến các lệnh sử dụng trong việc
giao tiếp cổng COM.
/* ************************************************************************** */
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.IO.Ports;
using System.Xml;
/* ************************************************************************** */

Tiếp theo ta viết phần khai báo biến toàn cục cần sử dụng và phần mã nguồn để
khởi động các thành phần (Component) trong chương trình giao diện điều khiển. Xem
minh họa trong đoạn mã nguồn ngay bên dưới đây:
/* ************************************************************************** */
string ReceiveData = String.Empty; // Bien chua chuoi nhan ve (Receive)
string TransmitData = String.Empty; // Bien chua chuoi truyen di (Transmit)

/* ******************************************************************************* */
// Khoi dong chuong trinh.
public Form_SampleCOM()
{
InitializeComponent();
}
/* ******************************************************************************* */
/* ************************************************************************** */

Tiếp theo ta viết phần mã nguồn sẽ được chạy cho mỗi lần cửa sổ giao diện điều
khiển được mở lên (hay nói cách khác là khi cửa sổ giao diện điều khiển được kích
hoạt “chạy”). Trong phần mã nguồn này gồm có 2 phần (tính từ trên xuống dưới), xem
minh họa trong đoạn mã nguồn ngay bên dưới đây:
 Phần 1: dùng để khai báo cấu hình mặc định ban đầu cho cổng COM.
 Phần 2: dùng để tự động kiểm tra các cổng COM đang hiện đang tồn tại
trong máy tính để cập nhật vào trong hộp thả xuống “COM Port”.
/* ************************************************************************** */
// Xu ly khi mo giao dien.
private void Form_SampleCOM_Load(object sender, EventArgs e)
Giảng viên: Phạm Quang Trí Communication and Control for
Computer Peripheral Devices 56
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

{
// Cau hinh cong COM mac dinh.
// COM Port: ???, Baud: 96000 / Data: 8 / Parity: 0 / Stop: 1
Serial_Port.PortName = "Select COM Port...";
Serial_Port.BaudRate = 9600;
Serial_Port.DataBits = 8;
Serial_Port.Parity = Parity.None;
Serial_Port.StopBits = StopBits.One;

// Doc thong tin cac cong COM co trong PC.


string[] ports = SerialPort.GetPortNames();

// Them ten cua tat ca cac cong vao muc COM Port.
foreach (string port in ports)
{
comboBox_COMPort.Items.Add(port);
}
}
/* ************************************************************************** */

Tiếp theo ta viết phần mã nguồn dùng để truyền chuỗi dữ liệu mong muốn
thông qua cổng COM và hiển thị chuỗi dữ liệu này lên hộp dữ liệu “Send”. Xem minh
họa trong đoạn mã nguồn ngay bên dưới đây:
/* ************************************************************************** */
// Chuong trinh con gui du lieu
public void Send_Data(string Send_Text)
{
Serial_Port.Write(Send_Text);
textBox_DataSend.Text = Send_Text.ToString(); // Hien thi du lieu gui
}
/* ************************************************************************** */

Tiếp theo ta viết phần mã nguồn dùng để đóng cửa sổ giao diện hay nói cách
khác là khi giao diện điều khiển được đóng bằng nút  ở góc trên bên phải của cửa sổ
giao diện. Xem minh họa trong đoạn mã nguồn ngay bên dưới đây:
/* ************************************************************************** */
// Xu ly khi dong giao dien.
private void Form_SampleCOM_FormClosed(object sender, FormClosedEventArgs e)
{
if (Serial_Port.IsOpen) // Dong cong neu cong dang duoc mo.
Serial_Port.Close(); // Dong cong COM da chon truoc do.
}
/* ************************************************************************** */

Tiếp theo ta chọn thẻ “Form1.cs [Design]” để quay trở về cửa sổ giao diện điều
khiển. Sau đó nhấp đúp chuột vào nút “Connect” để tạo mã nguồn điều khiển cho đối
tượng này. Trong phần mã nguồn này gồm có 4 phần (tính từ trên xuống dưới), xem
minh họa trong đoạn mã nguồn ngay bên dưới đây:

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 57
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

 Phần 1: dùng để kiểm tra và điều khiển hiển thị cửa sổ cảnh báo nếu cổng
COM và tốc độ truyền dữ liệu chưa được chọn lựa trong hộp thả xuống
tương ứng “COM Port” và “Baud Rate”.
 Phần 2: dùng để kiểm tra và điều khiển hiển thị cửa sổ thông báo nếu
cổng COM chọn lựa đã được mở trước đó.
 Phần 3: dùng để kiểm tra và điều khiển hiển thị cửa sổ thông báo nếu
cổng COM chọn lựa chưa được mở trước đó, điều khiển mở cổng COM
chọn lựa, đổi màu và hiển thị chữ.
 Phần 4: dùng để kiểm tra và điều khiển hiển thị cửa sổ thông báo lỗi nếu
cổng COM chọn lựa không thể mở được vì một số lý do nào đó (lỗi cổng,
lỗi cáp,…).
/* ************************************************************************** */
// Xu ly khi nhan nut Connect
private void button_Connect_Click(object sender, EventArgs e)
{
// Kiem tra da chon cong COM.
if (comboBox_COMPort.Text == "")
MessageBox.Show("Select COM Port.", "Warning", MessageBoxButtons.OK,
MessageBoxIcon.Warning); // Thong bao loi neu chua chon cong COM.
else if (comboBox_BaudRate.Text == "")
MessageBox.Show("Select baudrate for COM Port.", "Warning",
MessageBoxButtons.OK, MessageBoxIcon.Warning); // Thong bao loi neu chua chon cong COM.
else
{ // Xu ly mo cong COM da chon
try
{
if (Serial_Port.IsOpen) // Xu ly truong hop da key noi
{
MessageBox.Show("COM Port is connected and ready for use.",
"Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else // Xu ly truong hop chua ket noi
{
Serial_Port.Open(); // Mo cong COM.
MessageBox.Show(comboBox_COMPort.Text + " is connected.",
"Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
textBox_Status.BackColor = Color.Lime; // Hieu chinh mau va
thong tin
textBox_Status.Text = "Connecting...";

comboBox_COMPort.Enabled = false;
comboBox_BaudRate.Enabled = false;

ReceiveData = String.Empty;
TransmitData = String.Empty;
}
}

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 58
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

catch (Exception) // Xu ly xuat hien loi khong thay thiet bi


{
textBox_Status.BackColor = Color.Red; // Hieu chinh mau va thong tin
textBox_Status.Text = "Disconnected!";
MessageBox.Show("COM Port is not found. Please check your COM or Cable.",
"Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
/* ************************************************************************** */

Kế tiếp ta lại tiếp tục chọn thẻ “Form1.cs [Design]” để quay trở về cửa sổ giao
diện điều khiển. Sau đó nhấp đúp chuột vào nút “Disconnect” để tạo mã nguồn điều
khiển cho đối tượng này. Trong phần mã nguồn này gồm có 3 phần (tính từ trên xuống
dưới), xem minh họa trong đoạn mã nguồn ngay bên dưới đây:
 Phần 1: dùng để kiểm tra và điều khiển hiển thị cửa sổ thông báo nếu
cổng COM chọn lựa đã được mở trước đó, điều khiển đóng cổng COM
chọn lựa, đổi màu và hiển thị chữ.
 Phần 2: dùng để kiểm tra và điều khiển hiển thị cửa sổ thông báo nếu
cổng COM chọn lựa chưa được mở trước đó.
 Phần 3: dùng để kiểm tra và điều khiển hiển thị cửa sổ thông báo lỗi nếu
cổng COM chọn lựa không thể đóng được vì một số lý do nào đó (lỗi
cổng, lỗi cáp,…).
/* ************************************************************************** */
// Xu ly khi nhan Disconnnect.
private void button_DisConnect_Click(object sender, EventArgs e)
{
try
{
if (Serial_Port.IsOpen) // Xu ly truong hop da ket noi
{
Serial_Port.Close();
textBox_Status.BackColor = Color.Red; // Hieu chinh mau va thong tin
textBox_Status.Text = "Disconnected!";
MessageBox.Show("COM Port is disconnected.", "Information",
MessageBoxButtons.OK, MessageBoxIcon.Information);
comboBox_COMPort.Enabled = true;
comboBox_BaudRate.Enabled = true;
}
else // Xu ly truong hop chua ket noi
{
MessageBox.Show("COM Port have been disconnected. Please reconnect to
use.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 59
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

catch (Exception) // Xu ly khi xuat hien loi


{
MessageBox.Show("Disconnection appears error. Unable to disconnect.",
"Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
/* ************************************************************************** */

Tiếp theo ta chọn thẻ “Form1.cs [Design]” để quay trở về cửa sổ giao diện điều
khiển. Sau đó nhấp đúp chuột vào nút “Exit Program” để tạo mã nguồn điều khiển
cho đối tượng này. Phần mã nguồn này dùng để kiểm tra và điều khiển hiển thị cửa sổ
hỏi đáp, nếu xác nhận đồng ý và cổng COM lựa chọn đã được mở trước đó thì sẽ điều
khiển đóng cổng COM, sau đó sẽ đóng cửa sổ giao diện điều khiển lại. Xem minh họa
trong đoạn mã nguồn ngay bên dưới đây:
/* ************************************************************************** */
// Xu ly khi nhan nut Exit
private void button_Exit_Click(object sender, EventArgs e)
{
DialogResult answer = MessageBox.Show("Do you want to exit the program?",
"Question", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (answer == DialogResult.Yes)
{
if (Serial_Port.IsOpen) // Dong cong neu cong dang duoc mo.
{
Serial_Port.Close();
}
this.Close();
}
}
/* ************************************************************************** */

Tiếp theo ta chọn thẻ “Form1.cs [Design]” để quay trở về cửa sổ giao diện điều
khiển. Sau đó nhấp đúp chuột vào nút “ON” để tạo mã nguồn điều khiển cho đối
tượng này. Trong phần mã nguồn này gồm có 3 phần (tính từ trên xuống dưới), xem
minh họa trong đoạn mã nguồn ngay bên dưới đây:
 Phần 1: dùng để kiểm tra và điều khiển truyền chuỗi dữ liệu “@le_on&”
nếu cổng COM chọn lựa đã được mở trước đó.
 Phần 2: dùng để kiểm tra và điều khiển hiển thị cửa sổ thông báo nếu
cổng COM chọn lựa chưa được mở trước đó, đổi màu và hiển thị chữ.
 Phần 3: dùng để kiểm tra và điều khiển hiển thị cửa sổ thông báo lỗi nếu
không thể truyền dữ liệu qua cổng COM được vì một số lý do nào đó (lỗi
cổng, lỗi cáp,…).

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 60
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

/* ************************************************************************** */
// Xu ly khi nhan nut ON
private void button_ON_Click(object sender, EventArgs e)
{
try
{
if (Serial_Port.IsOpen) // Xu ly khi da ket noi thanh cong
{
TransmitData = "@le_on&";
Send_Data(TransmitData); // Gui du lieu qua port noi tiep
}
else
{
textBox_Status.BackColor = Color.Red; // Hieu chinh mau va thong tin
textBox_Status.Text = "Disconnected!";
MessageBox.Show("COM Port is not connected. Please reconnect to use.",
"Information", MessageBoxButtons.OK, MessageBoxIcon.Information); // Thong bao loi neu chua
chon cong COM.
}
}
catch (Exception) // Xu ly khi xuat hien loi
{
MessageBox.Show("The control appears error. Action can not be completed.",
"Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
/* ************************************************************************** */

Tiếp theo ta chọn thẻ “Form1.cs [Design]” để quay trở về cửa sổ giao diện điều
khiển. Sau đó nhấp đúp chuột vào nút “OFF” để tạo mã nguồn điều khiển cho đối
tượng này. Trong phần mã nguồn này gồm có 3 phần (tính từ trên xuống dưới), xem
minh họa trong đoạn mã nguồn ngay bên dưới đây:
 Phần 1: dùng để kiểm tra và điều khiển truyền chuỗi dữ liệu “@le_of&”
nếu cổng COM chọn lựa đã được mở trước đó.
 Phần 2: dùng để kiểm tra và điều khiển hiển thị cửa sổ thông báo nếu
cổng COM chọn lựa chưa được mở trước đó, đổi màu và hiển thị chữ.
 Phần 3: dùng để kiểm tra và điều khiển hiển thị cửa sổ thông báo lỗi nếu
không thể truyền dữ liệu qua cổng COM được vì một số lý do nào đó (lỗi
cổng, lỗi cáp,…).
/* ************************************************************************** */
// Xu ly khi nhan nut OFF
private void button_OFF_Click(object sender, EventArgs e)
{
try
{
if (Serial_Port.IsOpen) // Xu ly khi da ket noi thanh cong
{
TransmitData = "@le_of&";
Send_Data(TransmitData); // Gui du lieu qua port noi tiep
Giảng viên: Phạm Quang Trí Communication and Control for
Computer Peripheral Devices 61
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

}
else
{
textBox_Status.BackColor = Color.Red; // Hieu chinh mau va thong tin
textBox_Status.Text = "Disconnected!";
MessageBox.Show("COM Port is not connected. Please reconnect to use.",
"Information", MessageBoxButtons.OK, MessageBoxIcon.Information); // Thong bao loi neu chua
chon cong COM.
}
}
catch (Exception) // Xu ly khi xuat hien loi
{
MessageBox.Show("The control appears error. Action can not be completed.",
"Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
/* ************************************************************************** */

Tiếp theo ta chọn thẻ “Form1.cs [Design]” để quay trở về cửa sổ giao diện điều
khiển. Sau đó nhấp đúp chuột vào nút “Send” để tạo mã nguồn điều khiển cho đối
tượng này. Trong phần mã nguồn này gồm có 3 phần (tính từ trên xuống dưới), xem
minh họa trong đoạn mã nguồn ngay bên dưới đây:
 Phần 1: dùng để kiểm tra và điều khiển truyền chuỗi dữ liệu đã được nhập
vào ô dữ liệu “Send” nếu cổng COM chọn lựa đã được mở trước đó.
 Phần 2: dùng để kiểm tra và điều khiển hiển thị cửa sổ thông báo nếu
cổng COM chọn lựa chưa được mở trước đó, đổi màu và hiển thị chữ.
 Phần 3: dùng để kiểm tra và điều khiển hiển thị cửa sổ thông báo lỗi nếu
không thể truyền dữ liệu qua cổng COM được vì một số lý do nào đó (lỗi
cổng, lỗi cáp,…).
/* ************************************************************************** */
// Xu ly khi nhan nut Send
private void button_DataSend_Click(object sender, EventArgs e)
{
try
{
if (Serial_Port.IsOpen) // Xu ly khi da ket noi thanh cong
{
TransmitData = textBox_DataSend.Text.ToString();
Send_Data(TransmitData); // Gui du lieu qua port noi tiep
}
else
{
textBox_Status.BackColor = Color.Red; // Hieu chinh mau va thong tin
textBox_Status.Text = "Disconnected!";
MessageBox.Show("COM Port is not connected. Please reconnect to use.",
"Information", MessageBoxButtons.OK, MessageBoxIcon.Information); // Thong bao loi neu chua
chon cong COM.
}
}

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 62
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

catch (Exception) // Xu ly khi xuat hien loi


{
MessageBox.Show("The control appears error. Action can not be completed.",
"Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
/* ************************************************************************** */

Tiếp theo ta chọn thẻ “Form1.cs [Design]” để quay trở về cửa sổ giao diện điều
khiển. Sau đó nhấp đúp chuột vào hộp đánh dấu “Send” để tạo mã nguồn điều khiển
cho đối tượng này. Phần mã nguồn này dùng để kiểm tra và điều khiển cho phép nút
“Send” được phép sử dụng, hộp dữ liệu “Send” được phép nhập dữ liệu cần truyền
nếu người dùng đánh dấu chọn vào trong hộp đánh dấu này. Xem minh họa trong đoạn
mã nguồn ngay bên dưới đây:
/* ************************************************************************** */
// Xu ly khi danh dau trong hop kiem tra Send
private void checkBox_DataSend_CheckedChanged(object sender, EventArgs e)
{
if (checkBox_DataSend.Checked == true)
{
button_DataSend.Enabled = true; // Cho phep nhap chuoi du lieu vao o Send
textBox_DataSend.ReadOnly = false;
}
else
{
button_DataSend.Enabled = false;
textBox_DataSend.ReadOnly = true;
}
}
/* ************************************************************************** */

Tiếp theo ta chọn thẻ “Form1.cs [Design]” để quay trở về cửa sổ giao diện điều
khiển. Sau đó nhấp đúp chuột vào hộp thả xuống “COM Port” để tạo mã nguồn điều
khiển cho đối tượng này. Phần mã nguồn này dùng để điều khiển đóng cổng COM đã
được mở trước đó, đổi màu và hiển thị chữ. Sau đó lấy thông tin tên cổng COM đã
chọn trong hộp thả xuống này và gán làm tên cổng COM sử dụng hiện hành. Xem
minh họa trong đoạn mã nguồn ngay bên dưới đây:
/* ************************************************************************** */
// Xu ly khi chon cong COM.
private void comboBox_COMPort_SelectedIndexChanged(object sender, EventArgs e)
{
Serial_Port.Close(); // Dong cong COM da chon truoc do.
textBox_Status.BackColor = Color.Red; // Hieu chinh mau va thong tin
textBox_Status.Text = "Disconnected!";
Serial_Port.PortName = comboBox_COMPort.Text; // Lay so cong COM da chon.
}
/* ************************************************************************** */

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 63
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

Tiếp theo ta chọn thẻ “Form1.cs [Design]” để quay trở về cửa sổ giao diện điều
khiển. Sau đó nhấp đúp chuột vào hộp thả xuống “Baud Rate” để tạo mã nguồn điều
khiển cho đối tượng này. Phần mã nguồn này dùng để điều khiển đóng cổng COM đã
được mở trước đó, đổi màu và hiển thị chữ. Sau đó lấy thông tin tốc độ truyền dữ liệu
đã chọn trong hộp thả xuống này và gán làm tốc độ truyền dữ liệu sử dụng hiện hành.
Xem minh họa trong đoạn mã nguồn ngay bên dưới đây:
/* ************************************************************************** */
// Xu ly khi chon toc do baud
private void comboBox_BaudRate_SelectedIndexChanged(object sender, EventArgs e)
{
Serial_Port.Close(); // Dong cong COM da chon truoc do.
textBox_Status.BackColor = Color.Red; // Hieu chinh mau va thong tin
textBox_Status.Text = "Disconnected!";
Serial_Port.BaudRate = Convert.ToInt32(comboBox_BaudRate.Text); // Lay toc do
baud da chon.
}
/* ************************************************************************** */

Hình 64. Tạo sự kiện điều khiển từ cổng COM.


Tiếp theo ta chọn thẻ “Form1.cs [Design]” để quay trở về cửa sổ giao diện điều
khiển. Để đọc dữ liệu từ cổng COM chúng ta cần tạo một sự kiện lắng nghe (listening

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 64
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

event) để liên tục kiểm tra các dữ liệu được đưa đến cổng COM đang sử dụng. Khi dữ
liệu được nhận hoàn chỉnh thì một sự kiện sẽ được xảy ra. Cách thức đơn giản nhất để
đọc dữ liệu từ cổng COM bằng cách nhấp chuột chọn đối tượng “SerialPort”, sau đó
nhấp chuột vào biểu tượng “Event” trong mục “Properties” như minh họa trong Hình
64 bên trên.
Trong thẻ điều khiển xuất hiện, ta chọn mục “DataReceived” và nhập vào tên
của sự kiện “Serial_Port_DataReceived” như hình minh họa bên dưới. Sau đó nhấp
đúp chuột vào tên sự kiện mới vừa tạo ra để tiến hành nhập đoạn mã nguồn điều khiển
vào trong đó. Trong phần mã nguồn này gồm có 3 phần (tính từ trên xuống dưới), xem
minh họa trong đoạn mã nguồn ngay bên dưới đây:
 Phần 1: dùng để đọc chuỗi dữ liệu nhận được và kiểm tra chuỗi dữ liệu
này theo đúng định dạng qui định (bắt đầu là ký tự “@” và kết thúc bằng
ký tự “&”), hiển thị nội dung chuỗi dữ liệu nhận được lên ô dữ liệu
“Receive”.
 Phần 2: dùng để kiểm tra và điều khiển tách lấy phần dữ liệu số lần nhấn-
nhả nút SW, hiển thị giá trị này lên ô dữ liệu “Counter (SW)” nếu chuỗi
dữ liệu nhận được có mã nhận dạng dành cho nút nhấn (ký tự tiếp sau ký
tự bắt đầu là “S”).
 Phần 3: dùng để kiểm tra và điều khiển LED trên giao diện điều khiển
sáng hoặc tắt căn cứ vào nội dung dữ liệu nhận được tương ứng là
“le_on” hoặc “le_of” nếu chuỗi dữ liệu nhận được có mã nhận dạng dành
cho LED (ký tự tiếp sau ký tự bắt đầu là “L”).
/* ************************************************************************** */
// Nhan du lieu tu cong COM.
private void Serial_Port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
CheckForIllegalCrossThreadCalls = false; // Bo kiem tra xung dot
//---------------------------------------------------------------------
// Nhan du lieu co nhan dang ky tu bat dau (@) va va ky tu ket thuc (&) cua chuoi
du lieu (@.........&)
ReceiveData = Serial_Port.ReadTo("&");
textBox_DataReceive.Text = ReceiveData.ToString() + "&"; // Hien thi du lieu nhan
if (ReceiveData.Substring(0, 1) == "@") // Kiem tra dung dinh dang
chuoi du lieu (@.........&)
{
//---------------------------------------------------------------------
Giảng viên: Phạm Quang Trí Communication and Control for
Computer Peripheral Devices 65
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

if (ReceiveData.Substring(1, 1) == "S") // Kiem tra du lieu nhan nut


{
textBox_SW.Text = ReceiveData.Substring(2); // Tach lay phan du lieu
so lan nhan SW
ReceiveData = String.Empty; // Xoa bien luu chuoi du lieu nhan
}
//---------------------------------------------------------------------
else if (ReceiveData.Substring(1, 1) == "L") // Kiem tra du lieu phan hoi
trang thai LED
{
//---------------------------------------------------------------------
if (ReceiveData.Substring(2) == "le_on") // Dieu chinh mau doi tuong
theo du lieu LED sang
{
ovalShape_LED.BackColor = Color.Red;
}
else if (ReceiveData.Substring(2) == "le_of") // Dieu chinh mau doi
tuong theo du lieu LED tat
{
ovalShape_LED.BackColor = Color.DarkGray;
}
//---------------------------------------------------------------------
}
}
}
/* ************************************************************************** */

1.3.5. Vận hành giao diện điều khiển đã tạo ra

Hình 65. Minh họa mô phỏng kết nối giữa giao diện điều khiển và thiết bị ngoại vi.

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 66
HƯỚNG DẪN THỰC HIỆN CÁC VÍ DỤ THAM KHẢO January 1, 2018

Sau khi hoàn thành toàn bộ việc tạo giao diện điều khiển và viết mã nguồn cho
giao diện điều khiển này ta tiến hành chạy thử giao diện điều khiển đã tạo ra để kiểm
tra sự truyền nhận dữ liệu giữa máy tính và thiết bị ngoại vi PIC18F4550.
Trên phần mềm Visual Studio C# ta nhấp chuột vào nút “Start” trên
thanh công cụ để chạy thử giao diện. Muốn dừng chạy thử giao diện thì ta nhấp chuột
vào nút “Stop” trên thanh công cụ.
Trên phần mềm mô phỏng Protues ta nhấp chuột vào nút “Start” trên thanh
công cụ để chạy thử giao diện. Muốn dừng chạy thử giao diện thì ta nhấp chuột vào
nút “Stop” trên thanh công cụ.
Xem minh họa việc truyền nhận dữ liệu giữa máy tính và thiết bị ngoại vi
PIC18F4550 như trong Hình 65.

Giảng viên: Phạm Quang Trí Communication and Control for


Computer Peripheral Devices 67

You might also like