Cổng com trên máy tính là gì? Kết nối cổng usb com trong Windows

Dừng lại một chút- đặt số lượng bit dừng. Lĩnh vực này có thể
lấy các giá trị sau:


  • ONETOPBIT- một bit dừng;
  • ONE5STOPBIT- một bit rưỡi stop (thực tế là không
    đã sử dụng);
  • TWOSTOPBIT- hai bit dừng.

Sau khi điền tất cả các trường của cấu trúc DCB, bạn phải
định cấu hình cổng bằng cách gọi hàm SetCommState:

BOOL SetCommState(

XỬ LÝ hFile,

LPDCB lpDCB

Nếu thành công, hàm sẽ trả về khác 0
giá trị và trong trường hợp có lỗi - bằng không.

Cấu trúc cần thiết thứ hai để cấu hình một cổng là
cấu trúc COMMTIMEOUTS. Nó xác định các tham số của độ trễ thời gian
khi nhận và truyền. Dưới đây là mô tả về cấu trúc này:

cấu trúc typedef _COMMTIMEOUTS (

DWORD ReadIntervalTimeout;

DWORD ReadTotalTimeoutMultiplier;

DWORD ReadTotalTimeoutConstant;

DWORD WriteTotalTimeoutMultiplier;

DWORD WriteTotalTimeoutConstant;

) COMMTIMEOUT,*LPCOMMTIMEOUT;

Các trường của cấu trúc COMMTIMEOUTS có ý nghĩa như sau:


  • Đọc Khoảng thời gian chờ- khoảng thời gian tối đa
    (tính bằng mili giây) được phép giữa hai giây đọc
    đường dây liên lạc với các ký tự liên tiếp. Trong lúc
    thao tác đọc, khoảng thời gian bắt đầu được tính từ thời điểm
    nhận ký tự đầu tiên. Nếu khoảng cách giữa hai
    các ký tự liên tiếp vượt quá giá trị được chỉ định, thao tác
    quá trình đọc hoàn tất và tất cả dữ liệu tích lũy trong bộ đệm sẽ được chuyển
    đến chương trình. Giá trị bằng 0 cho trường này có nghĩa là
    không có thời gian chờ được sử dụng.
  • ĐọcTotalTimeoutMultiplier- đặt hệ số nhân (trong


    nhân với số ký tự được yêu cầu đọc.
  • ĐọcTotalTimeoutHằng số- chỉ định một hằng số (trong

    thao tác đọc. Đối với mỗi thao tác đọc, giá trị này
    được thêm vào kết quả của phép nhân ReadTotalTimeoutMultiplier với
    số ký tự được yêu cầu đọc. Giá trị trường rỗng
    ReadTotalTimeoutMultiplier và ReadTotalTimeoutConstant có nghĩa là
    rằng thời gian chờ chung cho thao tác đọc không được sử dụng.
  • ViếtTotalTimeoutHệ số nhân- đặt hệ số nhân (trong
    mili giây) được sử dụng để tính toán thời gian chờ tổng thể

    nhân với số ký tự được viết.
  • Viết Tổng thời gian chờ Hằng số- chỉ định một hằng số (trong
    mili giây) được sử dụng để tính toán thời gian chờ tổng thể
    thao tác ghi. Đối với mỗi thao tác ghi, giá trị này
    được thêm vào kết quả của phép nhân WriteTotalTimeoutMultiplier với
    số ký tự cần viết. Giá trị trường rỗng
    WriteTotalTimeoutMultiplier và WriteTotalTimeoutConstant có nghĩa là
    rằng thời gian chờ chung cho thao tác ghi không được sử dụng.

Nói thêm một chút về thời gian chờ. Hãy để chúng tôi đọc từ cổng 50
ký tự ở tốc độ 9.600 bps. Nếu sử dụng 8 bit
cho mỗi ký tự, phần bù chẵn lẻ và một bit dừng, sau đó là một
một ký tự trên dòng vật lý dài 11 bit (bao gồm cả bit bắt đầu).
Điều này có nghĩa là sẽ nhận được 50 ký tự với tốc độ 9.600 bps

50×11/9600=0,0572916 giây

hoặc khoảng 57,3 mili giây, giả sử khoảng thời gian bằng 0
giữa việc nhận các ký tự liên tiếp. Nếu khoảng thời gian giữa
các ký hiệu xấp xỉ một nửa thời gian truyền của một
ký tự, tức là 0,5 mili giây thì thời gian tiếp nhận sẽ là

50×11/9600+49×0,0005=0,0817916 giây

hoặc khoảng 82 mili giây. Nếu trong quá trình đọc nhiều hơn
82 mili giây thì chúng ta có thể cho rằng đã xảy ra lỗi trong
hoạt động của thiết bị bên ngoài và chúng ta có thể ngừng đọc, từ đó
tránh tình trạng đóng băng chương trình. Đây là thời gian chờ hoạt động chung
đọc. Tương tự, có một khoảng thời gian chờ chung cho thao tác ghi.

Công thức tính tổng thời gian chờ của một thao tác, ví dụ:
đọc trông như thế này:

NumOfChar x ReadTotalTimeoutMultiplier +
ĐọcTotalTimeoutHằng số

trong đó NumOfChar là số ký tự được yêu cầu cho thao tác đọc.

Trong trường hợp của chúng tôi, thời gian chờ ghi có thể được bỏ qua và
đặt chúng về không.

Sau khi điền cấu trúc COMMTIMEOUTS, bạn cần gọi
chức năng thiết lập thời gian chờ:

BOOL SetCommTimeouts(

XỬ LÝ hFile,

LPCOMMTIMEOUTS lpCommTimeouts

Vì các hoạt động truyền và nhận được thực hiện ở tốc độ thấp,
đệm dữ liệu được sử dụng. Để đặt kích thước bộ đệm nhận và
chuyển bạn cần sử dụng chức năng:

BOOL SetupComm(

XỬ LÝ hFile,

DWORD dwInQueue,

DWORD dwOutQueue

Giả sử bạn trao đổi gói với một thiết bị bên ngoài
kích thước thông tin là 1024 byte, sau đó là kích thước bộ đệm hợp lý
giá trị sẽ là 1200. Hàm SetupComm thú vị ở chỗ nó có thể
chỉ cần tính đến số đo của bạn và thực hiện các điều chỉnh của riêng bạn, hoặc
từ chối hoàn toàn kích thước bộ đệm được đề xuất của bạn - trong trường hợp này
chức năng này sẽ thất bại.

Tôi sẽ đưa ra một ví dụ về việc mở và cấu hình một serial
cổng COM1. Để ngắn gọn - không xác định lỗi. Trong ví dụ này
cổng mở ra hoạt động ở tốc độ 9.600 bps, 1 được sử dụng
bit dừng, bit chẵn lẻ không được sử dụng:

#bao gồm

. . . . . . . . . .

tay cầm XỬ LÝ;

COMMTIMEOUTS CommTimeOuts;

DCB dcb;

xử lý = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE,
KHÔNG, KHÔNG, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);

SetupComm(xử lý, SizeBuffer, SizeBuffer);

GetCommState(xử lý, &dcb);

dcb.BaudRate = CBR_9600;

dcb.fBinary = TRUE;

dcb.fOutxCtsFlow = FALSE;

dcb.fOutxDsrFlow = FALSE;

dcb.fDtrControl = DTR_Control_HANDSHAKE;

dcb.fDsrSensitivity = FALSE;

dcb.fNull = FALSE;

dcb.fRtsControl = RTS_Control_DISABLE;

dcb.fAbortOnError = FALSE;

dcb.ByteSize = 8;

dcb.Parity = KHÔNG ĐẶC BIỆT;

dcb.StopBits = 1;

SetCommState(xử lý, &dcb);

CommTimeOuts.ReadIntervalTimeout= 10;

CommTimeOuts.ReadTotalTimeoutMultiplier = 1;

// giá trị của những khoảng thời gian chờ này là khá đủ để tự tin
thu nhận

// ngay cả ở tốc độ 110 baud

CommTimeOuts.ReadTotalTimeoutConstant = 100;

// được sử dụng trong trường hợp này như một thời gian chờ đợi
bưu kiện

CommTimeOuts.WriteTotalTimeoutMultiplier = 0;

CommTimeOuts.WriteTotalTimeoutConstant = 0;

SetCommTimeouts(xử lý, &CommTimeOuts);

PurgeComm(xử lý, PURGE_RXCLEAR);

PurgeComm(xử lý, PURGE_TXCLEAR);

Sau khi mở port việc đầu tiên bạn cần làm là reset lại nó
làm sao có thể có “rác” trong bộ đệm nhận và truyền. Vì thế ở
Ở cuối ví dụ, chúng tôi đã sử dụng một hàm mà trước đây chúng tôi chưa biết
Thanh lọcComm:

BOOL PurgeComm(

XỬ LÝ hFile,

DWORD dwCờ

Hàm này có thể làm hai việc: xóa hàng đợi
tiếp nhận và truyền tải trong trình điều khiển hoặc hoàn thành mọi hoạt động
Vào/ra Những hành động cần thực hiện là do người khác đặt ra
tham số:


  • PURGE_TXABORT
    hồ sơ, ngay cả khi chúng chưa được hoàn thành;
  • PURGE_RXABORT- ngay lập tức dừng mọi hoạt động
    bài đọc, ngay cả khi chúng chưa được hoàn thành;
  • PURGE_TXCLEAR- xóa hàng đợi truyền trong trình điều khiển;
  • PURGE_RXCLEAR- xóa hàng đợi nhận
    tài xế.
    Các giá trị này có thể được kết hợp bằng cách sử dụng bitwise
    HOẶC hoạt động. Bạn cũng nên xóa bộ đệm sau khi xảy ra lỗi
    tiếp nhận và truyền tải và sau khi hoàn thành công việc với cảng.

Đã đến lúc xem xét lại các hoạt động.
đọc-ghi cho cổng. Đối với việc làm việc với các tập tin, chúng được sử dụng
Chức năng ReadFile và WriteFile. Đây là nguyên mẫu của họ:

Tệp đọc BOOL(

XỬ LÝ hFile,

Bộ đệm LPVOID,

DWORD nNumOfBytesToRead,

LPDWORD lpNumOfBytesRead,

LPOVERLAPPED lpChồng chéo

BOOL WriteFile(

XỬ LÝ hFile,

Bộ đệm LPVOID,

DWORD nNumOfBytesToWrite,

LPDWORD lpNumOfBytesViết,

LPOVERLAPPED lpChồng chéo

Hãy xem xét mục đích của các tham số của các chức năng này:


  • hFile- mô tả của tập tin giao tiếp mở
    Hải cảng;
  • bộ đệm lp- địa chỉ bộ đệm. Đối với thao tác ghi, dữ liệu từ
    bộ đệm này sẽ được gửi đến cổng. Đối với một hoạt động đọc trong này
    bộ đệm sẽ chứa dữ liệu nhận được từ dòng;
  • nNumOfBytesToRead, nNumOfBytesToWrite- số lượng dự kiến
    byte dành cho việc tiếp nhận hoặc truyền tải;
  • nNumOfBytesĐọc, nNumOfBytesViết- số thực tế
    byte được nhận hoặc truyền. Nếu nhận hoặc truyền ít hơn
    dữ liệu hơn yêu cầu thì đối với tệp đĩa, điều này cho biết
    về một lỗi, nhưng đối với một cổng giao tiếp - không cần thiết chút nào.
    Lý do là hết thời gian.
  • LpChồng chéo- địa chỉ của cấu trúc OVERLAPPED được sử dụng
    cho các hoạt động không đồng bộ.

Nếu các hàm hoàn thành bình thường, chúng sẽ trả về giá trị
khác với 0, trong trường hợp có lỗi - bằng 0.

Đây là một ví dụ về thao tác đọc và ghi:

#bao gồm

…………..

Số DWORD, số_ok, tạm thời;

COMSTAT ComState;

CHỒNG CHỒNG Chồng chéo;

char buf_in = "Xin chào!";

số lượng = 6;

// nếu nhiệt độ khác 0 thì cổng ở trạng thái
lỗi

if(!temp) WriteFile(handle, buf_in,numytes,
&numbytes_ok, &Chồng chéo);

ClearCommError(xử lý, &temp, &ComState);

if(!temp) ReadFile(handle, buf_in,numytes, &numbytes_ok,
&Chồng chéo);

// biếnnumytes_ok chứa số thực
chuyển nhượng-

// đã nhận byte

Trong ví dụ này, chúng tôi đã sử dụng hai
Cấu trúc COMSTAT và OVERLAPPED, cũng như hàm ClearCommError. Vì
Trong trường hợp giao tiếp “qua ba dây” của chúng ta, cấu trúc OVERLAPPED không thể được sử dụng
xem xét (chỉ sử dụng như trong ví dụ). Nguyên mẫu hàm
ClearCommError trông giống như:

BOOL ClearCommError(

XỬ LÝ hFile,

LPDWORD lpLỗi,

LPCOMSTAT lpStat

Chức năng này đặt lại cờ lỗi cổng (nếu có).
place) và trả về thông tin về trạng thái của cổng trong cấu trúc
COMSTAT:

cấu trúc typedef _COMSTAT

DWORD fCtsHold:1;

DWORD fDsrHold:1;

DWORD fRlsdHold:1;

DWORD fXoffHold:1;

DWORD fXoffĐã gửi:1;

DWORD của:1;

DWORD fTxim:1;

DWORD fReserved:25;

DWORD cbInQue;

DWORD cbOutQue;

) COMSTAT, *LPCOMSTAT;

Chúng ta có thể thấy hai trường của cấu trúc này hữu ích:


  • CbInQue- số ký tự trong bộ đệm nhận. Những ký tự này
    được chấp nhận từ dòng, nhưng chưa được chức năng ReadFile đọc;
  • CbOutQue- số lượng ký tự trong bộ đệm truyền. Những cái này
    các ký tự vẫn chưa được chuyển xuống dòng.

Các trường còn lại của cấu trúc này chứa thông tin về
những sai lầm.

Cuối cùng, khi sử dụng xong cổng, bạn nên đóng nó lại.
Việc đóng một đối tượng trong Win32 được thực hiện bằng hàm CloseHandle:

BOOL CloseHandle(

XỬ LÝ hObject

Trên trang web của chúng tôi, bạn có thể tìm thấy toàn bộ nội dung của lớp học để làm việc với
cổng nối tiếp ở chế độ không đồng bộ “qua ba dây” và
Xem thêm một chương trình ví dụ sử dụng lớp này. Tất cả điều này
được viết bằng Builder C++, nhưng vì chỉ sử dụng các hàm
API Win32, văn bản chương trình có thể dễ dàng thay đổi cho bất kỳ trình biên dịch C++ nào.
Cũng có thể lớp học không được viết hoàn toàn “theo quy tắc” - xin vui lòng
Xin lỗi, tác giả không phải là một lập trình viên “đúng chuẩn” và viết như thế này,
thật tiện lợi cho anh ấy J .

Ồ, thứ này là gì vậy? Tại sao nó lại cần thiết? Có ổn không nếu tôi chạm vào nó bằng ngón tay? Cái gì? Tốt hơn không? Được thôi, tôi sẽ không làm vậy. Nhưng đối với tôi điều đó thật thú vị: có một đầu nối trong máy tính, nhưng vì lý do nào đó mà không ai kết nối bất cứ thứ gì với nó. Nó thậm chí còn được gọi là gì? Hải cảng? Ồ! Lớp học! Và nó là gì?..

Cổng này còn được gọi là nối tiếp (Cổng nối tiếp), mặc dù việc giảm "COM" thực sự có nghĩa là "giao tiếp" - Cổng giao tiếp(ban đầu được thiết kế để di chuyển dữ liệu hai chiều - giao tiếp thực sự). Và thậm chí thường xuyên hơn nó được gọi là nhất quán, vì nó truyền từng bit một cách nghiêm ngặt.

Ngoài cổng nối tiếp, máy tính còn có cổng song song, chủ yếu dùng để kết nối máy in. Nó thường được gọi là: máy in. Ở đó, việc truyền dữ liệu về danh nghĩa là một chiều (mặc dù chỉ trên danh nghĩa).

Rất có thể máy tính của bạn cũng có cổng COM. Đây rất có thể là một ổ cắm hơi thuôn dài với chín tiếp điểm thành hai hàng, năm và bốn hàng mỗi hàng, đồng thời cũng có ren cho các bu lông ở hai đầu. Nó đi kèm với một dây cáp có đầu nối tương ứng với chín ổ cắm nằm trong cùng một cấu hình.

Đầu nối được cắm vào ổ cắm bằng các tiếp điểm và vặn bằng các bu lông trên để không bị rơi ra ngoài. Bằng cách này, chẳng hạn, bạn có thể kết nối trực tiếp hai máy tính bằng cáp modem rỗng. Đây là điều đã được thực hiện trước đây, trong thời đại của những chiếc PC đầu tiên.

Ngày nay, máy thu vệ tinh, thiết bị của các hệ thống an ninh khác nhau, hệ thống điều khiển quá trình sản xuất và các thiết bị phức tạp khác được kết nối theo cách này.

Có thể có một cổng như vậy trong máy tính xách tay của bạn (tất nhiên, nếu gia đình bạn có một cổng). Ví dụ, nó được sử dụng để đồng bộ hóa với máy tính để bàn. Đúng vậy, trên thực tế ngày nay, kết nối như vậy không được sử dụng thường xuyên - không ai muốn tự đánh lừa mình bằng dây cáp, bởi vì có thể sử dụng các công nghệ khác hiện đại và hiệu quả hơn.

Ngày nay, cổng USB ngày càng được sử dụng nhiều hơn để liên lạc với nhiều thiết bị khác nhau (nhân tiện, nó cũng thực sự là cổng nối tiếp). Modem di động, máy in, bộ điều hợp Wi-Fi - ngày càng có nhiều thiết bị được kết nối qua USB.

Ngoài ra, với sự sẵn có của các công nghệ như Ethernet và FireWire (dành cho Apple), việc kết nối máy tính bằng dây qua cổng COM là không thực tế lắm. Chà, nếu bạn nhớ về Bluetooth (tạm dịch là "răng xanh"), thì bạn thậm chí có thể gửi cổng nối tiếp đến bảo tàng.

Tuy nhiên, hệ điều hành Windows vẫn đặt tên các kênh truyền thông tin của mình là COM1, COM2, v.v.

Tại sao? Bởi vì các trình điều khiển, chẳng hạn như dành cho Bluetooth, có thể xuất hiện trên hệ thống chính xác dưới dạng cổng COM. Giống như, chúng tôi đây, xin hãy yêu thương và ủng hộ, hãy chỉ định cho chúng tôi các kênh trao đổi dữ liệu. Vậy nếu chúng ta không thực tế thì sao? Bạn vẫn sẽ phải phục vụ chúng tôi.

Unix (và các biến thể của nó như Linux) cũng có một số điểm đặc biệt liên quan đến thái độ đối với các thiết bị được kết nối. Vì Unix coi mọi thứ xung quanh là tệp (thậm chí cả phần cứng!), nên nó giữ các cổng nối tiếp của nó ở dạng chúng với các tên như ttyS0, ttyS1, ttyS2 (nếu là Linux) hoặc ttyu0, ttyu1, ttyu2 (trong FreeBSD).

Nếu bạn là người dùng đơn giản và không làm việc với các thiết bị cụ thể, máy thu vệ tinh và các thiết bị phức tạp khác, thì hoàn toàn không cần phải chạy đến các cửa hàng máy tính và tìm cáp cho cổng COM.

Dữ liệu từ máy tính này sang máy tính khác có thể được truyền theo nhiều cách khác nhau, bao gồm cả việc không cần bất kỳ dây dẫn nào. Phương án cuối cùng là chuyển nó sang ổ flash nếu mạng cục bộ không hoạt động vì lý do nào đó.

Tóm lại, mặc dù thứ như cổng COM vẫn tiếp tục tồn tại theo quan điểm của hệ điều hành và thậm chí còn được sử dụng như một kênh liên lạc ảo, nhưng trên thực tế, hầu hết người dùng có thể quên nó với lương tâm hoàn toàn trong sáng.

Đúng là sự tò mò luôn đáng khen ngợi. Vì vậy hãy hỏi, quan tâm, nghiên cứu. Nhưng tốt hơn hết là đừng dùng tay chạm vào nó khi chưa được phép.

Các ấn phẩm trước đây:

Gần đây, phương thức truyền dữ liệu nối tiếp đã thay thế phương thức truyền dữ liệu song song.
Bạn không cần phải tìm đâu xa để tìm ví dụ: sự xuất hiện của bus USB và SATA đã nói lên điều đó.
Thật vậy, vì bus song song khó mở rộng quy mô (kéo dài cáp, tăng tần số xung nhịp bus), không có gì đáng ngạc nhiên khi các công nghệ đang quay lưng lại với bus song song.

Giao diện nối tiếp

Ngày nay có rất nhiều giao diện truyền dữ liệu nối tiếp khác nhau.
Ngoài USB và SATA đã được đề cập, bạn cũng có thể nhớ lại ít nhất hai tiêu chuẩn nổi tiếng RS-232 và MIDI (còn được gọi là GamePort).
Điểm chung của chúng là truyền tuần tự từng bit thông tin hoặc Giao diện nối tiếp.
Có rất nhiều lợi thế của các giao diện như vậy và điều quan trọng nhất trong số đó là số lượng dây kết nối nhỏ và do đó giá thấp hơn.

Truyền dữ liệu

Truyền dữ liệu nối tiếp có thể được thực hiện theo hai cách: không đồng bộ và đồng bộ.

Truyền dữ liệu đồng bộ bao gồm việc đồng bộ hóa hoạt động của máy thu và máy phát bằng cách đưa thông tin đồng hồ vào tín hiệu được truyền hoặc bằng cách sử dụng đường đồng bộ hóa đặc biệt.
Bộ thu và bộ phát phải được kết nối bằng cáp đồng bộ đặc biệt để đảm bảo các thiết bị hoạt động ở cùng tần số.

Truyền không đồng bộ liên quan đến việc sử dụng các bit đặc biệt đánh dấu điểm bắt đầu và kết thúc của dữ liệu - bit bắt đầu (số 0 logic) và bit dừng (bit logic một).
Cũng có thể sử dụng bit chẵn lẻ đặc biệt để xác định số bit được truyền là chẵn hay lẻ (tùy thuộc vào quy ước được áp dụng).
Ở đầu nhận, bit này được phân tích và nếu bit chẵn lẻ không tương ứng với số bit một thì gói dữ liệu sẽ được gửi lại.

Điều đáng chú ý là việc kiểm tra như vậy chỉ cho phép bạn phát hiện lỗi nếu chỉ một bit được truyền không chính xác; nếu một số bit được truyền không chính xác, việc kiểm tra này sẽ không chính xác.
Việc gửi gói dữ liệu tiếp theo có thể xảy ra bất cứ lúc nào sau khi gửi bit dừng và tất nhiên phải bắt đầu bằng bit bắt đầu.
Không thể hiểu được điều gì?

Chà, nếu tất cả các công nghệ máy tính đều đơn giản, thì bất kỳ bà nội trợ nào cũng đã tạo ra các giao thức mới song song với bánh bao từ lâu rồi...
Chúng ta hãy thử nhìn vào quá trình một cách khác nhau.
Dữ liệu được truyền theo dạng gói, giống như gói IP, cùng với dữ liệu còn có các bit thông tin, số lượng các bit này có thể thay đổi từ 2 đến 3 rưỡi.
Và một nửa?!
Vâng, bạn đã nghe đúng, chính xác một nửa!

Bit dừng, hay đúng hơn là tín hiệu được truyền tương ứng với bit dừng, có thể có thời lượng dài hơn tín hiệu tương ứng với một bit, nhưng ngắn hơn so với hai bit.
Vì vậy, một gói luôn bắt đầu bằng bit bắt đầu, luôn bằng 0, tiếp theo là các bit dữ liệu, sau đó là bit chẵn lẻ và sau đó là bit dừng, luôn là một.
Sau đó, sau một khoảng thời gian tùy ý, cuộc hành quân chống lại Moscow vẫn tiếp tục.

Phương thức truyền này ngụ ý rằng bộ thu và bộ phát phải hoạt động ở cùng tốc độ (tốt, hoặc gần như cùng tốc độ), nếu không bộ thu sẽ không có thời gian để xử lý các bit dữ liệu đến hoặc sẽ nhầm bit cũ với một cái mới.
Để tránh điều này, mỗi bit được kiểm soát, nghĩa là được gửi đồng bộ với một tín hiệu đặc biệt - “nhấp nháy”, được tạo bên trong thiết bị.
Có một số tốc độ cụ thể cho các thiết bị không đồng bộ - 50, 75, 110, 150, 300, 600, 1200, 2400, 4800, 9600, 19.200, 38.400, 57.600 và 115.200 bit mỗi giây.

Chắc hẳn bạn đã từng nghe nói đơn vị đo tốc độ truyền dữ liệu là “baud” - tần số thay đổi trạng thái đường truyền và giá trị này sẽ chỉ trùng với tốc độ truyền dữ liệu nếu tín hiệu có thể có một trong hai giá trị.
Nếu một số bit được mã hóa trong một lần thay đổi tín hiệu (và điều này xảy ra ở nhiều modem), tốc độ truyền và tần số thay đổi đường truyền sẽ có các giá trị hoàn toàn khác nhau.

Bây giờ là một vài lời về thuật ngữ bí ẩn “gói dữ liệu”.
Một gói trong trường hợp này đề cập đến một tập hợp các bit được truyền giữa các bit bắt đầu và dừng.
Số lượng của họ có thể thay đổi từ năm đến tám.
Người ta có thể thắc mắc tại sao lại có năm đến tám bit?
Tại sao không chuyển một kilobyte dữ liệu trong một gói cùng một lúc?

Câu trả lời rất rõ ràng: khi truyền các gói dữ liệu nhỏ, chúng ta có thể bị mất khi gửi ba bit dịch vụ cùng với chúng (từ 50 đến 30 phần trăm dữ liệu), nhưng nếu gói bị hỏng trong quá trình truyền, chúng ta có thể dễ dàng nhận ra nó (hãy nhớ về bit chẵn lẻ?) và nhanh chóng truyền lại cho anh ta.
Nhưng sẽ khó phát hiện lỗi trong một kilobyte dữ liệu và việc truyền nó sẽ khó khăn hơn nhiều.

Một ví dụ về thiết bị truyền dữ liệu nối tiếp không đồng bộ là cổng COM của máy tính, một modem yêu thích do Trussardi thiết kế và một con chuột được kết nối với cùng một cổng, mà những thư ký ngu ngốc vì lý do nào đó luôn cố gắng đưa vào PS/2.
Tất cả các thiết bị này hoạt động thông qua giao diện RS-232, hay đúng hơn là thông qua phần không đồng bộ của nó, vì tiêu chuẩn cũng mô tả việc truyền dữ liệu đồng bộ.

Phần mềm AMD Radeon Phiên bản Adrenalin 19.9.2 Trình điều khiển tùy chọn

Trình điều khiển tùy chọn AMD Radeon Software Adrenalin Edition 19.9.2 mới cải thiện hiệu suất trong Borderlands 3 và bổ sung hỗ trợ cho công nghệ Radeon Image Sharpening.

Bản cập nhật tích lũy Windows 10 1903 KB4515384 (Đã thêm)

Vào ngày 10 tháng 9 năm 2019, Microsoft đã phát hành bản cập nhật tích lũy cho Windows 10 phiên bản 1903 - KB4515384 với một số cải tiến về bảo mật và bản sửa lỗi làm hỏng Windows Search và gây ra tình trạng sử dụng CPU cao.

Đôi khi bạn phải giải quyết vấn đề kết nối thiết bị điện tử với máy tính, có thể chỉ đơn giản là trao đổi dữ liệu hoặc điều khiển từ xa. Bài viết này mô tả cách thực hiện điều này bằng cách sử dụng cổng nối tiếp. Ưu điểm chính của nó là giao diện lập trình Windows (API) tiêu chuẩn cho phép điều khiển trực tiếp các dòng đầu ra, kiểm soát trực tiếp chúng và có chức năng chờ một số sự kiện liên quan đến cổng COM. Ngoài ra, tiêu chuẩn RS-232, theo đó các cổng COM được tạo ra, cho phép kết nối và ngắt kết nối cáp trong khi thiết bị đang hoạt động (phích cắm nóng).

Sự miêu tả

Cổng COM (cổng nối tiếp)– giao diện hai chiều truyền dữ liệu ở dạng nối tiếp (từng bit) thông qua giao thức RS-232. Đây là giao thức khá phổ biến được sử dụng để kết nối một thiết bị (ví dụ: máy tính) với các thiết bị khác thông qua dây dài tới 30 m. Các mức tín hiệu logic ở đây khác với các mức tín hiệu tiêu chuẩn: một mức logic là từ +5 đến +15V, mức 0 logic là từ -5 đến -15V, yêu cầu các biến đổi mạch bổ sung nhưng mang lại khả năng chống nhiễu tốt.

Hãy xem xét một đầu nối 9 chân (DB-9M). Dưới đây là sơ đồ chân của nó:

Ghim số. Tên Đặc tính của tín hiệu Tín hiệu
1 DCD Đầu vào Phát hiện sóng mang dữ liệu
2 RxD Ngày nghỉ Chuyển dữ liệu
3 TxD Đầu vào Nhận dữ liệu
4 DTR Ngày nghỉ Thiết bị đầu cuối dữ liệu đã sẵn sàng
5 GND - Đất
6 DSR Đầu vào Bộ dữ liệu đã sẵn sàng
7 RTS Ngày nghỉ Yêu cầu để gửi
8 CTS Đầu vào Xóa để gửi
9 R.I. Đầu vào Chỉ báo vòng

Chúng ta sẽ quan tâm nhất đến các chân 2 (truyền dữ liệu), 3 (nhận dữ liệu) và 5 (mặt đất). Đây là mức tối thiểu được đặt cho giao tiếp hai chiều giữa các thiết bị.

Tôi sẽ không tập trung vào mô tả chi tiết về giao thức. Đối với điều này có GOST, v.v. Vì vậy, chúng ta sẽ đi xa hơn và nói về cách kiểm soát con thú này.

Ứng dụng

Như đã đề cập, các cấp độ LAN RS-232 khác với các cấp độ TTL tiêu chuẩn. Vì vậy, chúng ta cần bằng cách nào đó chuyển đổi các giá trị điện áp. Những thứ kia. tạo 5V từ +15V và 0V từ -15V (và ngược lại). Một cách (và có lẽ là đơn giản nhất) là sử dụng chip MAX232 đặc biệt. Thật dễ hiểu và có thể chuyển đổi đồng thời hai tín hiệu logic.

Dưới đây là sơ đồ bao gồm của nó:


Tôi nghĩ sẽ không có khó khăn gì. Đây là một trong những phương án sử dụng con chip này: truyền dữ liệu từ vi điều khiển sang máy tính và ngược lại. Tín hiệu truyền đi đến chân T x IN ở một bên và trên R x VÀO mặt khác. Tín hiệu đầu vào được lấy từ T x NGOÀI và R x OUT tương ứng.

Lập trình

Đầu tiên, hãy nói về các cổng lập trình ở mức độ thấp. Điều này sẽ đúng hơn. Tôi đã tốn rất nhiều công sức để tìm hiểu giao diện này cho đến khi bắt đầu đi sâu vào nguyên lý hoạt động của nó ở mức độ thấp hơn so với việc truyền ký tự đơn giản. Nếu điều này rõ ràng thì sẽ không có vấn đề gì với các ngôn ngữ cấp cao.

Dưới đây là địa chỉ của các cổng COM mà chúng ta sẽ phải làm việc với:

Tên cổng Địa chỉ IRQ
COM 1 3F8h 4
COM 2 2F8h 3
COM 3 3E8h 4
COM 4 2E8h 3

Họ có thể khác nhau. Bạn có thể đặt các giá trị trong cài đặt BIOS. Đây là những địa chỉ cơ sở. Địa chỉ của các thanh ghi chịu trách nhiệm vận hành các cổng sẽ phụ thuộc vào chúng:

Địa chỉ DLAB Đọc viết Viết tắt Tên đăng ký
+ 0 =0 Viết Bộ đệm giữ máy phát
=0 Đọc Bộ đệm nhận
=1 Đọc viết Chốt chia số Byte thấp
+ 1 =0 Đọc viết IER Ngắt Cho phép Đăng ký
=1 Đọc viết Byte cao có chốt chia
+ 2 - Đọc IIR Đăng ký nhận dạng ngắt
- Viết FCR Đăng ký kiểm soát FIFO
+ 3 - Đọc viết LCR Thanh ghi điều khiển dòng
+ 4 - Đọc viết MCR Đăng ký điều khiển modem
+ 5 - Đọc LSR Đăng ký trạng thái dòng
+ 6 - Đọc MSR Đăng ký trạng thái modem
+ 7 - Đọc viết Đăng ký cào

Cột đầu tiên là địa chỉ của thanh ghi so với cột cơ sở. Ví dụ: đối với COM1: địa chỉ thanh ghi LCR sẽ là 3F8h+3=3FB. Cột thứ hai là bit DLAB (Divisor Latch Access Bit), xác định các mục đích khác nhau cho cùng một thanh ghi.. Tức là. nó cho phép bạn vận hành 12 thanh ghi chỉ bằng 8 địa chỉ. Ví dụ: nếu DLAB=1, thì bằng cách truy cập địa chỉ 3F8h, chúng ta sẽ đặt giá trị byte thấp của bộ chia tần số bộ tạo xung nhịp. Nếu DLAB = 0 thì khi truy cập vào cùng một địa chỉ, byte được truyền hoặc nhận sẽ được ghi vào thanh ghi này.

Đăng ký “không”

Nó tương ứng với các thanh ghi để nhận/truyền dữ liệu và thiết lập hệ số phân tần của máy phát. Như đã đề cập ở trên, nếu DLAB = 0 thì thanh ghi được sử dụng để ghi dữ liệu đã nhận/truyền, nhưng nếu nó bằng 1 thì giá trị byte thấp của bộ chia tần số bộ tạo xung nhịp được đặt. Tốc độ truyền dữ liệu phụ thuộc vào giá trị của tần số này. Byte cao của bộ chia được ghi vào ô nhớ tiếp theo (tức là đối với cổng COM1, nó sẽ là 3F9h). Dưới đây là sự phụ thuộc của tốc độ truyền dữ liệu vào hệ số chia:

Đăng ký cho phép ngắt (IER)

Nếu DLAB=0 thì nó được sử dụng làm thanh ghi để kiểm soát các ngắt từ bộ điều hợp không đồng bộ; nếu DLAB=1 thì byte cao của bộ chia tần số bộ tạo xung nhịp được đặt trong đó.

Đăng ký nhận dạng ngắt (IIR)

Ngắt là sự kiện dừng việc thực thi chương trình chính và bắt đầu thực hiện chương trình ngắt. Thanh ghi này xác định loại ngắt xảy ra.

Thanh ghi điều khiển dòng (LCR)

Đây là thanh ghi điều khiển

Bit 7 1 Bit truy cập chốt chia – thiết lập tốc độ trao đổi dữ liệu
0 Chế độ bình thường (điều khiển ngắt, nhận/truyền dữ liệu)
Bit 6 Mô phỏng ngắt dòng (gửi một chuỗi nhiều số 0)
Bit 3 – 5 Bit 5 Bit 4 Bit 3 Lựa chọn chẵn lẻ
X X 0 Không có chẵn lẻ
0 0 1 Chẵn lẻ lẻ
0 1 1 Chẵn lẻ
1 0 1 Tính chẵn lẻ cao (Dính)
1 1 1 Tính chẵn lẻ thấp (Dính)
Bit 2 Số lượng bit dừng
0 1 bit dừng
1 2 bit dừng cho 6,7 hoặc 8 bit dữ liệu hoặc 1,5 bit dừng cho 5 bit dữ liệu.
Bit 0 và 1 Bit 1 Bit 0 Số bit dữ liệu
0 0 5 bit
0 1 6 bit
1 0 7 bit
1 1 8 bit

Kiểm tra tính chẵn lẻ liên quan đến việc truyền thêm một bit - bit chẵn lẻ. Giá trị của nó được đặt sao cho tổng số số 1 (hoặc số 0) trong một gói bit là chẵn hoặc lẻ, tùy thuộc vào cài đặt của các thanh ghi cổng. Bit này được sử dụng để phát hiện các lỗi có thể xảy ra trong quá trình truyền dữ liệu do nhiễu trên đường truyền. Thiết bị nhận tính toán lại tính chẵn lẻ của dữ liệu và so sánh kết quả với bit chẵn lẻ nhận được. Nếu tính chẵn lẻ không khớp thì dữ liệu được coi là được truyền có lỗi.

Bit dừng cho biết kết thúc truyền dữ liệu.

Thanh ghi điều khiển modem (MCR)

Thanh ghi điều khiển modem.

Chút Nghĩa
0 dòng DTR
1 dòng RTS.
2 Dòng OUT1 (dự phòng)
3 Dòng OUT2 (dự phòng)
4 Chạy chẩn đoán khi đầu vào của bộ điều hợp không đồng bộ bị chập mạch với đầu ra của nó.
5-7 Bằng 0

Thanh ghi trạng thái dòng (LSR)

Một thanh ghi xác định trạng thái của dòng.

Chút Nghĩa
0 Dữ liệu đã nhận và sẵn sàng để đọc, tự động đặt lại khi dữ liệu được đọc.
1 Lỗi tràn. Một byte dữ liệu mới đã được nhận, nhưng byte dữ liệu trước đó vẫn chưa được chương trình đọc. Byte trước đó bị mất.
2 Lỗi chẵn lẻ, được xóa sau khi đọc trạng thái dòng.
3 Lỗi đồng bộ hóa.
4 Đã phát hiện yêu cầu ngắt truyền "BREAK" - một chuỗi số 0 dài.
5 Thanh ghi giữ máy phát trống và một byte mới có thể được ghi vào nó để truyền.
6 Thanh ghi dịch chuyển máy phát trống. Thanh ghi này nhận dữ liệu từ thanh ghi giữ và tuần tự hóa nó để truyền đi.
7 Hết thời gian (thiết bị không được kết nối với máy tính).

Thanh ghi trạng thái modem (MSR)

Thanh ghi trạng thái modem.

Được rồi, mọi chuyện đã kết thúc rồi. Bằng cách vận hành các thanh ghi này, bạn có thể giao tiếp trực tiếp với cổng COM và điều khiển việc truyền và nhận dữ liệu. Nếu không muốn mày mò về bộ nhớ, bạn có thể sử dụng các thành phần có sẵn cho nhiều môi trường lập trình khác nhau: C++, VB, Delphi, Pascal, v.v. Chúng mang tính trực quan nên tôi nghĩ không cần thiết phải tập trung vào chúng ở đây.

Cổng nối tiếp (cổng nối tiếp, cổng nối tiếp hoặc cổng COM-, cổng giao tiếp) là một giao diện nối tiếp hai chiều.

Tại sao cổng được gọi là nối tiếp? Bởi vì tất cả thông tin trên cổng này được truyền theo các bước bằng một bit. Nó truyền dữ liệu từng bit một, không giống như cổng song song.

Mặc dù thực tế là một số giao diện khác, chẳng hạn như Ethernet, FireWire và USB, sử dụng trao đổi dữ liệu nối tiếp, tên “cổng nối tiếp” được gán cho một cổng có giao diện chuẩn. RS-232C.

Cổng này, so với các công nghệ "nối tiếp" khác, có một tính năng đặc biệt: nó không có bất kỳ yêu cầu về thời gian nào giữa 2 byte. Yêu cầu về thời gian chỉ tồn tại giữa các bit của một byte đơn. Sự nghịch đảo của khoảng thời gian tạm dừng giữa các bit của một byte được gọi là “tốc độ baud” (tốc độ baud). Ngoài ra, trong công nghệ này không có cái gọi là “gói”. Các công nghệ truyền dữ liệu "nối tiếp" khác (X.25, USB hoặc Ethernet) sử dụng "gói" và cũng có yêu cầu nghiêm ngặt về thời gian giữa các bit của một gói.

Về giao thức truyền thông với thiết bị công nghiệp, có những yêu cầu nghiêm ngặt về thời gian giữa các byte cổng nối tiếp. Việc triển khai các giao thức này trong các hệ điều hành đa nhiệm có hỗ trợ thời gian thực yếu là rất khó khăn. Các hệ thống này bao gồm Windows. Đó là lý do tại sao MS-DOS hoặc phần mềm cũ hơn thường được sử dụng để làm việc với các giao thức này.

Tiêu chuẩn phổ biến nhất cho cổng nối tiếp là RS-232C. Trước đây, cổng nối tiếp được sử dụng để kết nối thiết bị đầu cuối, sau này nó được sử dụng để kết nối modem hoặc chuột. Hiện tại, nó được sử dụng như một phương tiện kết nối với nguồn điện liên tục, cũng như phương tiện liên lạc với phần cứng phát triển hệ thống máy tính nhúng, máy thu vệ tinh, máy tính tiền và thiết bị hệ thống an ninh.

Nhờ cổng COM, có thể kết nối hai PC với nhau bằng cách sử dụng cái gọi là “cáp modem null”. Phương pháp này đã được sử dụng từ thời MS-DOS để truyền tệp từ máy tính này sang máy tính khác. Trên các hệ thống UNIX, nó được sử dụng để truy cập đầu cuối vào một máy khác và trên hệ điều hành Windows, nó được sử dụng làm trình gỡ lỗi cấp hạt nhân.

Cổng nối tiếp, một thời khá phổ biến trong các PC tương thích với IBM, hiện đã lỗi thời. Tuy nhiên, cần lưu ý rằng nó vẫn thường được sử dụng trong các thiết bị công nghiệp và chuyên dụng cao, cũng như trên một số máy tính hiện đại. Cổng nối tiếp đang dần được thay thế bằng giao diện USB và FireWire.

Tuy nhiên, có những tiêu chuẩn đặc biệt để mô phỏng cổng nối tiếp qua USB và qua Bluetooth. Nhân tiện, thật thú vị, nhưng chính công nghệ Bluetooth mà các nhà phát triển đã thiết kế như một phiên bản không dây của cổng nối tiếp. Phần mềm mô phỏng cổng vẫn được sử dụng rộng rãi cho đến ngày nay. Do đó, hầu hết tất cả các điện thoại di động ngày nay đều mô phỏng cổng COM và modem bên trong chúng để thực hiện kết nối (truy cập máy tính vào Internet qua GPRS/EGDE/3G). Nhưng trực tiếp để kết nối vật lý với máy tính, các công nghệ USB, Bluetooth hoặc Wi-Fi được sử dụng.

Ngoài ra, người dùng khách của máy ảo VMWare và Microsoft Hyper-V có thể mô phỏng cổng nối tiếp bằng phần mềm. Mục đích chính của quy trình này là kết nối trình gỡ lỗi cấp nhân Windows với máy khách khách.

Ưu điểm của cổng COM

Ưu điểm chính của công nghệ này là dễ dàng kết nối.

Nhược điểm của cổng COM

Nhược điểm chính của cổng này là tốc độ thấp, kích thước đầu nối lớn và yêu cầu cao về thời gian phản hồi của hệ điều hành. Ngoài ra, tiêu chuẩn này có số lượng ngắt cao (cứ 8 byte thì có một ngắt).

Đầu nối

Các đầu nối tiêu chuẩn phổ biến nhất là 9 và 25 chân (lần lượt là DB-9 và DB-25), được tiêu chuẩn hóa vào năm 1969. Đây là những đầu nối hình chữ D. Ngoài chúng, những loại khác cũng được sử dụng, nhưng cùng họ: DB-31 và DIN-8 tám chân tròn.

Tốc độ truyền tối đa (ở phiên bản tiêu chuẩn) đạt 115.200 baud.

Thiết bị

Đầu nối có các tiếp điểm sau:

  • DTR(Data Terminal Ready) - đầu ra cho PC, đầu vào - cho modem. Chịu trách nhiệm về sự sẵn sàng của máy tính để làm việc với modem. Việc thiết lập lại khiến modem khởi động lại gần như hoàn toàn. Trong trường hợp chuột, dây này được sử dụng để cung cấp năng lượng.
  • DSR(Bộ dữ liệu đã sẵn sàng) - đầu vào PC, đầu ra - tới modem. Chịu trách nhiệm về sự sẵn sàng của modem. Nếu dòng bằng 0 thì trên một số hệ điều hành không thể mở cổng dưới dạng tệp.
  • RxD(Nhận dữ liệu) - đầu vào PC, đầu ra - tới modem. Cho biết luồng dữ liệu vào PC.
  • TxD(Truyền dữ liệu) - đầu ra tới PC, đầu vào - tới modem. Cho biết luồng dữ liệu đến từ PC.
  • CTS(Xóa để gửi) - đầu vào PC, đầu ra - tới modem. Máy tính phải tạm dừng quá trình truyền dữ liệu cho đến khi dây này được đặt thành một. Được sử dụng trong giao thức điều khiển luồng phần cứng để tránh tràn trên modem.
  • RTS(Yêu cầu gửi) - đầu ra tới PC, đầu vào - tới modem. Modem phải tạm dừng quá trình truyền dữ liệu cho đến khi dây được đặt thành một. Được sử dụng trong giao thức điều khiển luồng phần cứng để ngăn chặn tình trạng tràn phần cứng/trình điều khiển.
  • DCD(Phát hiện sóng mang) - đầu vào PC, đầu ra - tới modem. Sau khi thiết lập kết nối với modem bên kia thì nâng lên 1, reset về 0 nếu mất kết nối. Phần cứng PC có thể tạo ra sự gián đoạn nếu sự kiện như vậy xảy ra.
  • R.I.(Chỉ báo vòng) - đầu vào PC, đầu ra - tới modem. Sau khi xác định được tín hiệu chuông của cuộc gọi điện thoại, modem sẽ nâng lên thành một. Phần cứng PC có thể tạo ra ngắt nếu sự kiện như vậy xảy ra.
  • SG(Signal Ground) - dây tín hiệu chung của cổng. Quan trọng:đất không phổ biến. Thông thường, dây được cách điện với PC hoặc vỏ modem.

Cáp modem null sử dụng hai cặp chéo: TXD/RXD và RTS/CTS.

UART 16550- thiết bị cổng tiêu chuẩn. Ngày nay nó được đưa vào chip SuperIO trên bo mạch chủ. Kể từ thời IBM PC, nó đã được trang bị hàng đợi byte phần cứng. Nó làm giảm đáng kể số lần gián đoạn xảy ra.