Việc truyền nhận qua cổng nối tiếp được thực hiện bởi UART. Nguyên tắc cho chip UART hoạt động như sau:
Để truyền đi một ký tự, đầu tiên ký tự đĩ sẽ được đưa vào thanh ghi đợi truyền ( Transmit Holding Register ), sau đĩ được đưa qua thanh ghi dịch của bộ phát ( transmit Shift Register ). Sau khi ký tự trước đã truyền xong, từng bit của ký tự đươcï truyền sẽ dịch vào kênh dữ liệu.
Khi nhận một ký tự, đầu tiên các bit của nĩ lần lượt được nạp vào thanh ghi dịch của bộ thu ( Transmit Shift Register), sau đĩ chúng được đưa vào thanh ghi dữ liệu của bộ thu ( Receive Data Register ) sau khi đã loại bỏ các bit start, stop, parity.
Để thực hiện việc truyền dữ liệu qua cổng nối tiếp ta phải thực hiện các bước sau:
o Chọn cổng truyền Com 1, hay Com 2. Địa chỉ của Com 1 thường là 3F8H, cịn Com 2 là 2E8H. Đối với một số loại máy tính thì địa chỉ của cổng Com cĩ thể vào BIOS để set 2 là 2E8H. Đối với một số loại máy tính thì địa chỉ của cổng Com cĩ thể vào BIOS để set lên, nên khi viết chương trình truyền cần vào BIOS để xem địa chỉ cổng Com cụ thể. Nếu ta chọn COM 1 là 3F8 H, Com 2 là 2F8 H thì địa chỉ các thanh ghi khác là:
Thanh ghi Địa chỉ
Com 1 Địa chỉ Com 2
Data register 3F8H 2F8H
Interrupt enable register 3F9H 2F9H
Interrupt identification register 3FAH 2FAH
Line control register 3FBH 2FBH
Modem control register 3FCH 2FCH
Line status register 3FDH 2FDH
Modem control register 3FEH 2FEH
o Đặt tốc độ baud
o Đặt cấu hình truyền : data bit, stop bit, parity (em chọn 8 bit data, 1 bit stop, khơng cĩ parity). cĩ parity).
Để thực hiện việc truyền dữ liệu trước hết chúng ta phải khởi động cổng COM, sau đĩ thực hiện việc truyền phát với chương trình truyền và phát trình bày ở dưới đây dược viết theo kiểu API:
o Chương trình khởi động cổng COM: Chọn Com 2 với đia chỉ 2F8H để thực hiện việc truyền dữ liệu. Cần chú ý đến Bit DLAB. việc truyền dữ liệu. Cần chú ý đến Bit DLAB.
(……….)
const
pathsl ='c:\my documents\delphi\'; com2=$2F8; Reg2F8=com2+0; Reg2F9=com2+1; Reg2FA=com2+2; Reg2FB=com2+3; Reg2FC=com2+4; Reg2FD=com2+5; (……….) procedure Tform2.Initcom; begin xuat(Reg2FB,$80);{DLAP=1} xuat(Reg2F8,$30);{baudrate=2400} xuat(Reg2F9,$00);{khong su dung ngat}
xuat(Reg2FB,$03);{8 bit data, 1 bit stop, no parity} end;
(……….)
o Nhập dữ liệu với hàm nhập viết bằng pascal.(……….) (……….) function Tform2.nhap(addr:word):byte; var TEMP : byte; begin asm PUSH Ax PUSH DX MOV DX,addr IN AL,DX MOV TEMP,AL POP AX
POP Dx end;
(……….)
o Xuất dữ liệu với hàm xuat:
(……….)procedure Tform2.xuat(addr:word;data:byte); procedure Tform2.xuat(addr:word;data:byte); begin asm PUSH AX PUSH DX MOV DX,addr MOV AL,DATA OUT DX,AL POP AX POP DX end; end; (……….)
o Trong việc truyền dữ liệu nếu sử dụng các tín hiệu RTS, CTS … thì chúng ta cần phải viết chương trình cho chúng . Trong việc truyền tín hiệu cho đề tài của em cĩ sử dụng phải viết chương trình cho chúng . Trong việc truyền tín hiệu cho đề tài của em cĩ sử dụng tín hiệu RTS, được viết như sau:
(……….)procedure Tform2.setRTS; procedure Tform2.setRTS; var a: byte; begin a:=nhap(Reg2FC); a:=a or $02; xuat(Reg2FC,a); end; procedure Tform2.RESETRTS; var a : byte; begin a:=nhap(Reg2FC); a:=a and $FD;
xuat(Reg2FC,a); end;
(……….)
Cĩ hai phương pháp để điểu khiển việc thu phát dữ liệu qua UART: phương pháp hỏi vịng và phương pháp tạo ra một trình điều khiển tạo ngắt. Phương pháp hỏi vịng chờ dữ liệu nhận xong hoặc phát xong, tốc độ chậm khoảng 34.8 Kbps.
o Phát ký tự: Với phương pháp hỏi vịng, khi gởi đi 1 ký tự ta phải kiểm tra xem
thanh ghi đợi truyền cĩ rỗng hay khơng bằng cách xem Bit 6 của thanh ghi LSR ( Line Status Register ) cĩ bằng một hay khơng. Chương trình viết cụ thể bằng Delphi 5.0 như sau:
(………)repeat repeat
test3:=nhap(Reg2FD);
application.ProcessMessages; until (test3 and $40)=$40;
xuat(Reg2F8,t);
(………)
o Để thu một ký tự : Để biết cĩ ký tự vào hay chưa kiểm bit 0 của thanh ghi LSR ( Line Status Register ). Nếu bằng ‘1’ thì cĩ một ký tự nhận vào. Với chương trình cụ thể ( Line Status Register ). Nếu bằng ‘1’ thì cĩ một ký tự nhận vào. Với chương trình cụ thể viết như sau:
(……….)repeat repeat begin test6:=nhap(Reg2FD); test6:=test6 and $01; end; until (test6=$01); (……….)
Tuy nhiên ta cĩ thể sử dụng nhũng cách khác để thực hiện việc truyền dữ liệu với phương pháp đơn giản hơn về giải thuật.
Sau đây là một phương pháp cĩ thể sử dụng mà em tham khảo được trong giáo trình Lập trình ghép nối máy tính trong Windows của tác giả Ngơ Diên Tập
Để thực hiện việc mở cổng Com ta chỉ việc gõ một lệnh đơn giản là OpenCom(pchar(‘cịm:9600,N,8,1’));
Để truyền dữ liệu đi: SendByte(); Để nhận dữ liệu về:
Temp:=ReadByte; Xuất trực tiếp ra các đường dẫn
DTR();RTS(); RTS(); …
Dể thực hiện được nhũng lệnh trên trong Delphi chúng ta phải cĩ một tệp tin tài nguyên hỗ trợ cĩ tên là port.dll do tác giả cung cấp. Sau đĩ ta phải soạn một unit (được chỉ dẫn rất rõ trong giáo trình) để giúp Delphi nhận ra được tài nguyên này. Hơi rắc rối một tý nhưng mà bù lại ta sẽ gặp rất nhiều thuận lợi trong lập trình.
Trong luận văn này, em sử dụng một phương pháp khác đĩ là dùng MSComm. Phương pháp này lập trình rất đơn giản và hỗ trợ rất mạnh và được nhiều người sử dụng. Trong Visual Basic MSComm đã được nhà lập trình cung cấp sẵn. Cịn trong Delphi muốn sử dụng thì ta phải” dùng ké” tài nguyên này của VB bằng cách copy têp tin “mscom.ocs” vào trong system của Window sau đĩ vào Component của Delphi để khai báo.
Về phương pháp khai báo và sử dụng sẽ đươc trình bày cụ thể ở trong phần phụ lục của em.