You are on page 1of 17

GIỚI HIỆU CÁC HÀM API VÀ HÀM VISUAL C++ QUAN TRỌNG SỬ

DỤNG TRONG VIỆC LẬP TRÌNH TRUYỀN THÔNG NỐI TIẾP


1. Hàm CreateFile():
Chức năng: Tạo mở hay cắt bớt tập tin, cổng COM, thiết bị, dịch vụ, hay
bàn điều khiển. Một handle được trả về để truy cập đối tượng.
HANDLE CreateFile(
LPCTSTR lpFileName, //tên file
DWORD dwDesiredAccess, //phương thức truy cập
DWORD dwShareMode, //chế độ chia sẻ
LPSECURITY_ATTRIBUTES lpSecurityAttributes, //thuộc tính bảo mật
DWORD dwCreationDispostion, //sự kiện xảy ra khi tạo file
DWORD dwFlagsAndAttributes, //cờ thuộc tính file
HANDLE hTemplateFile
);
Các tham số
lpFileName
[vào] Chuỗi khác rỗng chứa tên của đối tượng, như file, cổng COM, thiết bị
đĩa, hoặc bàn điều khiển, để tạo hay mở.
Khi lpFileName chỉ đến một cổng cần mở, bạn phải thêm dấu ‘:’ dằng sau
tên. Thí dụ chỉ định COM1: để mở cổng COM1. Khi sử dụng IrCOMM, chỉ định
COM3:.
dwDesiredAccess
[vào] Phương thức truy cập đối tượng. Một ứng dụng có thể thực hiện truy
cập chỉ đọc (read-only), chỉ ghi (write-only), đọc/ghi, hay truy vấn thiết bị. Bảng
sau mô tả các giá trị có thể của dwDesiredAccess.
Giá trị Mô tả

0 Xác định truy vấn đối tượng. Một ứng dụng có thể thực
hiện truy vấn thuộc tính đối tượng mà không truy cập vào
thiết bị.

GENERIC_READ Chỉ định phương thức cho phép đọc lên đối tượng. Dữ
liệu có thể được đọc và con trỏ file có thể di chuyển trên
đối tượng. Kết hợp với GENERIC_WRITE để truy cập
dạng đọc/ghi.
GENERIC_WRITE Chỉ định phương thức cho phép ghi lên đối tượng. Dữ
liệu có thể được ghi và con trỏ file có thể di chuyển trên
đối tượng. Kết hợp với GENERIC_READ để truy cập
dạng đọc/ghi.

dwShareMode
[vào] Chế độ chia sẻ cho đối tượng. Nếu dwShareMode = 0, đối tượng
không thể chia sẻ. Các thao tác bên trong đối tượng sẻ không thành công cho đến
khi handle được đóng.
Tham số này có thể có nhiều giá trị khác nhau. Bảng sau sẻ cho thấy các giá
trị thích hợp của dwShareMode.

Giá trị Mô tả

FILE_SHARE_READ Thao tác con trên đối tượng chỉ có thể thành công
chỉ khi thực hiện đọc file.

FILE_SHARE_WRITE Thao tác con trên đối tượng chỉ có thể thành công
chỉ khi ghi file.

lpSecurityAttributes
[vào] Luôn = NULL.
dwCreationDispostion
[vào] Sự kiện xảy ra khi file đang tồn tại, và không tồn tại. Bảng sau mô tả
các gía trị khả dụng cho dwCreationDispostion.
Giá trị Mô tả

CREATE_NEW Tạo mới file. Hàm không thành công nếu file đang
tồn tại.

CREATE_ALWAYS Tạo mới file. Nếu file đã tồn tại thì sẽ ghi đè.

OPEN_EXISTING Mở file. Hàm không thành công nếu file không tồn
tại.
Phải sử dụng cờ này khi mở thiết bị bằng hàm
createfile() bao gồm cả console.

OPEN_ALWAYS Mở file nếu nó tồn tại. Nếu không, tạo file như
trường hợp cờ dwCreationDisposition được đặt là
CREATE_NEW.
TRUNCATE_EXISTING Mở file. Mở một lần, file bị cắt bớt nên kích thước
của nó là 0 bytes. Phải chỉ định truy cập
GENERIC_WRITE đối với loại cờ này. Hàm thất bại
nếu file không tồn tại.
dwFlagsAndAttributes
[in] Thuộc tính và cờ cho file.
Mọi sự kết hợp các thuộc tính có thể có của file đều được chấp nhận đối với
tham số dwFlagsAndAttributes. Tất cả các thuộc tính khác đều chứa thuộc tính
FILE_ATTRIBUTE_NORMAL. bảng sau mô tả các thuộc tính có thể của
dwFlagsAndAttributes.

Value Description

FILE_ATTRIBUTE_ARCHIVE Xác định file có thể lưu trữ. Ứng dụng


dùng thuộc tính này để đánh dấu file trong
trường hợp sao lưu hay loại bỏ.

FILE_ATTRIBUTE_HIDDEN Xác định file bị ẩn. Nó không có trong


danh sách của một thư mục thông thường.

FILE_ATTRIBUTE_NORMAL Xác định rằng file không có tập thuộc tính


nào khác. Thuộc tính này chỉ đúng nếu sử
dụng một mình.

FILE_ATTRIBUTE_READONLY Xác định rằng file là chỉ đọc.

FILE_ATTRIBUTE_SYSTEM Xác định file là một phần hay được dành


riêng cho hệ điều hành (OS).

FILE_ATTRIBUTE_TEMPORARY Không được hỗ trợ.

Mọi sự kết hợp các cờ cho phép đều được chấp nhận đối với tham số
dwFlagsAndAttributes. Bảng sau cho thấy các giá trị cờ cho phép đối với
dwFlagsAndAttributes.

Giá trị Mô tả

FILE_FLAG_WRITE_THROUGH Chỉ định hệ thống ngay lập tức cache và ghi


dữ liệu lên đĩa. Hệ thống vẫn đệm quá trình
ghi, nhưng không thể chậm trễ trong việc
đẩy nó đi.

FILE_FLAG_OVERLAPPED Cờ này không được hỗ trợ; mặc dù vậy các


phép đa xử lý đọc/ghi cùng lúc lên thiết bị
thì được phép.

FILE_FLAG_RANDOM_ACCES Chỉ định file truy cập ngẫu nhiên. Hệ thống


S dựa vào điều này để tối ưu việc lưu đệm
file.

hTemplateFile
[vào] Được bỏ qua;

Giá trị trả về


Một handle trỏ đến file vừa mở. Nếu file tồn tại trước khi gọi hàm và cờ
dwCreationDisposition là CREATE_ALWAYS hay OPEN_ALWAYS, Một lời
gọi hàm GetLastError trả về ERROR_ALREADY_EXISTS, ngay cả khi hàm mở
file thành công. Nếu file tồn tại trước khi gọi hàm, GetLastError trả về 0.
INVALID_HANDLE_VALUE chỉ ra rằng có lỗi. Để lấy thông tin chi tiết về lỗi,
gọi hàm GetLastError.
Chú ý
Sử dụng hàm CloseHandle để đóng một kênh truy cập đối tượng trả về từ
hàm CreateFile.
Xác định giá trị 0 cho dwDesiredAccess cho phép ứng dụng dò tìm thuộc
tính đối tượng mà thậm chí không truy cập vào thiết bị. Kiểu truy cập này rất có
ích, Thí dụ nếu ứng dụng muốn biết kích thước của ổ đĩa và định dạng mà ổ đĩa đó
hỗ trợ mà không có đĩa trong ổ đĩa.
Danh sách sau cho thấy các thao tác của hàm CreateFile trên các loại file,
tài nguyên thông tin, thiết bị, và bàn điều khiển:

• Các file

Khi tạo mới hay cắt bớt một file đang tồn tại, hàm CreateFile thực hiện các
hành động sau:

• Kết hợp các thuộc tính và cờ xác định bởi dwFlagsAndAttributes với
thuộc tính FILE_ATTRIBUTE_ARCHIVE.
• Đặt chiều dài file về 0.
• CreateFile không thể xử dụng để truy cập file trong MODULES của
bộ nhớ ROM. Các Module này được lưu trữ dưới nhiều định dạng khác nhau mà
ứng dụng không thể truy cập được. File ROM duy nhất có thể truy cập dùng hàm
CreateFile là những file trong đoạn FILES.

Khi mở một file đang tồn tại, hàm CreateFile bỏ qua các thuộc tính được
xác định bởi dwFlagsAndAttributes và xác định chiều dài file dược vào giá trị
dwCreationDisposition.
Sử dụng cờ FILE_FLAG_RANDOM_ACCESS đối với file lưu trên RAM,
đặt file trong vùng lưu trữ đối tượng, sẽ không cho phép nén file. Nếu đề cao sự
thực thi, thì đây có thể không phải là giải pháp đúng. Thao tác đọc ghi trên file nén
là chậm hơn so với file không nén.

• Cổng COM

Hàm CreateFile có thê tạo một handle chỉ đến cổng COM. Bằng cách đặt
tham số dwCreationDisposition là OPEN_EXISTING, phương thức truy cập chỉ
đọc, chỉ ghi, hay đọc/ghi đều có thể được phép.
2. Hàm SetupComm()
Xác lập các thông số truyền thông cho thiết bị.
BOOL SetupComm(
HANDLE hFile,
DWORD dwInQueue,
DWORD dwOutQueue
);
Các tham số
hFile
[vào] Handle trỏ đến các thiết bị truyền thông. Hàm CreateFile trả về
handle này.
dwInQueue
[vào] Xác định kích thước bộ đệm vào của thiết bị, tính bằng byte.
dwOutQueue
[vào] Xác định kích thước bộ đệm ra của thiết bị, tính bằng byte.

Các giá trị trả về


Khác không nếu thành công. ngược lại nếu thất bại. Dùng hàm
GetlastError để lấy chi tiết mã lỗi.
Ghi chú
Sau khi tiến trình CreateFile thực hiện trả về một handle đến tài nguyên
thông tin thì có thể gọi hàm SetupComm để xác lập các thông số cho thiết bị. Nếu
không xác lập các thông số này thì thiết bị sẽ sử dụng tham số mặc định khi xảy ra
việc gọi hàm để mở một tài nguyên thông tin khác.
Tham số dwInQueue và dwOutQueue xác định kích thước (byte) yêu cầu
cho bộ đệm bên trong của thiết bị được dùng bởi trình điều khiển thiết bị. Thí dụ
giáo thức YMODEM các gói có kích thước lớn hơn 1024 byte một ít. Kích thước
bộ đệm yêu cầu cho tài nguyên YMODEM có thể là 1200 byte.
Thiết bị nhận dữ liệu theo kích thước buffer, nhưng lại tự do sử dụng bất cứ
mô hình đệm nào.
3. Hàm PurgeComm
Hàm có thể xóa tất cả các kí tự trong bộ đệm vào và bộ đệm ra của tài
nguyên thông tin. Nó cũng dừng việc đọc ghi trên tài nguyên.
BOOL PurgeComm(
HANDLE hFile,
DWORD dwFlags
);
Các tham số
hFile
[vào] Handle trỏ đến tài nguyên thông tin.
dwFlags
[in] Xác định hành động thực hiện. Theo mô tả ở bảng sau:
Giá trị Mô tả

PURGE_TXABORT Hủy bỏ tất cả quá trình ghi hiện thời ngay cả khi quá
trình ghi chưa hoàn tất.

PURGE_RXABORT Hủy bỏ tất cả quá trình đọc hiện thời ngay cả khi quá
trình đọc chưa hoàn tất.

PURGE_TXCLEAR Xóa bộ đệm ra, nếu thiết bị có bộ đệm ra.

PURGE_RXCLEAR Xóa bộ đệm vào nếu thiết bị có bộ đệm vào.


Giá trị trả về
Khác không nếu thành công. Bằng không nếu thất bại. Chi tiết lỗi trả về bởi
hàm GetLastError.
Ghi chú
Nếu một tiểu trình sử dụng PurgeComm để chùi bộ đệm ra, các kí tự đã bị
xóa thì không truyền được. Để chùi sạch bộ đệm ra mà vẫn đảm bảo dữ liệu đã
được truyền thì gọi hàm FlushFileBuffers (một phương thức để đồng bộ hóa).
Chú ý rằng, đôi khi, hàm FlushFileBuffers đựoc đưa ra để điều khiển luồng
nhưng không ghi time-outs, và nó sẽ không trả về cho đến khi quá trình ghi kết
thúc.
4. Cấu trúc DCB (Device Control Block - Khối điều khiển thiết bị)
Cấu trúc DCB định nghĩa các thiết lập điều khiển cho một thiết bị truyền
thông nối tiếp.
typedef struct _DCB {
DWORD DCBlength; // kích thước của DCB
DWORD BaudRate; // tốc độ truyền hiện tại
DWORD fBinary: 1; // chế độ nhị phân, không kiểm tra EOF
DWORD fParity: 1; // cho phép kiểm tra chẵn lẽ
DWORD fOutxCtsFlow:1; // điều khiển luồng ra CTS (Clear To Send)
DWORD fOutxDsrFlow:1; // điều khiển luồng ra DSR (Data Set Ready)
DWORD fDtrControl:2; // kiểu điều khiển luồng DTR (Data Terminal Ready)
DWORD fDsrSensitivity:1; // độ nhạy DSR
DWORD fTXContinueOnXoff:1; // XOFF tiếp tục Tx
DWORD fOutX: 1; // điều khiển luồng ra XON/XOFF
DWORD fInX: 1; // điều khiển luồng vào XON/XOFF
DWORD fErrorChar: 1; // cho phép thay thế nếu lỗi
DWORD fNull: 1; // cho phép cắt bớt phần NULL
DWORD fRtsControl:2; // điều khiển luồng RTS (Ready To Send)
DWORD fAbortOnError:1; // bỏ qua nếu lỗi
DWORD fDummy2:17; // dành riêng
WORD wReserved; // trạng thái không sử dụng
WORD XonLim; // ngưỡng truyền XON
WORD XoffLim; // ngưỡng truyền XOFF
BYTE ByteSize; // số lượng bit/byte, 4-8
BYTE Parity; // 0-4=no,odd,even,mark,space
BYTE StopBits; // 0,1,2 = 1, 1.5, 2
char XonChar; // kí tự XON Tx và Rx
char XoffChar; // kí tự XOFF Tx và Rx
char ErrorChar; // kí tự thay thế nếu lỗi
char EofChar; // kí tự kết thúc
char EvtChar; // kí tự trạng thái nhận
WORD wReserved1; // dành riêng, không sử dụng
} DCB;
Các thành phần

DCBlength
Xác định chiều dài (byte) của khối cấu trúc DCB.

BaudRate
Xác định tốc độ baud mà ở đó thiết bị hoạt động. Thành phần này có thể là
giá trị hiện tại, hay là một trong các giá trị sau:
CBR_110 //110 bits per second
CBR_19200
CBR_300
CBR_38400
CBR_600
CBR_56000
CBR_1200
CBR_57600
CBR_2400
CBR_115200
CBR_4800
CBR_128000
CBR_9600
CBR_256000
CBR_14400
fBinary
Chỉ định chế độ nhị phân. Các hàm Window32 API không hỗ trợ chế độ
không phải là nhị phân, vì vậy giá trị này phải luôn là TRUE.
fParity
Chỉ định xem có cho phép kiểm tra chẵn lẻ không. Nếu TRUE, thực hiện
kiểm tra chẵn lẽ với báo cáo lỗi nếu có.
fOutxCtsFlow
Xác định xem tín hiệu CTS (clear-to-send) có được giám sát cho điều khiển
luồng ra hay không. Nếu TRUE và CTS tắt, đầu ra sẽ được dừng cho đến khi CTS
được gửi lại một lần nữa.
fOutxDsrFlow
Xác định xem tín hiệu DSR (Data-Send-Ready) có được giám sát cho điều
khiển luồng ra hay không. Nếu TRUE và DSR tắt, đầu ra sẽ được dừng cho đến
khi DSR được gửi lại một lần nữa.
fDtrControl
Xác định điều khiển luồng DTR (data-terminal-ready). Thành phần này có
thể là một trong các giá trị sau.
Giá trị Ý nghĩa
DTR_CONTROL_DISABLE Vô hiệu hóa DTR.
DTR_CONTROL_ENABLE Cho phép DTR
DTR_CONTROL_HANDSHAKE Cho phép DTR dạng ‘bắt tay’. nếu handshake
được phép, Nếu ứng dụng tăng dòng bằng hàm
EscapeCommFunction thì sẽ gây ra lỗi.

fDsrSensitivity
Xác định xem trình điều khiển truyền thông sẵn sàng ở trạng thái đón nhận
tín hiệu DSRl. Nếu gí trị này TRUE thì trình điều khiển sẽ bỏ qua tất cả các byte
dữ liệu nhận được trừ khi đường vào DSR của modem đang ở trạng thái cao.

fTXContinueOnXoff
Xác định việc truyền có dừng lại khi bộ đệm vào đầy và trình điều khiển
thiết bị đã truyền kí tự XoffChar. Nếu mang giá trị TRUE, việc truyền tiếp tục sau
khi bộ đệm vào đạt đến giá trị XoffLim xác định đầy và trình điều khiển thiết bị
đã truyền kí tự XoffChar để dừng việc nhận các byte. Nếu mang giá trị FALSE,
việc truyền không tiếp tục cho đến khi bộ đệm vào trong phạm vi XonLim là rỗng
và trình điều khiển thiết bị đã truyền kí tự XonChar để tiếp tục nhận.

fOutX
Xác định xem điều khiển luồng XON/XOFF có được sử dụng trong suốt
quá trình truyền. Nếu mang gía trị TRUE, việc truyền dừng khi nhận được kí tự
XoffChar và bắt đầu lại khi nhận được kí tự XonChar.

fInX
Xác định xem điều khiển luồng XON/XOFF được sử dụng trong suốt quá
trình nhận. Nếu TRUE, kí tự XoffChar được gửi khi bộ đệm vào ở trong khoảng
XoffLim là đầy, và kí tự XonChar được gửi khi bộ đệm vào XonLim là rỗng.

fErrorChar
Xác định xem các byte đã nhận có lỗi chẵn lẽ được thay thế bằng các kí tự
thuộc ErrorChar. Nếu TRUE và fParity TRUE, việc thay thế xảy ra.

fNull
Xác định em có bỏ qua byte rổng không. Nếu TRUE, thực hiện bỏ qua.

fRtsControl
Xác định điều khiển luồng RTS (request-to-send). Có thể có các giá trị sau:
Giá trị Ý nghĩa
RTS_CONTROL_DISABLE Vô hiệu hóa dòng RTS.
RTS_CONTROL_ENABLE Cho phép dòng RTS.
RTS_CONTROL_HANDSHAKE Cho phép chế độ bắt tay RTS. Trình điều
khiển thiết bị nâng dòng RTS khi bộ đệm
(vào) "type-ahead" bé hơn một nữa so với
khi đầy và hạ dòng RTS khi bộ đệm lớn hơn
¾ so với khi đầy. Nếu chế độ bẳt tay được
cho phép, thì sẽ gây lỗi cho ứng dụng nếu
thực hiện tăng dòng sử dụng hàm
EscapeCommFunction.
RTS_CONTROL_TOGGLE Xác định rằng dòng RTSsẽ ở trạng thái cao
nếu byte sẵn sàng để truyền. Sau khi tất cả
các byte trong bộ đệm được gửi, dòng RTS
sẽ trở về trạng thái thấp.

fAbortOnError
Xác định xem quá trình đọc ghi có bị dừng lại khi xảy ra lỗi hay không.
Nếu TRUE, trình điều khiển thiết bị sẽ bỏ qua tất cả các thao tác đọc ghi cùng với
một trạng thái lỗi. Trình điều khiển thiết bị sẽ không thực hiện bất kì thao tác đọc
ghi nào cho đến khi ứng dụng xác nhận lỗi bằng cách gọi hàm ClearCommError.
fDummy2
Dành riêng, không sử dụng
wReserved
Không sử dụng, mang giá trị 0.
XonLim
Xác định số lượng tối thiểu các byte trong bộ đệm vào trước khi kích hoạt
điều khiển luồng để ngăn chặn đầu gửi. Chú ý rằng đầu gửi có thể truyền các kí tự
sau khi tín hiệu điều khiển luồng được kích hoạt, vì vậy giá trị này phải luôn khác
0. Điều này xem hoặc điều khiển luồng XON/XOFF, RTS, hay DTR được xác
định trong fInX, fRtsControl, hay fDtrControl.

XoffLim
Xác định số lượng tối đa các byte được phép ở trong bộ đệm vào trước khi
điều khiển luồng được kích hoạt để cho phép truyền bởi đầu gửi. Xem như hoặc
điều khiển luồng vào XON/XOFF, RTS, hay DTR được xác định trong fInX,
fRtsControl, hay fDtrControl. Số lượng tối đa các byte được cho phép tính bằng
cách trừ giá trị này với kích thước (byte) của bộ đệm vào.

ByteSize
Xác định số bit/byte ở đầu nhận và gửi.

Parity
Xác định mô hình chắn lẽ được dùng. Có các giá trị sau:
Giá trị Ý nghĩa
EVENPARITY Ngang bằng
MARKPARITY Đánh dấu
NOPARITY Không có
ODDPARITY Lẽ
SPACEPARITY Khoảng trắng

StopBits
Xác định số lượng các bit dừng được sử dụng. Có thể có các giá trị sau
Giá trị Ý nghĩa
ONESTOPBIT 1 bit dừng
ONE5STOPBITS 1.5 bit dừng
TWOSTOPBITS 2 bit dừng

XonChar
Xác định kí tự XON cho cả truyền và nhận.
XoffChar
Xác định kí tự XOFF cho cả truyền và nhận.
ErrorChar
Xác định kí tự thay thế trong trường hợp lỗi chẵ lẽ.
EofChar
Xác định kí tự kết thúc.
EvtChar
Xác định kí tự tín hiệu.
wReserved1
Không dùng.

Ghi chú
Khi một khối câu trúc DCB được sử dụng để cấu hình 8250, các giá trị sau
được chỉ định thiết lập thành phần ByteSize và StopBits:

• Số lượng databit phải là 5 đến 8 bit.


• Sử dụng 5 bit dữ liệu với 2 bit dừng là một sự kết hợp sai, cũng giống như
6, 7, hay 8 bit dữ liệu với 1.5 bit dừng.

5. Hàm GetCommState
Hàm nhận về thiết lập hiện thời của thiết bị thông tin hiện tại.

BOOL GetCommState(
HANDLE hFile, // trỏ đến thiết bị thông tin
LPDCB lpDCB // khối điều khiển thiết bị
);
Các tham số
hFile
[vào] Trỏ đến thiết bị thông tin. Hàm CreateFile trả về con trỏ này.
lpDCB
[ra] Trỏ đến cấu trúc DCB nhận về thông tin thiết lập.

Các giá trị trả về


Giá trị trả về khác không nếu thành công. ngược lại trả về 0, dùng hàm
GetLastError để biết chi tiết lỗi.

6. Hàm SetCommState
Hàm SetCommState cấu hình thiết bị thông tin dựa trên thông tin có trong
khối DCB. Hàm thiết lập tất cả các giá trị phần cứng và điều khiển nhưng không
xóa dữ liệu trong bộ đệm.
BOOL SetCommState(
HANDLE hFile, // trỏ đến thiết bị thông tin
LPDCB lpDCB // khối thông tin điều khiển
);
Các tham số
hFile
[vào] trỏ đến thiết bị thông tin. Hàm CreateFile trả về con trỏ này.
lpDCB
[vào] Trỏ đến khối DCB chứa thông tin cấu hình thiết bị.

Các giá trị trả về


Hàm thành công nếu giá trị trả về khác 0.
Hàm thất bại nếu giá trị trả về bằng 0, dùng hàm GetLastError để lấy chi
tiết lỗi.
Ghi chú
Hàm SetCommState sử dụng khối DCB để xác định cấu hình mình muốn.
Hàm GetCommState Trả về thiết lập hiện tại.
Để thiết lập một vài tham số của khối cấu trúc DCB, bạn nên hiệu chỉnh
khối DCB đã được điền bằng cách gọi GetCommState. Điều này bảo đảm rằng
cấu trúc DCB có các giá trị phù hợp.
Hàm SetCommState thất bại nếu thành phần XonChar của cấu trúc DCB
bằng thành phần XoffChar.
Khi hàm SetCommState được sử dụng để cấu hình 8250, ràng buộc áu
được áp đặt cho thành phần ByteSize và StopBits của DCB:

Số lượng bit dữ liệu phải từ 5 đến 8.

7. Cấu trúc COMSTAT


Cấu trúc COMSTAT chứa thông tin về thiết bị truyền thông. cấu trúc này
được điền bởi hàm ClearCommError.
typedef struct _COMSTAT {
DWORD fCtsHold : 1;
DWORD fDsrHold : 1;
DWORD fRlsdHold : 1;
DWORD fXoffHold : 1;
DWORD fXoffSent : 1;
DWORD fEof : 1;
DWORD fTxim : 1;
DWORD fReserved : 25;
DWORD cbInQue;
DWORD cbOutQue;
} COMSTAT, *LPCOMSTAT;

Các thành phần


fCtsHold
Xác định xem việc truyền có phải chờ tín hiệu CTS (clear-to-send). Nếu
TRUE việc truyền phải chờ.

fDsrHold
Xác định xem việc truyền có phải chờ tín hiệu DSR (data-set-ready) để
được gửi hay không. Nếu TRUE, đang chờ.

fRlsdHold
Xác định xe viêc truyền có phải chờ tín hiệu RLSD (receive-line-signal-
detect) để được gửi hay không. Nếu TRUE, đang chờ.

fXoffHold
Xác định xem việc truyền phải chờ vì nhận được kí tự XOFF hay không.
Nếu TRUE, đang chờ.
fXoffSent
Xác định xem quá trình truyền đang đợi vì kí tự XOFF đã được gửi hay
không. Nếu TRUE, đang đợi. Treo quá trình truyền khi kí tự XOFF được truyền
đến hệ thống mà hệ thống đó nhận kí tự tiếp theo như là XON mà không quan tâm
đến kí tự hiện tại.

fEof
Xác định xem kí tự end-of-file (EOF) vừa được nhận hay không. Nếu
TRUE, kí tự EOF vừa được nhận.

fTxim
Nếu TRUE, có một kí tự được xếp hàng để truyền mà kí tự đó được gửi đến
thiết bị bằng cách sử dụng hàm TransmitCommChar. Thiết bị thông tin truyền
liên tục các kí tự trong bộ đệm ra của thiết bị.

fReserved
Không sử dụng.

cbInQue
Xác định số lượng các byte được nhận từ đầu gửi nối tiếpnhưng chưa được
đọc bởi thao tác ReadFile.

cbOutQue
Xác định số lượng byte dữ liệu người dùng còn lại cần truyền bằng thao tác
ghi. Giá trị này bằng 0 cho việc ghi không phủ chồng.
8. Hàm ReadFile
Hàm ReadFile đọc dữ liệu từ một file, bắt đầu tại vị trí được xác định bởi
con trỏ file. Sau khi quá trình đọc hoàn tất, con trỏ file tăng lên một số bằng số
byte vừa đọc được, ngoại trừ trường hợp con trỏ file được tạo với thuộc tính phủ
chồng (overlap). Nếu con trỏ file được tạo cho việc vào ra phủ chồng (I/O), Ứng
dụng phải tự thực hiện tăng con trỏ file sau mỗi phép đọc file.
Hàm này được thiết kế cho cả thao tác đồng bộ và không đồng bộ. Hàm
ReadFileEx chỉ được thiết kế cho thao tác không đồng bộ. Nó cho phép ứng dụng
thực hiện phép xử lí khác trong suốt quá trình đọc file.
BOOL ReadFile(
HANDLE hFile, // trỏ đến file
LPVOID lpBuffer, // bộ đệm dữ liệu
DWORD nNumberOfBytesToRead, // số lượng byte để đọc
LPDWORD lpNumberOfBytesRead, // số lượng byte đọc được
LPOVERLAPPED lpOverlapped // bộ đệm phủ lắp
);
Các tham số

hFile
[vào] Trỏ đến file cần đọc. Con trỏ file phải được tạo với truy cập
GENERIC_READ.

lpBuffer
[ra] Trỏ đến bộ đệm nhận dữ liệu đọc được từ file.
nNumberOfBytesToRead
[vào] Xác định số byte cần đọc.

lpNumberOfBytesRead
[ra] Trỏ đến một biến nhận giá trị là số byte đọc được. Hàm ReadFile đặt
giá trị này về 0 trước khi thực hiện mọi thao tác hay kiểm lỗi. Nếu tham số này
bằng 0 khi hàm ReadFile trả về TRUE trên một ống được đặt tên, đầu còn lại của
ống thông điệp được gọi là hàm WriteFile với nNumberOfBytesToWrite đặt bằng
0.

lpOverlapped
[vào] Trỏ đến một cấu trúc phủ chồng OVERLAPPED. Cấu trúc này được
yêu cầu nếu hFile được tạo với cờ FILE_FLAG_OVERLAPPED.
Nếu hFile được mở với cờ FILE_FLAG_OVERLAPPED, tham số
lpOverlapped phải khác NULL. Nó phải trỏ đến một cấu trúc OVERLAPPED
phù hợp. Nếu hFile được tạo với cờ FILE_FLAG_OVERLAPPED và
lpOverlapped bằng NULL, hàm có thể báo cáo sai rằng thao tác đọc đã hoàn tất.
Nếu hFile được mở với cờ FILE_FLAG_OVERLAPPED và lpOverlapped
khác NULL, thao tác đọc bắt đầu tại offset được xác định trong cấu trúc
OVERLAPPED và ReadFile có thể trả về trước khi thao tác đọc file hoàn tất.
Trong trường hợp này, ReadFile trả về FALSE và hàm GetLastError trả về lỗi
ERROR_IO_PENDING. Điều này cho phép tiếp tục thực hiện tiến trình trong khi
thao tác đọc hoàn tất. Sự kiện được xác định trong cấu trúc OVERLAPPED được
đặt cho tín hiệu trạng thái trước khi việc đọc hoàn tất.
Nếu hFile không được mở với FILE_FLAG_OVERLAPPED và
lpOverlapped là NULL, thao tác đọc bắt đầu tại vị trí hiện tại của file và ReadFile
không trả về cho đến khi việc đọc hoàn tất.
Giá trị trả về
Hàm thành công nếu giá trị trả về khác 0.
Hàm thất bại nếu giá trị trả về bằng 0, dùng hàm GetLastError để lấy chi
tiết lỗi.
9. Hàm WriteFile
Hàm WriteFile ghi dữ liệu vào một file, bắt đầu tại vị trí được xác định bởi
con trỏ file. Sau khi quá trình ghi hoàn tất, con trỏ file tăng lên một số bằng số
byte vừa ghi được, ngoại trừ trường hợp con trỏ file được tạo với thuộc tính phủ
chồng (overlap). Nếu con trỏ file được tạo cho việc vào ra phủ chồng, Ứng dụng
phải tự thực hiện tăng con trỏ file sau mỗi phép ghi file.
Hàm này được thiết kế cho cả thao tác đồng bộ và không đồng bộ. Hàm
WriteFileEx chỉ được thiết kế cho thao tác không đồng bộ. Nó cho phép ứng dụng
thực hiện phép xử lí khác trong suốt quá trình ghi file.
BOOL WriteFile(
HANDLE hFile, // handle to file
LPCVOID lpBuffer, // data buffer
DWORD nNumberOfBytesToWrite, // number of bytes to write
LPDWORD lpNumberOfBytesWritten, // number of bytes written
LPOVERLAPPED lpOverlapped // overlapped buffer
);
Các tham số
hFile
[vào] Trỏ đến file cần ghi. Con trỏ file phải được tạo với phương thức truy
cập GENERIC_WRITE.

lpBuffer
[vào] Trỏ đến bộ đệm chứa dữ liệu cần ghi vào file.

nNumberOfBytesToWrite
[vào] Xác định số lượng byte cần ghi.
Giá trị 0 xác định không ghi gì cả. Thực hiện thao tác ghi rỗng phụ thuộc
vào hệ thống file cơ bản. Để cát bớt hay mở rộng một fie, xử dụng hàm
SetEndOfFile.
lpNumberOfBytesWritten
[ra] Trỏ đến biến nhận giá tri là số byte ghi được. hàm WriteFile đặt giá trị
này bằng 0 trước khi làm bất cứ việc gì hay kiểm lỗi.

lpOverlapped
[vào] Trỏ đến một cấu trúc OVERLAPPED. Yêu cầu cấu trúc này nếu
hFile được mở với cờ FILE_FLAG_OVERLAPPED.
Nếu hFile được mở với cờ FILE_FLAG_OVERLAPPED, tham số
lpOverlapped phải khác NULL. Nó phải được trỏ đến một cấu trúc
OVERLAPPED phù hợp. Nếu hFile được mở với cờ
FILE_FLAG_OVERLAPPED và lpOverlapped là NULL, hàm có thể báo cáo sai
rằng công việc ghi file đã hoàn tất.
Nếu hFile được mở với cờ FILE_FLAG_OVERLAPPED và lpOverlapped
khác NULL, thao tác ghi bắt đầu tại offset được xác định trong cấu trúc
OVERLAPPED và WriteFile có thể trả về trước khi thao tác ghi file hoàn tất.
Trong trường hợp này, WriteFile trả về FALSE và hàm GetLastError trả về lỗi
ERROR_IO_PENDING. Điều này cho phép tiếp tục thực hiện tiến trình trong khi
thao tác ghi hoàn tất. Sự kiện được xác định trong cấu trúc OVERLAPPED được
đặt cho tín hiệu trạng thái trước khi việc ghi hoàn tất.
Nếu hFile không được mở với FILE_FLAG_OVERLAPPED và
lpOverlapped là NULL, thao tác ghi bắt đầu tại vị trí hiện tại của file và WriteFile
không trả về cho đến khi việc ghi hoàn tất.

Giá trị trả về


Hàm thành công nếu giá trị trả về khác 0.
Hàm thất bại nếu giá trị trả về bằng 0, dùng hàm GetLastError để lấy chi
tiết lỗi.

You might also like