GIAO TIẾP MÁY VI TÍNH VỚI VI ĐIỀU KHIỂN 89C51 5.1. GHẫP NỐI QUA CỔNG NỐI TIẾP:
5.1.1. Giới thiệu chung:
Ghộp nối qua cổng nối tiếp là một kỹ thuật được sử dụng rộng rói nhất bởi số lượng và chủng loại cỏc thiết bị ngoại vi ghộp nối qua cổng này đứng hàng đầu trong cỏc khả năng ghộp nối với mỏy tớnh. Qua cổng này ta cú thể ghộp nối modem, chuột, bộ biến đổi A/D, D/A, cỏc thiết bị bị đo lường thậm chớ cả mỏy in.
Ghộp nối qua cổng nối tiếp là dữ liệu được truyền qua cổng kiểu nối tiếp nghĩa là tại một thời điểm chỉ cú một bit được truyền dọc theo một đường dẫn. Đặc điểm này cho phộp tạo ra sự khỏc biệt so với cỏc cỏch ghộp nối khỏc chẳng hạn cỏch truyền thụng theo kiểu song song trong đú nhiều bit được gửi đồng thời. Ưu điểm chớnh của kỹ thuật này là sử dụng một đường truyền và một đường nhận cho nờn việc điều khiển trở nờn đơn giản. Cổng này cú tờn là RS232 hoặc V.24. RS232 là tờn một tiờu chuẩn quy định cỏc đặc tớnh cho cổng nối tiếp, cũn V.24 là tờn của cổng này được ỏp dụng ở cỏc nước Tõy Âu. RS232 khi chưa trở thành một chuẩn chớnh thức đó được rất nhiều cụng ty mỏy tớnh và cụng ty sản xuất thiết bị đo lường ỏp dụng. Điều đú cho thấy tớnh cần thiết và tiện lợi của nú, vỡ qua đú nhiều thiết bị ngoại vi của nhiều nước khỏc nhau cú thể cựng nối với mỏy tớnh hoặc là cựng nối với nhau mà khụng cần phải cú sự thay đổi gỡ về phần cứng. So với cỏc khả năng ghộp nối khỏc tốc độ truyền qua cổng nối tiếp chậm, tốc độ thường sử dụng là 19600 bit/s/20m. Tốc độ truyền ở cỏc modem đời mới nhất cũng chỉ đạt 56,6Kbit/s. Về sau cú một số tiờu chuẩn nối tiếp khỏc ra đời như RS422, RS485 cho phộp truyền với tốc độ cao hơn và khoảng cỏch dài hơn: vớ dụ RS422 10Mbit/s/hàng ngàn km. Một số chuẩn khỏc cũn cho phộp sử dụng trờn mạng mỏy tớnh.
5.1.2. Một số yờu cầu:
1. Mức logic 1(mức dấu) nằm trong khoảng -3V → -12V; Mức logic 0 (Mức trống) nằm trong khoảng +3V → +12V.
2. Trở khỏng tải về phớa bộ nhận của mạch phải nằm trong khoảng 3000Ω → 7000Ω.
3. Tốc độ truyền nhận cực đại 100 Kbit/s.
4. Cỏc lối vào của bộ nhận phải cú điện dung < 2500pF.
5. Độ dài của cỏp nối giữa mỏy tớnh và thiết bị ghộp nối qua cổng nối tiếp khụng thể vượt quỏ 15 m nếu khụng sử dụng modem.
6. Cỏc giỏ trị tốc độ truyền dữ liệu chuẩn là 50, 75, 110, 150, 300, 600, 1200, 2400, 4800, 9600, 19200, 28800, ..., 56600 baud (bit/s).
5.1.3. Đầu nối trờn mỏy tớnh PC:
Cổng RS232 thể hiện trờn mỏy tớnh PC qua một đầu nối cú 9 hoặc 25 chõn. Khỏc với đầu nối của cổng song song, đầu nối của cổng nối tiếp là những phớch cắm trong khi ở cổng song song là ổ cắm. Hầu hết cỏc loại mỏy tớnh cỏ nhõn được chế tạo gần đõy đều cú hai cổng nối tiếp, hạn hữu mới cú trường hợp chỉ cú một cổng. Cổng đầu tiờn đặt tờn là COM1 thường dựng cho chuột, cổng thứ hai gọi là cổng COM2 thường dựng cho cỏc mục đớch ghộp nối khỏc. Trong trường hợp cú nhiều cổng thỡ được đỏnh dấu tiếp là COM3 và COM4. Đa số mỏy tớnh sử dụng đầu nối 9 chõn cho COM1 và đầu nối 25 chõn cho cổng COM2, số cỏc trường hợp sử dụng hai đầu nối 9 chõn cho cỏc cổng nối tiếp thường khụng nhiều. Tiờu chuẩn đầu tiờn ỏp dụng cho cổng nối tiếp quy định sử dụng đầu nối 25 chõn, cựng với cỏc tờn gọi và chức năng rất cụ thể cho từng chõn. Cho đến nay quy định này mang tớnh lịch sử, bởi vỡ trờn thực tế chỉ cú 9 đường dẫn được sử dụng. Đầu nối theo tiờu chuẩn 25 chõn do cú kớch thước lớn cho nờn chiếm chỗ nhiều trong khi lại cú rất nhiều chõn khụng dựng đến, cho nờn xu hướng sử dụng đầu nối 9 chõn ngày càng phổ biến. Cỏc chõn và chức năng trờn đầu nối 25 chõn và 9 chõn được mụ tả như bảng sau:
Đặc điểm của đường truyền dữ liệu qua cổng nối tiếp là tiến hành truyền và nhận trờn cỏc đường dẫn đơn lẻ, cho nờn khi thiết bị truyền và thiết bị nhận được ghộp nối với nhau thỡ đường truyền bờn này sẽ được nối với đường nhận bờn kia và ngược lại. Cú như vậy mới hỡnh thành được vũng kớn của quỏ trỡnh truyền dữ liệu. Để lưu ý mối quan hệ bắt chộo tay như vậy người ta đó đưa vào dấu x ở giữa TD (TxD) và RD (RxD). Việc truyền dữ liệu qua cổng nối tiếp RS232 được tiến hành theo kiểu khụng đồng bộ, trong đú khuõn mẫu dữ liệu cú bit bắt đầu, bit dừng được chỉ ra như hỡnh vẽ sau:
Hỡnh 5.1: Truyền thụng theo kiểu khụng đồng bộ
Rừ ràng theo cỏch truyền này chỉ cú một ký tự được truyền tại một thời điểm. Giữa cỏc ký tự cú một khoảng phõn cỏch giữa chỳng trong đú cú chứa bit dừng, bit bắt đầu. Đầu tiờn bộ truyền sẽ gửi một bit bắt đầu (bit Start) để thụng bỏo cho bộ nhận biết là sau bit này sẽ là cỏc bit dữ liệu cú thể là 5,6 hoặc 7 bit. Tiếp theo là một bit chẵn lẻ và sau cựng là 1 hoặc 2 bit dừng. Điểm đỏng chỳ ý là bao giờ bit bắt đầu cũng ở mức Low. Khoảng thời gian phõn cỏch của một bit đơn sẽ quyết định tốc độ truyền. Khoảng phõn cỏch càng nhỏ thỡ tốc độ truyền càng lớn.
Hỡnh 5.2: Mức logic và khuụn mẫu khung truyền RS232
Bit bắt đầu mức 0, tiếp theo là 7 bit dữ liệu 1000001,1 bit chẵn lẻ 1, cuối cựng là 2 bit dừng 11. Như vậy, toàn bộ khung truyền được phỏt ra là 01000001111. Bit chẵn lẻ dựng để kiểm tra phỏt hiện lỗi và sửa lỗi. Thực chất của quỏ trỡnh này như sau: khi kớ tự được truyền thỡ mỏy tớnh sẽ đếm số kớ tự 1 trong kớ tự được truyền. Nếu số đú là chẵn => bit chẵn lẻ = 1; Nếu số đú là lẻ => bit chẵn lẻ = 0. Ở nơi nhận sẽ kiểm tra kớ tự nhận được và đếm số 1, sau đú sẽ so sỏnh với bit chẵn lẻ. Nếu kết quả trựng khớp thỡ khung truyền coi như khụng mắc lỗi, ngược lại nú sẽ phỏt lệnh yờu cầu truyền lại khung truyền. Nếu tỷ lệ mắc lỗi càng nhiều thỡ tốc độ truyền càng giảm. Kỹ thuật mó lỗi chẵn lẻ theo kiểu này cú một đặc điểm rất đơn giản, nhưng trong trường hợp bị mắc lỗi 2 lần liền hoặc 4 lỗi liền thỡ lai khụng phỏt hiện ra. Nhưng trờn thực tế với 7 bit được truyền thỡ khả năng bị mắc 2 hoặc 4 lỗi là rất nhỏ cú thể xem như khụng bao giờ xảy ra. Chớnh vỡ vậy, cỏch mó lỗi theo kiểu này vẫn được dựng phổ biến ở trong kỹ thuật truyền dữ liệu qua cổng nối tiếp.
5.1.4. Tốc độ truyền:
Để đỏnh giỏ chất lượng của cuộc truyền dữ liệu qua cổng nối tiếp thỡ một trong những thụng số đặc trưng quan trọng là tốc độ truyền/nhận dữ liệu. Trong kỹ thuật truyền dữ liệu qua cổng nối tiếp ta thấy cú bit bắt đầu, bit dừng. Trong một số trường hợp cú bit chẵn lẻ đó được bổ xung vào, như vậy cú tới 10 bit được truyền trong khi chỉ cú 7 bit dữ liệu, cũn trong trường hợp sử dụng 2 bit dừng thỡ cú tới 11 bit truyền trong khi chỉ cú 7 bit dữ liệu. Như vậy nếu cú 10 kớ tự được gửi trong 1 giõy và nếu như cú 11 bit được sử dụng cho 1 kớ tự thỡ tốc độ truyền thụng sẽ là 110 bit/s. Như vậy giữa tốc độ truyền bit và tốc độ truyền kớ tự là khỏc nhau. Ngoài tốc độ truyền bit người ta cũn sử dụng tốc độ baud. Đõy là tờn của một nhà kỹ thuật người Phỏp đó giành nhiều cụng sức để nghiờn cứu về truyền thụng và người ta đó lấy tờn ụng để làm đơn vị truyền dữ liệu. Thụng
thường tốc độ bit và tốc độ baud là đồng nhất, chỉ trong trường hợp cú mụdem do cú thờm quỏ trỡnh biến đổi tớn hiệu nờn 2 tốc độ này nú khỏc nhau.
Bảng 5.2: Tốc độ bps liờn quan với số cỏc ký tự được truyền trong mỗi giõy
Tốc độ (bps) Ký tự / giõy 110 300 600 1200 2400 4800 9600 19200 56600 11 30 60 120 240 480 960 1920 5660
5.2. GIAO TIẾP MÁY TÍNH VỚI VISUAL BASIC:
Giao tiếp qua cổng COM được sử dụng phổ biến, theo chuẩn RS232, cỏc bit dữ liệu nối tiếp nhau trờn một đường truyền trờn một đường dẫn với một tốc độ cụ thể do người lập trỡnh quy định, chiều dài ký tự cú thể là 5, 6, 7, và 8 bit kết hợp với bit start và bit stop, bit parity (chẵn lẻ) để tạo thành một frame (khung truyền). Ngoài đường truyền dữ liệu, port giao tiếp này cũn cú cỏc đường điều khiển thu, phỏt, kiểm tra lỗi. Cỏch giao tiếp này cho phộp truyền ở khoảng cỏch lớn vỡ khả năng chống nhiễu khỏ nhỏ. Mặt khỏc vỡ đường truyền là nối tiếp nờn thành viờn thứ ba khụng thể tham gia vào cuộc trao đổi thụng tin.
Ưu điểm lớn nhất của kiểu giao tiếp này là sử dụng ớt đường truyền, ớt nhiễu tớn hiệu nờn cú thể truyền quóng đường xa… Nhưng mặt khỏc do bản chất là truyền thụng nối tiếp nờn cổng nối tiếp khụng được sử dụng cho cỏc ứng dụng thời gian thực hay điều khiển song song.
Để sử dụng cỏc hàm hỗ trợ giao tiếp qua cổng COM trong thư viện Port.dll bạn phải "mở cổng" bằng hàm OPENCOM, vớ dụ:
i = OPENCOM("COM1,9600,N,8,1")
Trong đú, COM1 là cổng COM thứ 1, 9600 là tốc độ baud, N:khụng kiểm tra chẵn, lẻ, 8: số Bit trong 1 Frame truyền, 1: số Bit Stop.
- Trong Visual Basic thiết lập chế độ điều khiển truyền thụng nối tiếp
MSComm bằng cỏch chọn Project – Component (Ctrl T ) – Microsoft Comm Control 6.0, biểu tượng hỡnh điện thoại tượng trưng cho MSComm hiện lờn, khi cần sử dụng kộo biểu tượng này vào trong Form chương trỡnh .
- Cú 2 cỏch để trao đổi thụng tin: + Điều khiển sự kiện:
Cỏch này sử dụng thuộc tớnh được hỗ trợ sẵn OnComm để bẫy cỏc sự kiện .
+ Hỏi vũng:
Để xỏc định sự kiện mới hoặc lỗi bằng cỏc này ta kiểm tra cỏc đặc tớnh ComEvent sau mỗi chu kỡ chương trỡnh. Cỏch này khụng tối ưu vỡ mỏy tớnh cần cú thời gian để thực hiện hỏi vũng và thường được sử dụng trong cỏc ứng dụng đơn giản.
• Cỏc thuộc tớnh của Mscomm:
MSComm là một điều khiển ActiveX dựng trong truyền thụng nối tiếp. Cỏc tớnh chất của điều khiển này được dựng để thiết lập giao tiếp với cỏc thiết bị ngoại vi qua cổng RS232.
- COMMPORT: Đặc tớnh này đặt và trả lại số cổng truyền thụng được chọn.
[form.]MSComm.Commport = [PortNumber%] . PortNumber% cú giỏ trị từ 1 đến 16 ( mặc định là 1). . Kiểu dữ liệu của đặc tớnh này là : Integer .
- SETTINGS: Đặt và trả lại cỏc thụng số cho truyền thụng cho cổng nối tiếp: baudrate, tớnh chẵn lẻ, số bit dữ liệu, số bit stop.
Cỳ phỏp:
[form.]MSComm.Settings = [ParamString$]
. ParamString$ là cỏc thụng số theo thứ tự như sau: baudrate, parity, số bit data, số bit stop.
. Kiểu dữ liệu của đặc tớnh này là : String
- PORTOPEN: Đặc tớnh này trả lại và đặt trạng thỏi cổng truyền thụng (True hoặc False).
Cỳ phỏp:
[form.]MSComm.PortOpen = [True/False]
a - Cỏc đặc tớnh phục vụ việc nhập dữ liệu:
- INPUT: Trả lại và xoỏ bỏ một kớ tự từ bộ đệm nhận và là thuộc tớnh chỉ đọc
(Read Only).
Cỳ phỏp:
[form.]MSComm.Input
- Inputlen: qui định số kớ tự được đọc bằng lệnh Input. Đặt Inputlen = 0 để đọc toàn bộ bộ đệm.
- InBufferCount: xỏc định số kớ tự trong bộ đệm nhận.
- InputMode: xỏc định kiểu dữ liệu đọc về : CommInputModeText: kiểu Text
(mó Ascii), CommInputModeBinary: kiểu nhị phõn.
- Inbuffercount: Trả lại số kớ tự trong bộ đệm nhận. Đặt InbufferCount = 0 là xoỏ toàn bộ bộ đệm nhận .
Cỳ phỏp:
Kiểu dữ liệu của đặc tớnh này là: Integer
b - Cỏc đặc tớnh phục vụ việc xuất dữ liệu:
- OUTPUT: Viết một kớ tự vào bộ đệm truyền . Cỳ phỏp:
[form.]MSComm.Output = [OutString$]
+ Kớ tự gởi đi cú thể dạng Text hay dạng Binary. Thụng thường nếu ta gởi một chuỗi theo dạng chuẩn ANSI thỡ nờn gởi theo dạng Text, ngược lai khi gởi cỏc kớ tự điều khiển như: NULL thỡ nờn gởi dưới dạng Binary .
+ Kiểu dữ liệu của đặc tớnh này là: Variant
- OutBufferCount: Trả lại số kớ tự bộ đệm truyền. Đặt OutBufferCount = 0 sẽ xoỏ toàn bộ bộ đệm truyền. Trả lại số kớ tự trong bộ đệm truyền.
Cỳ phỏp:
[form.]MSComm.OutBufferCount = [Value%] Kiểu dữ liệu của đặc tớnh này là: Integer
• Cỏc tớnh chất của MSComm được sắp xếp theo chức năng: Thiết lập tham số cho cổng:
+ CommID: trả lại handles đồng nhất tới thiết bị truyền thụng, cú kiểu
Long. Tớnh chất này khụng cú lỳc thiết kế mà chỉ cú khi thi hành, thuộc tớnh này là ReadOnly.
+ CommPort: dạng Object.CommPort = value. Value là chỉ số của cổng
Com cú giỏ trị từ 1 đến 16 và mặc định cú giỏ trị = 1. Cần phải thiết lập thụng số này trước khi mở cổng. Sẽ cú lỗi error 68 (Device unavailable) nếu như khụng mở được cổng này.
+ InBuferSize: thiết lập hoặc trả lại kớch thước của bộ đệm nhận, tớnh =
byte. Mặc định là 1024 byte. Khụng được nhầm lẫn với đặc tớnh InBufferCount là số byte đang chờ trong bộ đệm nhận.
+ InputLen: Object.InputLen[= value] thiết lập hoặc trả lại số byte mỗi
lần thuộc tớnh Input đọc trong bộ đệm nhận. Mặc định giỏ trị Value = 0 tức là thuộc tớnh Input sẽ đọc hết nội dung của bộ đệm nhận khi thuộc tớnh này được gọi. Nếu số kớ tự trong bộ đệm nhận khụng bằng InputLen thỡ thuộc tớnh Input sẽ trả lại kớ tự rỗng “”. Vỡ thế cần phải chọn cỏch kiểm tra InBufferCount để chắc
chắn số kớ tự yờu cầu đó cú đủ trước khi dựng lệnh Input. Tớnh chất này rất cú ớch khi đọc dữ liệu một mỏy mà dữ liệu ra được định dạng bằng cỏc khối cú kớch thước cố định.
+ InputMode: Object.InputMode[= value]. Value = 0 hay =
comInputModeText dữ liệu nhận được dạng văn bản kiểu kớ tự theo chuẩn ANSI. Dữ liệu nhận được sẽ là một xõu. Value=1 hay = comInputModeBinary dựng nhận mọi kiểu dữ liệu như kớ tự điều khiển nhỳng, kớ tự NULL, ... Giỏ trị nhận được từ Input sẽ là một mảng kiểu Byte.
+ NullDiscard: Object.NullDiscard [= value] tớnh chất này quyết định kớ
tự trống cú được truyền từ cổng đến bộ đệm nhận hay khụng. Nếu value = True kớ tự này khụng được truyền. Value = False kớ tự trống sẽ được truyền. Kớ tự trống được định nghĩa theo chuẩn ASCII là kớ tự 0 – chr$(0).
+ OutBuferSize: giống như InBuferSize, mặc định là 512.
+ ParityReplace: thiết lập và trả lại kớ tự thay thế kớ tự khụng đỳng trong
lỗi giống nhau.
+ PortOpen: thiết lập và trả lại tớnh trạng của cổng (đúng hoặc mở).
object.PortOpen [= value]. Value = True cổng mở. Value = False cổng đúng và xúa toàn bộ dữ liệu trong bộ đệm nhận và truyền. Cần phải thiết lập thuộc tớnh CommPort đỳng với tờn của cổng trước khi mở cổng giao tiếp. Thờm vào đú, cổng giao tiếp của thiết bị phải hỗ trợ giỏ trị trong thuộc tớnh Setting thỡ thiết bị mới hoạt động đỳng, cũn khụng thỡ nú sẽ hoạt động rất dở nếu khụng núi là nú chạy khụng tốt. Đường DTR và RTS luụn giữ lại trạng thỏi của cổng.
+ RthresHold: Object.Rthreshold [= value] value kiểu số nguyờn. Thiết
lập số kớ tự nhận được trước khi gõy lờn sự kiện comEvReceive. Mặc định = 0 tức là khụng cú sự kiện OnComm khi nhận được dữ liệu. Thiết lập = 1 tức là sự kiện OnComm xảy ra khi bất kỡ kớ tự nào được chuyển đến bộ đệm nhận.
+ Settings: object.Settings [= value] thiết lập hoặc trả lại cỏc thụng số tần
số baud, bit dữ liệu, bit chẵn lẻ, bit stop. Nếu value khụng cú giỏ trị khi mở sẽ