Logo WAVESHAREGiao diện xe buýt USB-CAN
Chức năng giao diện bộ điều hợp
Hướng dẫn sử dụng thư việnWAVESHARE USB CAN Bus Inter face Adapter Giao diện Chức năng Thư viện

PHẦN MỘT HẾTVIEW

Nếu người dùng chỉ sử dụng bộ điều hợp giao diện bus USB-CAN để tiếp tục kiểm tra giao tiếp bus CAN, sau đó anh ta có thể trực tiếp sử dụng phần mềm Công cụ USB-CAN được cung cấp để gửi và nhận dữ liệu của bài kiểm tra.
Nếu người dùng có ý định viết chương trình phần mềm cho sản phẩm của chính mình. Vui lòng đọc kỹ các hướng dẫn sau đây và tham khảo từ sampmã le chúng tôi cung cấp:
⑴ Trình tạo C++ ⑵C# ⑶VC ⑷VB ⑸VB.NET ⑹Delphi ⑺LabVIEW ⑻ LabWindows/CVI ⑼Matlab ⑽QT ⑾Python/Python-can.
Phát triển thư viện file :ControlCAN.lib, ControlCAN.DLL
Tuyên bố chức năng phiên bản VC file :Điều khiểnCAN.h
Khai báo hàm phiên bản VB file: ControlCAN.bas
Phòng thí nghiệmVIEW mô-đun gói chức năng thư viện phiên bản:ControlCAN.llb
Khai báo hàm phiên bản Delphi file: ControlCAN.pas

PHẦN HAI THƯ VIỆN CHỨC NĂNG TƯƠNG THÍCH VÀ CẤU TRÚC DỮ LIỆU

2.1. ĐỊNH NGHĨA LOẠI
2.1.1. Loại thiết bị

Định nghĩa loại Loại giá trị Sự miêu tả
DEV_USBCAN2 4 USBCAN-2A/USBCAN-2C/CANalyst-II MiniPCIe-CAN

2.1.2. VCI_BOARD_INFO
Cấu trúc VCI_BOARD_INFO chứa thông tin thiết bị thẻ giao diện Sê-ri USB-CAN.
Cấu trúc sẽ được điền vào hàm VCI_ReadBoardInfo.

WAVESHARE USB CAN Bus Inter face Adapter Interface Thư viện chức năng - Hình 1

Thành viên:
hw_Phiên bản
Số phiên bản phần cứng, ký hiệu thập lục phân. Ví dụ: 0x0100 đại diện cho V1.00.
fw_Phiên bản
Số phiên bản phần cứng, ký hiệu thập lục phân. Ví dụ: 0x0100 đại diện cho V1.00.
Trang 2
dr_Phiên bản

Số phiên bản trình điều khiển, ký hiệu thập lục phân. Ví dụ: 0x0100 đại diện cho V1.00.
trong_Phiên bản
Số phiên bản thư viện giao diện, ký hiệu thập lục phân. Ví dụ: 0x0100 đại diện cho V1.00.
irq_Num
Hệ thống dự phòng.
can_Num
Đại diện cho tổng số kênh CAN.
str_Serial_Num
Số sê-ri của thẻ bảng này.
str_hw_Type
Loại phần cứng, chẳng hạn như “USBCAN V1.00” (Lưu ý: Bao gồm bộ kết thúc chuỗi '\0').
Kín đáo
Hệ thống dự phòng.
2.1.3. VCI_CAN_OBJ
Trong các chức năng VCI_Transmit và VCI_Receive, cấu trúc VCI_CAN_OBJ được sử dụng để truyền khung thông báo CAN.

WAVESHARE USB CAN Bus Inter face Adapter Giao diện Chức năng Thư viện - Hình

Thành viên:
ID
Nhận dạng tin nhắn. Định dạng ID trực tiếp, căn lề phải, vui lòng tham khảo: Phụ lục XNUMX: Chi tiết căn chỉnh ID.
thời gianStamp
nhận stamp thông tin về khung thời gian, thời gian bắt đầu khi bộ điều khiển CAN được khởi tạo, đơn vị là 0. 1ms.
cờ thời gian
Về việc có nên sử dụng thời gianamp, 1 là TimeSt hiệu quảamp. TimeFlag và TimeStamp chỉ có ý nghĩa khi nhận được khung.
Loại gửi
Loại gửi. = 0 biểu thị Loại bình thường, = 1 biểu thị Gửi một lần.
Cờ từ xa
Cho dù đó là một lá cờ từ xa. = 1 biểu thị cờ từ xa, = 0 biểu thị cờ dữ liệu.
cờ ngoài
Cho dù đó là một lá cờ bên ngoài. = 1 biểu thị cờ ngoài, = 0 biểu thị cờ tiêu chuẩn.
Dữ liệuLen
Độ dài dữ liệu(<=8) ,tức là độ dài của dữ liệu.
Dữ liệu
Dữ liệu gói.
Kín đáo
Hệ thống dự phòng.
2.1.4. VCI_INIT_CONFIG
Cấu trúc VCI_INIT_CONFIG xác định cấu hình khởi tạo của CAN. Cấu trúc sẽ được điền vào hàm VCI_InitCan.

WAVESHARE USB CAN Bus Inter face Adapter Interface Thư viện chức năng - Hình 2

Thành viên:
Mã tài khoản
Nhận mã chấp nhận đã lọc.
AccMask
Nhận mặt nạ lọc.
Kín đáo
Kín đáo.
Lọc
Phương pháp lọc, cho phép phạm vi cài đặt 0-3, tham khảo phần 2.2.3 của bảng chế độ lọc để biết chi tiết.
Thời gian0
Thông số tốc độ Baud SJA1000, Timing0 (BTR0) .
Thời gian1
Thông số tốc độ Baud SJA1000, Timing1 (BTR1) .
Cách thức
Chế độ hoạt động, 0 = hoạt động bình thường, 1 = Chế độ chỉ nghe, 2 = chế độ kiểm tra tự nhận và gửi.
Ghi chú:
Về cài đặt bộ lọc, vui lòng tham khảo: Phụ lục II: Hướng dẫn cài đặt thông số CAN.
CAN Timing0 và Timing1 được sử dụng để đặt tốc độ truyền, hai tham số này chỉ được sử dụng khi khởi tạo stage.
Bảng tham chiếu Baud thông thường:

CÓ THỂ tốc độ Baud Thời gian0(BTR0) Thời gian1(BTR1)
10k bps 0x31 0x1C
20k bps 0x18 0x1C
40k bps 0x87 0xFF
50k bps 0x09 0x1C
80k bps 0x83 0xFF
100k bps 0x04 0x1C
125k bps 0x03 0x1C
200k bps 0x81 0xFA
250k bps 0x01 0x1C
400k bps 0x80 0xFA
500k bps 0x00 0x1C
666k bps 0x80 0xB6
800k bps 0x00 0x16
1000k bps 0x00 0x14
33.33 Kbps 0x09 0x6F
66.66 Kbps 0x04 0x6F
83.33 Kbps 0x03 0x6F
  1. Người dùng chỉ cần tuân theo SJA1000 (16MHz) để đặt tham số tốc độ Baud.
  2. Bộ điều hợp không hỗ trợ tốc độ Baud tạm thời dưới 10K.

2.2. MÔ TẢ CHỨC NĂNG
2.2.1. VCI_OpenDevice
Chức năng này dùng để kết nối các thiết bị.
DWORD __stdcall VCI_OpenDevice(DWORD DevType,DWORD DevIndex,DWORD Dành riêng);
Các thông số:
Loại nhà phát triển
Loại thiết bị. Xem: Định nghĩa loại thiết bị tiếp hợp.
Chỉ số phát triển
Chỉ mục thiết bị, ví dụ:ample, khi chỉ có một bộ điều hợp USB-CAN, số chỉ mục là 0, khi có nhiều bộ điều hợp USB-CAN, số chỉ mục theo thứ tự tăng dần bắt đầu từ 0.
Kín đáo
Thông số lưu giữ, điền vào 0.
Trả về:
Giá trị trả về = 1, nghĩa là thao tác thành công; = 0 cho biết thao tác không thành công; = -1 cho biết thiết bị không tồn tại.

WAVESHARE USB CAN Bus Inter face Adapter Interface Thư viện chức năng - Fig3

2.2.2. VCI_Đóng thiết bị
Chức năng này được sử dụng để đóng kết nối.
DWORD __stdcall VCI_CloseDevice(DWORD DevType,DWORD DevIndex);
Các thông số:
Loại nhà phát triển
Loại thiết bị. Xem: Định nghĩa loại thiết bị tiếp hợp.
Chỉ số phát triển
Chỉ mục thiết bị, ví dụ:ample, khi chỉ có một bộ điều hợp USB-CAN, số chỉ mục là 0, khi có nhiều bộ điều hợp USB-CAN, số chỉ mục theo thứ tự tăng dần bắt đầu từ 0.
Trả về:
Giá trị trả về = 1, nghĩa là thao tác thành công; = 0 cho biết thao tác không thành công; = -1 cho biết thiết bị không tồn tại.

WAVESHARE USB CAN Bus Inter face Adapter Interface Thư viện chức năng - Hình 4

2.2.3. VCI_InitCan
Chức năng này được sử dụng để khởi tạo CAN đã chỉ định.
DWORD __stdcall VCI_InitCAN(DWORD DevType, DWORD Dev Index, DWORD CAN Index,
PVCI_INIT_CONFIG pInitConfig);

Các thông số:
Loại nhà phát triển
Loại thiết bị. Xem: Định nghĩa loại thiết bị tiếp hợp.
Chỉ số phát triển
Chỉ mục thiết bị, ví dụ:ample, khi chỉ có một bộ điều hợp USB-CAN, số chỉ mục là 0, khi có nhiều bộ điều hợp USB-CAN, số chỉ mục theo thứ tự tăng dần bắt đầu từ 0.
CAN Index
Chỉ mục kênh CAN, chẳng hạn như khi chỉ có một kênh CAN, số chỉ mục là 0, nếu có hai kênh, số chỉ mục có thể là 0 hoặc 1.
pInitConfig
Cấu trúc tham số khởi tạo. Thông số danh sách thành viên:

Thành viên Mô tả chức năng
pInitConfig->AccCode AccCode và AccMask có thể làm việc cùng nhau để xác định gói tin nào có thể được chấp nhận. Hai thanh ghi này được sử dụng để đặt ID được căn trái, nghĩa là bit cao nhất (Bit31) của AccCode và AccMask được căn chỉnh với bit cao nhất của giá trị ID.
pInitConfig->AccMask Về căn chỉnh ID tham khảo các phụ lục: Phụ lục I:
Chi tiết căn chỉnh ID.
Vd :Nếu bạn đặt giá trị của AccCode là 0x24600000 (tức là 0x123 bị dịch chuyển sang trái 21 bit) thì giá trị AccMask
được đặt thành 0x00000000 và sau đó chỉ các gói có ID khung thông báo CAN là 0x123 mới có thể được chấp nhận (giá trị AccMask là 0x00000000 cho biết rằng tất cả các bit đều có liên quan
chút ít). Nếu giá trị AccCode được đặt thành 0x24600000, giá trị AccMask được đặt thành 0x600000 (0x03 được dịch sang trái 21 bit), thì chỉ các gói có ID khung thông báo CAN là 0x120 ~ 0x123 mới có thể được chấp nhận (giá trị AccMask
0x600000 chỉ ra rằng ngoài bit0 ~ bit1 các bit khác (bit2 ~ bit10) là bit có liên quan).
Ghi chú: Cài đặt bộ lọc này cũamptập tin vào khung tiêu chuẩn, ví dụample, bit cao 11 bit là bit hợp lệ; trong trường hợp khung mở rộng, thì ID hợp lệ là 29 bit. AccCode và AccMask đặt 29-bit cao làm bit hợp lệ!
pInitConfig->Dành riêng kín đáo
pInitConfig->Bộ lọc Cài đặt chế độ lọc vui lòng tham khảo phần của bảng chế độ lọc.
pInitConfig->Timing0 Cài đặt tốc độ BaudT0
pInitConfig->Timing1 Cài đặt tốc độ BaudT1
pInitConfig->Chế độ Chế độ hoạt động:
0-hoạt động bình thường
1-Chế độ chỉ nghe
2-chế độ kiểm tra gửi và nhận tự phát (giá trị này bị loại trừ khỏi thư viện chức năng ZLG)

Bảng chế độ lọc:

Giá trị Tên Sự miêu tả
1 Nhận tất cả các loại Phù hợp với cả khung tiêu chuẩn và khung mở rộng!
2 Chỉ nhận khung chuẩn Phù hợp với khung tiêu chuẩn và mở rộng
khung sẽ được loại bỏ bằng cách lọc trực tiếp!
3 Chỉ nhận khung mở rộng Phù hợp với khung mở rộng và khung tiêu chuẩn sẽ bị xóa bởi
lọc trực tiếp! 。

Trả về:
Giá trị trả về = 1, nghĩa là thao tác thành công; = 0 cho biết thao tác không thành công; = -1 cho biết thiết bị không tồn tại.
Ví dụ

WAVESHARE USB CAN Bus Inter face Adapter Interface Thư viện chức năng - Hình 4

WAVESHARE USB CAN Bus Inter face Adapter Interface Thư viện chức năng - Hình 6

2.2.4. VCI_ReadBoardInfo
Chức năng này được sử dụng để đọc thông tin phần cứng của bộ điều hợp. Nói chung, nó có thể được bỏ qua.
DWORD __stdcall VCI_ReadBoardInfo(DWORD DevType,DWORD
DevIndex, PVCI_BOARD_INFO pInfo);
Các thông số:
Loại nhà phát triển
Loại thiết bị. Xem: Định nghĩa loại thiết bị tiếp hợp.
Chỉ số phát triển
Chỉ mục thiết bị, ví dụ:ample, khi chỉ có một bộ điều hợp USB-CAN, số chỉ mục là 0, khi có nhiều bộ điều hợp USB-CAN, số chỉ mục theo thứ tự tăng dần bắt đầu từ 0. pInfo
VCI_BOARD_INFO được sử dụng để lưu trữ con trỏ cấu trúc thông tin thiết bị.
Trả về:
Giá trị trả về = 1, nghĩa là thao tác thành công; = 0 cho biết thao tác không thành công; = -1 cho biết thiết bị không tồn tại.

WAVESHARE USB CAN Bus Inter face Adapter Interface Thư viện chức năng - Hình 7

2.2.5. VCI_GetReceiveNum
Chức năng này được sử dụng để chỉ định các khung đã nhận nhưng chưa được đọc trong bộ đệm nhận được chỉ định.
DWORD __stdcall VCI_GetReceiveNum(DWORD DevType,DWORD DevIndex,DWORD CANIndex);
Các thông số:
Loại nhà phát triển
Loại thiết bị. Xem: Định nghĩa loại thiết bị tiếp hợp.
Chỉ số phát triển
Chỉ mục thiết bị, ví dụ:ample, khi chỉ có một bộ điều hợp USB-CAN, số chỉ mục là 0, khi có nhiều bộ điều hợp USB-CAN, số chỉ mục theo thứ tự tăng dần bắt đầu từ 0.
CAN Index
Chỉ số kênh CAN.
Trả về:
Trả lại các khung chưa được đọc.
Ví dụ
#include “ControlCan.h” int ret=VCI_GetReceiveNum(2,0,0);
2.2.6. VCI_ClearBuffer
Chức năng này được sử dụng để xóa bộ đệm nhận và gửi của kênh được chỉ định bởi
Bộ chuyển đổi USB-CAN.
DWORD __stdcall VCI_ClearBuffer(DWORD DevType,DWORD DevIndex,DWORD CANIndex);
Các thông số:
Loại nhà phát triển
Loại thiết bị. Xem: Định nghĩa loại thiết bị tiếp hợp.
Chỉ số phát triển
Chỉ mục thiết bị, ví dụ:ample, khi chỉ có một bộ điều hợp USB-CAN, số chỉ mục là 0, khi có nhiều bộ điều hợp USB-CAN, số chỉ mục theo thứ tự tăng dần bắt đầu từ 0.
CAN Index
Chỉ số kênh CAN.
Trả về:
Giá trị trả về = 1, nghĩa là thao tác thành công; = 0 cho biết thao tác không thành công; = -1 cho biết thiết bị không tồn tại.

WAVESHARE USB CAN Bus Inter face Adapter Interface Thư viện chức năng - Hình 8

2.2.7. VCI_StartCAN
Chức năng này được sử dụng để khởi động bộ điều khiển CAN và chức năng nhận ngắt bên trong của bộ điều hợp.
DWORD __stdcall VCI_StartCAN(DWORD DevType,DWORD DevIndex,DWORD CANIndex);
Các thông số:
Loại nhà phát triển
Loại thiết bị. Xem: Định nghĩa loại thiết bị tiếp hợp.
Chỉ số phát triển
Chỉ mục thiết bị, ví dụ:ample, khi chỉ có một bộ điều hợp USB-CAN, số chỉ mục là 0, khi có nhiều bộ điều hợp USB-CAN, số chỉ mục theo thứ tự tăng dần bắt đầu từ 0.
CAN Index
Chỉ số kênh CAN.
Trả về:
Giá trị trả về = 1, nghĩa là thao tác thành công; = 0 cho biết thao tác không thành công; = -1 cho biết thiết bị không tồn tại.

WAVESHARE USB CAN Bus Inter face Adapter Interface Thư viện chức năng - Hình 9

2.2.8. VCI_Đặt lạiCAN
Chức năng này được sử dụng để thiết lập lại bộ điều khiển CAN.
DWORD __stdcall VCI_ResetCAN(DWORD DevType,DWORD DevIndex,DWORD CANIndex);
Các thông số:
Loại nhà phát triển
Loại thiết bị. Xem: Định nghĩa loại thiết bị tiếp hợp.
Chỉ số phát triển
Chỉ mục thiết bị, ví dụ:ample, khi chỉ có một bộ điều hợp USB-CAN, số chỉ mục là 0, khi có nhiều bộ điều hợp USB-CAN, số chỉ mục theo thứ tự tăng dần bắt đầu từ 0.
CAN Index
Chỉ số kênh CAN.
Trả về:
Giá trị trả về = 1, nghĩa là thao tác thành công; = 0 cho biết thao tác không thành công; = -1 cho biết thiết bị không tồn tại.

WAVESHARE USB CAN Bus Inter face Adapter Interface Thư viện chức năng - Hình 10

2.2.9. VCI_Truyền
Chức năng này được sử dụng để gửi khung tin nhắn CAN.
DWORD __stdcall VCI_Transmit(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,PVCI_CAN_OBJ pSend,DWORD Chiều dài);
Các thông số:
Loại nhà phát triển
Loại thiết bị. Xem: Định nghĩa loại thiết bị tiếp hợp.
Chỉ số phát triển
Chỉ mục thiết bị, ví dụ:ample, khi chỉ có một bộ điều hợp USB-CAN, số chỉ mục là 0, khi có nhiều bộ điều hợp USB-CAN, số chỉ mục theo thứ tự tăng dần bắt đầu từ 0.
CAN Index
Chỉ số kênh CAN. pGửi
Địa chỉ đầu tiên của mảng khung dữ liệu phải được gửi.
Chiều dài
Số lượng khung dữ liệu phải được gửi, số lượng tối đa là 1000, giá trị khuyến nghị là 48 ở tốc độ cao.
Trả về:
Trả về số khung thực tế đã được gửi, giá trị trả về = -1 cho biết lỗi thiết bị.
Ví dụ
WAVESHARE USB CAN Bus Inter face Adapter Interface Thư viện chức năng - Hình 11

WAVESHARE USB CAN Bus Inter face Adapter Interface Thư viện chức năng - Hình 12

2.2.10. VCI_Nhận
Chức năng này được sử dụng để yêu cầu tiếp nhận.
DWORD __stdcall VCI_Receive(DWORD DevType, DWORD DevIndex, DWORD CANIndex, PVCI_CAN_OBJ pReceive, ULONG Len, INT WaitTime);
Các thông số:
Loại nhà phát triển
Loại thiết bị. Xem: Định nghĩa loại thiết bị tiếp hợp.
Chỉ số phát triển
Chỉ mục thiết bị, ví dụ:ample, khi chỉ có một bộ điều hợp USB-CAN, số chỉ mục là 0, khi có nhiều bộ điều hợp USB-CAN, số chỉ mục theo thứ tự tăng dần bắt đầu từ 0.
CAN Index
Chỉ số kênh CAN.
nhận
Để nhận con trỏ đã đặt đầu tiên của khung dữ liệu.
Lên
Độ dài mảng của khung dữ liệu phải lớn hơn 2500 để trả về thông báo bình thường.
Mặt khác, độ dài trả về sẽ bằng 2000 cho dù có nhận được tin nhắn hay không. bộ điều hợp đặt bộ đệm 2500 khung cho mỗi kênh. Dựa trên hệ thống và môi trường làm việc của mình, người dùng có thể chọn độ dài mảng phù hợp từ XNUMX.
Thời gian chờ dành riêng.
Trả về:
Trả về số khung thực sự đã được đọc, -1 cho biết lỗi thiết bị.
Ví dụ
WAVESHARE USB CAN Bus Inter face Adapter Interface Thư viện chức năng - Hình 13

PHẦN BA CÁC CHỨC NĂNG KHÁC VÀ MÔ TẢ CẤU TRÚC DỮ LIỆU

Chương này mô tả các loại dữ liệu và chức năng khác của thư viện giao diện ZLG không tương thích có trong thư viện giao diện bộ điều hợp USB-CAN ControlCAN.dll. Vui lòng làm
không gọi các chức năng này nếu sử dụng mô hình ZLG tương thích để phát triển thứ cấp để không ảnh hưởng đến khả năng tương thích.
3.1 MÔ TẢ CHỨC NĂNG
3.1.1. VCI_UsbThiết bị đặt lại
Đặt lại bộ chuyển đổi USB-CAN, cần mở lại thiết bị sau khi đặt lại bằng cách sử dụng VCI_OpenDevice.
DWORD __stdcall VCI_UsbDeviceReset(DWORD DevType,DWORD DevIndex,DWORD Dành riêng
Các thông số:
Loại nhà phát triển
Loại thiết bị. Xem: Định nghĩa loại thiết bị tiếp hợp.
Chỉ số phát triển
Chỉ mục thiết bị, ví dụ:ample, khi chỉ có một bộ điều hợp USB-CAN, số chỉ mục là 0, khi có nhiều bộ điều hợp USB-CAN, số chỉ mục theo thứ tự tăng dần bắt đầu từ 0.
Dành riêng Dành riêng.
Trả về:
Giá trị trả về = 1, nghĩa là thao tác thành công; = 0 cho biết thao tác không thành công; = -1 cho biết thiết bị không tồn tại.

WAVESHARE USB CAN Bus Inter face Adapter Interface Thư viện chức năng - Hình 14

bRel = VCI_UsbDeviceReset(nDeviceType, Độc lập, 0);
3.1.2. VCI_TìmUsbDevice2
Khi cùng một PC sử dụng nhiều USB-CAN, người dùng có thể sử dụng chức năng này để tìm thiết bị hiện tại.
DWORD __stdcall VCI_FindUsbDevice2(PVCI_BOARD_INFO pInfo);
Các thông số:
pThông tin
pInfo được sử dụng để lưu trữ các tham số của con trỏ địa chỉ bộ đệm dữ liệu đầu tiên.
Trả lại
Trả lại số của bộ chuyển đổi USB-CAN được cắm vào máy tính.

WAVESHARE USB CAN Bus Inter face Adapter Interface Thư viện chức năng - Hình 15

Phần XNUMX Giao diện Chức năng Thư viện Sử dụng Quy trình
Để tăng cường chức năng của thiết bị, chúng tôi đã cung cấp các chức năng bổ sung (các chức năng được hiển thị trên nền màu xanh lục), các chức năng này bao gồm: VCI_FindUsbDevice2 VCI_UsbDeviceReset. Trong quá trình phát triển thứ hai, các chức năng này không nhất thiết phải được gọi. Ngay cả khi các chức năng này bị bỏ qua, tất cả các chức năng của bộ điều hợp USB-CAN đều có thể đạt được.

WAVESHARE USB CAN Bus Inter face Adapter Interface Thư viện chức năng - Hình 16

www.waveshare.com
www.waveshare.com/wiki

Tài liệu / Tài nguyên

WAVESHARE USB-CAN Bus Inter face Adapter Giao diện Chức năng Thư viện [tập tin pdf] Hướng dẫn sử dụng
Thư viện chức năng giao diện bộ điều hợp giao tiếp USB-CAN Bus, USB-CAN, Thư viện chức năng giao diện bộ điều hợp giao diện xe buýt, Thư viện chức năng giao diện, Thư viện chức năng

Tài liệu tham khảo

Để lại bình luận

Địa chỉ email của bạn sẽ không được công bố. Các trường bắt buộc được đánh dấu *