Đề tài Giao tiếp máy tính qua các cổng

Trong một thời gian ngắn đồng thời phải tìm hiểu nhiều vấn đề như ngôn ngữ lập trình,cấu trúc máy tính.nên trong thời gian thực hiện đề tài này chúng em đã gặp không ít khó khăn.Tuy nhiên, với sự giúp đỡ tận tình của thầy giáo hướng dấn cùng với sự trợ giúp đắc lực của Internet với nguồn tài liệu tiếng anh phong phú,các kinh nghiệm học hỏi trên các diễn đàn đã giúp chúng em hoàn thành đề tài này. Qua đề tài này ngoài những hiểu biết về ngôn ngữ lập trình C,chúng em đã trang bị cho mình một vốn kiến thức nhất định về cấu trúc máy tính đặc biệt là các loại cổng giao tiếp,nhưngx kĩ năng về dịch thuật,tra cứu tìm kiếm các tài liệu.Chúng em xin cảm ơn thầy giáo hướng dẫn cùng tất cả những ngưòi bạn đã giúp chúng em hoàn thành đề tài này.

doc57 trang | Chia sẻ: aloso | Lượt xem: 1846 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Đề tài Giao tiếp máy tính qua các cổng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
hác nhau,vào năm 1962 IEA(The Electronic Industrial Association) đã ban hành tiêu chuẩn RS-232(Recommended Standard-232) áp dụng cho cổng nối tiếp của máy tính. Hiện nay trên các máy tính thông dụng đều có trang bị cổng nối tiếp chuẩn RS-232 phục vụ cho mục đích gheps nối thiết bị ngoại vi trong khoảng cách ngắn,ngoài ra còn có chuẩn nối tiếp RS-485 phục vụ cho việc truyền thông nối tiếp với khoảng cách lớn. 2.Cấu trúc cổng nối tiếp 2.1.Cấu trúc - chức năng HIện nay hầu hết các máy tính dều có trang bị cổng nối tiếp,thường có hai cổng RS-232 được gọi là COM1và COM2.Hai cổng này sử dụng một trong hai loại đầu nối:25 chân và 9 chân,thông thường COM1 dùng đầu nối 9 chân còn đầu nối 25 chân trang bị cho COM2. Chức năng và vị trí của các chân trên đầu nối được liệt kê trong bảng sau D-Type-25 Pin No. D-Type-9 Pin No. Kí hiệu Tên gọi quốc tế Pin 2 Pin 3 TD Transmit Data Pin 3 Pin 2 RD Receive Data Pin 4 Pin 7 RTS Request To Send Pin 5 Pin 8 CTS Clear To Send Pin 6 Pin 6 DSR Data Set Ready Pin 7 Pin 5 SG Signal Ground Pin 8 Pin 1 CD Carrier Detect Pin 20 Pin 4 DTR Data Terminal Ready Pin 22 Pin 9 RI Ring Indicator Bảng 2.8.Tên gọi chuẩn các chân Thực tế hiện nay việc định nghĩa chức năng các chân trên đầu nối 25 chân là không hoàn toàn cần thiết nữa vì trên đầu nối 25 chân hiện nay chỉ chính thức sử dụng 9 chân tương tự như đầu mối 9 chân nên ta chỉ cần đưa ra chức năng các chân trên đầu nối 9 chân 25chân 9 chân Kí hiệu Chức năng của chân 1 - FG Chân này nối với vỏ máy,tiếp đất 2 3 TD=> Đường xuất dữ liệu ra 3 2 RD<= Đường nhận dữ liệu vào 4 7 RTS=> Xuất tín hiệu báo đã sẵn sàng xuất dữ liệu 5 8 CTS<= Nhận tín hiệu phản hồi của thiết bị ngoại vi báo đã sẵn sàng nhận dữ liệu 6 6 DSR<= Hoạt động gần giống như CTS 7 5 SG Đường đấu đất chung 8 1 DCD<= Phát hiện tín hiệu mang dữ liệu 20 4 DTR=> Hoạt động gần giống vói RTS 22 9 RI<= Báo rằng thiết bị ngoại vi đã nhận được một tín hiệu rung chuông từ diện thoại(…) Bảng 2.9.Chức năng các chân 2.2.Thông số kĩ thuật Giao diện RS-232 khi ra đời cũng đã từng sử dụng các mức điện áp tương thích với họ TTL la 0.3-5v để quy định mức logic 0 và 1.Để đáp ứng yêu cầu về tốc độ và khoảng cách truyền thông hiện nay RS-232 đã được cải tiến thành các chuẩn RS-232C và RS-232B. -Đối với chuẩn RS-232B thì: +Mức logic 1:-3v đến -25v +Mức logíc 0:+3v đến +25v -Đối với chuẩn RS-232C thì +Mức logic 1:-3v đến -12v +mức logic 0:+3v đến +12v Tuy nhiên các thông số ở trên là các mức điện áp để máy tính hiểu còn đối với máy tính thường là sử dụng bộ bơm điện MAX-232 để chuyển mức nguồn trong máy là 5v sang mức 10v do đó các mức logic của tin hiệu do máy xuất ra kha chuẩn:Mức 0:+10v và mức 1:-10v Ngoài các tiêu chuẩn về mức logic thì còn có một số các tiêu chuẩn khác như: Trở kháng của tải phải nằm trong khoảng 3000 ôm đến 7000 ôm.Tốc độ đáp ứng điện áp của bộ đệm truyền(Slew rate) phải đạt lớn hơn 30v trên một micrô giây. Cáp truyền của RS-232 cho phép dài hơn LPT nhưng không được quá dài 3.Phương thức truyền thông 3.1 Phương thức truyền tuần tự các bit dữ liệu Khác với giao diện song song việc truyền các bit dữ liệu được truyền đồng thời,trong giao diện nối tiếp các bit dữ liệu được truyền tuần tự.Về phương diện kỹ thuật phương pháp truyền tuần tự có hai cách là truyền đồng bộ(Synchronous) và truyền không đồng bộ(Ansynchronous).Chuẩn RS-232 sử dụng phương pháp truyền không đồng bộ. Hình 2.2.Truyền đồng bộ Hình 2.3.Truyền không đồng bộ Như đã thấy trên hình minh hoạ,phương pháp truyền không đồng bộ tự tạo ra xung đồng hồ cho mình bằng cách đưa vào các bit đánh dấu bắt đầu và kết thúc một Byte dữ liệu.Bộ truyền gửi một bit Start=0 cho bộ nhận để báo một quá trình truyền một Byte dữ liệu mới,tiếp đó bộ truyền truyền tuần tự các bit dữ liệu dưới dạng mã ASCII,rồi đến một bit chẵn lẻ và kết thúc là một bit 1,1.5 hoặc 2 bit mức cao để báo dừng 1 Byte.Chính vì đặc trưng của phương pháp này nên cả bộ truyền và bộ nhận phải được đặt ở cùng một khoảng thời gian bit 3.2 Tốc độ Baud Như ta đề cập ở phần trên trong một chu kì truyền tuần tự một Byte dữ liệu ngoài các bit mang dữ liệu thì quá trình truyền cần phải sử dụng thêm các bit như:Bitkhởi đầu,bit kết thúc, bit chẵn lẻ …chính vì thế tốc độ truyền các bit khác với tốc độ truyền một Byte dữ liệu. Ví dụ:Ta dùng thêm 3 bit thi nếu ta truyền 10 kí tự trong 1giây nghĩa là ta truyền được 110 bit trong một giây nhưng nếu ta chỉ tính theo số bit dữ liẹu truyền được thì chỉ là 80bit trong một giây Để phân biệt giữa hai tốc độ này người ta đưa ra khái niệm tốc độ Baud là tốc độ liên quan đến tốc độ mà các phần tử mã hoá dữ liệu được sử dụng để diễn tả các bit được truyền. Lúc đó ta có thể tính được thời gian chờ giành cho mỗi bit trên luông truyền theo công thức sau: Khoảng thời cho mỗi bit=1/tốc độ baud [s] Như vậy nếu tốc độ baud càng cao thì thời gian chờ bit càng bé dẫn đến khả năng bị chồng bit càng cao. 4.Các thanh ghi của chuẩn RS-232 Đối với việc lập trình giao tiếp truy xuất qua cổng thì một điều then chốt là nắm rõ địa chỉ các thanh ghi và sơ đồ các bit tương ứng giữa các bit trên các thanh ghi và các chân trên đầu nối. RS-232 có phương thức giao tiếp giữ liệu hoan toàn khác LPT nên số lượng các thanh ghi cũng như chức năng các thanh ghi của RS-232 hoàn toàn khác của LPT.Trong cách đánh địa chỉ thì thường được đánh theo địa chỉ lệch so với địa chỉ cơ sở.Dưới đây là địa chỉ cơ sở cho 4 cổng COM(Nếu như trên bo mạch có đủ) Name Address IRQ COM 1 3F8 4 COM 2 2F8 3 COM 3 3E8 4 COM 4 2E8 3 Bảng2.10. Địa chỉ cơ sở các cổng Com Trong chuẩn RS-232 có tất cả 9 thanh ghi với địa chỉ và tên gọi quốc tế được đưa ra dưới đây: Base Address DLAB Read/Write Abr. Register Name + 0 =0 Write - Transmitter Holding Buffer =0 Read - Receiver Buffer =1 Read/Write - Divisor Latch Low Byte + 1 =0 Read/Write IER Interrupt Enable Register =1 Read/Write - Divisor Latch High Byte + 2 - Read IIR Interrupt Identification Register - Write FCR FIFO Control Register + 3 - Read/Write LCR Line Control Register + 4 - Read/Write MCR Modem Control Register + 5 - Read LSR Line Status Register + 6 - Read MSR Modem Status Register + 7 - Read/Write - Scratch Register Bảng 2.11.Địa chỉ các thanh ghi tính theo Base add Chức năng của các thanh ghi và các bit trên chúng được nêu ra dưới đây.Ta giữ nguyên phần thuật ngữ tiếng anh để diễn đạt được trọn vẹn ý nghĩa, đối với chức năng nào liên quan đến phần lập trình ta sẽ giải thích rõ hơn ở phần sau Bit Notes Bit 7 Reserved Bit 6 Reserved Bit 5 Enables Low Power Mode (16750) Bit 4 Enables Sleep Mode (16750) Bit 3 Enable Modem Status Interrupt Bit 2 Enable Receiver Line Status Interrupt Bit 1 Enable Transmitter Holding Register Empty Interrupt Bit 0 Enable Received Data Available Interrupt Bảng 2.11.Interrupt Enable Register (IER)-Thanh ghi cho phép ngắt Bit Notes Bits 6 and 7 Bit 6 Bit 7 0 0 No FIFO 0 1 FIFO Enabled but Unusable 1 1 FIFO Enabled Bit 5 64 Byte Fifo Enabled (16750 only) Bit 4 Reserved Bit 3 0 Reserved on 8250, 16450 1 16550 Time-out Interrupt Pending Bits 1 and 2 Bit 2 Bit 1 0 0 Modem Status Interrupt 0 1 Transmitter Holding Register Empty Interrupt 1 0 Received Data Available Interrupt 1 1 Receiver Line Status Interrupt Bit 0 0 Interrupt Pending 1 No Interrupt Pending Bảng 2.12.Interrupt Identification Register (IIR)-Thanh ghi nhận dạng ngắt Bits 6 and 7 Bit 7 Bit 6 Interrupt Trigger Level 0 0 1 Byte 0 1 4 Bytes 1 0 8 Bytes 1 1 14 Bytes Bit 5 Enable 64 Byte FIFO (16750 only) Bit 4 Reserved Bit 3 DMA Mode Select. Change status of RXRDY & TXRDY pins from mode 1 to mode 2. Bit 2 Clear Transmit FIFO Bit 1 Clear Receive FIFO Bit 0 Enable FIFO's Bảng 2.13.First In / First Out Control Register (FCR) Bit 7 1 Divisor Latch Access Bit 0 Access to Receiver buffer, Transmitter buffer & Interrupt Enable Register Bit 6 Set Break Enable Bits 3, 4 And 5 Bit 5 Bit 4 Bit 3 Parity Select X X 0 No Parity 0 0 1 Odd Parity 0 1 1 Even Parity 1 0 1 High Parity (Sticky) 1 1 1 Low Parity (Sticky) Bit 2 Length of Stop Bit 0 One Stop Bit 1 2 Stop bits for words of length 6,7 or 8 bits or 1.5 Stop Bits for Word lengths of 5 bits. Bits 0 And 1 Bit 1 Bit 0 Word Length 0 0 5 Bits 0 1 6 Bits 1 0 7 Bits 1 1 8 Bits Bảng 2.14.Line Control Register (LCR)-Thanh ghi điều khiển đườngtruyền Bit Notes Bit 7 Error in Received FIFO Bit 6 Empty Data Holding Registers Bit 5 Empty Transmitter Holding Register Bit 4 Break Interrupt Bit 3 Framing Error Bit 2 Parity Error Bit 1 Overrun Error Bit 0 Data Ready Bảng 2.15.Line Status Register (LSR)-Thanh ghi trạng thái đường truyền Bit Notes Bit 7 Reserved Bit 6 Reserved Bit 5 Autoflow Control Enabled (16750 only) Bit 4 LoopBack Mode Bit 3 Aux Output 2 Bit 2 Aux Output 1 Bit 1 Force Request to Send Bit 0 Force Data Terminal Ready Bảng 2.16.Modem Control Register (MCR)-Thanh ghi điều khiển modem Bit Notes Bit 7 Carrier Detect Bit 6 Ring Indicator Bit 5 Data Set Ready Bit 4 Clear To Send Bit 3 Delta Data Carrier Detect Bit 2 Trailing Edge Ring Indicator Bit 1 Delta Data Set Ready Bit 0 Delta Clear to Send Bảng 2.17.Modem Status Register (MSR)-Thanh ghi trạng thái modem CHƯƠNG 3 LẬP TRÌNH CHO CÁC GIAO DIỆN A.LẬP TRÌNH CHO GIAO DIỆN LPT Như đã giới thiệu về các chuẩn của giao diện LPT,Trong các chế độ EPP,ECP,Bi-direction hỗ trợ đường truyền hai hướng trên 8 chân Data rất thuận tiện cho việc lập trình.Ta có thể trao đổi một lần 8 bit qua đương Data,song ta thấy rằng không phải bo mạch nào cũng hỗ trợ đủ hết các chuẩn,Chỉ có chuẩn Standard là chuẩn chung có trên tất cảc các bo mạch.Vì thế để đảm bảo tính tương thích cho mọi máy tính của phần mềm ta sẽ lựa chọn lập trình cho cổng LPT ở chế độ Standard. 1. Thủ thuật phần cứng Để giao tiếp máy tính với máy tính thì phải đảm bảo cho máy cả hai kkhả năng là truyền và nhận tín hiệu.Mặt khác ta thấy rằng trong chế độ Standard Thi 8 đưòng truyền Data,4 chân Control chỉ là đường truyền dữ liệu một hướng(xuất ra),con 5 chân trang thái(khối Status) thì có khả năng nhận vào.Trong thực tế việc giao tiếp hai máy tính chỉ cần kiểm soát đựoc dòng dữ liệu vào,ra nên ta không cần sử dụng hết các chân trạng thái cho mục đích kiểm soát dữ liệu.Ta quyết định sẽ sử dụng bốn chân trang thái để phục vụ cho việc nhận dữ liệu còn một chân còn lại dùng cho quá trình bắt tay giữa hai máy(Shake hand).Ta nối 4 chân ứng vói 4 bit cao nhất trên thanh ghi trạng thái(11,10,12,13) ở một đầu cáp truyền vào 4 chân ứng với 4 bit thấp nhất của thanh ghi dữ liệu (2,3,4,5) ở đầu kia của cáp truyền.Còn chân 15(Error) đựoc nối vào chân 1(Strobe) trên khối Control. Bằng cách đấu lại cáp truyền như trên trong mỗi chu kì trao đổi dữ liệu ta có thể trao đổi được 4bit .Đặc biệt nhờ ta sử dụng 2chân Strobe(Control) và Error(Status) làm tín hiệu bắt tay nên tạo ra được sự bắt tay ”phần cứng” gữa các chu kì truyền nên sẽ tránh được việc “Chồng bit”giữa các chu ki trao đổi dữ liệu Trong khi thực hiện đấu nối lại cáp truyền ta đã thực hiện đấu nối đối xứng, do đó nó cho phép ta thực hiện truyền và nhận với cùng một đầu cáp mà không phải thực hiện cắm lại cáp khi thay đổi chức năng của máy.Như vậy vói cách đấu cáp như trên ta đã tạo được một cáp truyền hai chiều và ta không cần phải phân biệt vai trò Master,Slave theo cáp truyền.Trong phần lập trình ta chỉ quy định Master và Slave là để biểu thị máy đó đang truyền dữ liệu(Transformer) hay đang nhậnh dữ liệu(Reciever) chứ không hề mang một ý nghĩa nào khác. Hình 3.1.Sơ đồ đấu lại cáp truyền 2. Lập trình 2.1 giải thuật Để tạo ra một chu kì truyền dữ liệu có bắt tay phần cứng ta có thể tiến hành theo cách truyền “hỏi đáp giữa hai máy tính”.Ta quy ước máy truyền dữ liệu là máy Master,máy nhận dữ liệu là máy Slave: 2.2 Công cụ lập trình Ngôn ngữ lập trình ta lựa chọn là ngôn ngữ lập trình C.Đây là một ngôn ngữ lập trình hướng chức năng,khá dễ sử dụng và nó hỗ trợ việc lập trình hệ thống tốt,là một ngôn ngữ đuợc lụa chọn nhiều cho việc lập trình hệ thống và điều khiển. Giao diện LPT thực hiện giao tiếp trực tiếp qua các thanh ghi do đó khi thực hiện giao tiếp với máy tính thực chất ta thực hiện việc truy xuất vào các thanh ghi để vào ra dữ liệu.Trong Ngôn ngữ lập trình C hỗ trợ hai hàm cơ bản để truy xuất các thanh ghi được xay dựng trong thư viện DOS.h: -Hàm xuất một Byte lên thanh ghi void outportb(int portid,unsigned char value); -Hàm đọc một Byte từ thanh ghi unsigned char Inportb(int portid); Trong đó các đối: -Portid là địa chỉ thanh ghi cần truy xuất -Value là giá trị của Byte dữ liệu cần xuất lên thanh ghi Cụ thể các thanh ghi mà ta sẽ truy xuất là:Thanh gi dữ liệuDataport(0x378h) ,thanh ghi trạng thái Status port(0x379h),thanh ghi điều khiển Control port (0x3Ah). Do trong quá trình trao đổi dữ liệu ta phải liên tục xử lí các bit nên các thủ thuật xử lí bit là cần thiết.Trong C hỗ trợ ta một số toán tử xử lí các bit: Phép toán Ý nghĩa Ví dụ & Phép và(AND) theo Bit a&b | Phép hoặc(OR) theo Bit a|b ^ Phép loại trừ(XOR) theo Bit a^b << Dịch trái a<<4 >> dịch phải a>>4 ~ Lấy phần bù theo Bit A~ 2.3 Mã hoá chương trình Trên cơ sở các chu trình truyền và nhận dữ liệu cơ bản ta sẽ thực hiện việc trao đổi dữ liệu giữa hai máy tính với dữ liệu là các Byte,để minh hoạ cho quá trình trao đổi này ta thục hiện trao đổi 1 File text(.txt) Ta xử lý các yêu cầu trên bằng các hàm ta xây dựng các hàm cỏ bản sau: a)Xử lý bắt tay trong quá trình truyền Chu kì truyền 1.Máy Master kiểm tra chân Error của Status port Error=1 =>Slave free tems=inportb(sport) &8; while(tems!=8) tems=inportb(sport)&8; 2.Máy Master gửi dữ liệu outportb(dport,nibble) 3.Máy Master gửi tín hiệu báo có dữ liệu xuất Strobe=1 temc=inportb(cprt)|1; outportb(cport,temc) ; 4.Máy Master chờ tín hiệu báo đã nhận Nibble từ Slave Error=0 tems=inportb(sport)&8; while(tems!=0) tems=inportb(sport)&8; 5.Máy Master hỏi Slave có nhận tiếp không đưa Strobe=0 temc=inportb(cport) &14; outportb(cport,temc); Chu kì nhận 1.Máy Slave kiểm tra Error của Status port.Errorr=1 =>đã có dữ liệu tems=inportb(sport)&8; while(tems!=8) tems=inportb(sport)&8; 2.Máy Slave nhận dữ liệu.Do chân Busy bị đảo nên ta phải đảo lại bit cao nhất trên Nibble nhận được. tem =inportb(sport)^128; Nibble=tem>>4; 3.Máy Slave báo đã nhận được dữ liệu,đưa Strobe=0; temc=inportb(cport)&14; outportb(cport,temc); 4.Máy Slave đợi tín hiệu hỏi tiếp tục nhậnStrobe=0 tems=inportb(sport)&8; while(tems!=0) tems=inportb(sport)&8; 5.Máy Slave báo tiếp tục nhận đưa Strobe=1 temc=inportb(cport)|1; outportb(cport,temc) b)Hàm truyền một Byte cho máy Slave void translpt(unsigned char c); Để thực hiện hàm này do cách đấu nối cáp truyền chỉ cho phép mỗi lần truyền nhận 4 bit nên ta phải tiến hành băm 1byte thành 4 bit cao và 4 bit thấp.Để truyền được qua 4 bit thấp trên Data port ta phải biến cả hai thành 4 bit thấp,với quy ước là Nibble[0] =4bit cao bị đẩy và Nibble[1]=4bit thấp Nibble[0]=c>>4;Nibble[1]=c&15; Ta sử dụng một vòng lặp 2 chu kì để truyền liên tiếp 2 Nibble này For(i=0;i<2;i++) {truyền Nibble[i];} c)Hàm nhận một Byte từ Status port int receivelpt(); Do máy Master gửi 1Byte dưới dạng 2 Nibble trong hai chu kì của một vòng lặp nên để nhận được Byte này ta sử dụng 1 vòng lặp hai chu kì để nhận liên tiếp 2 Nibble sau đó ghép lại For (i=0;i<1;i++) {Nhận Nibble[i];} Byte=(Nibble[0]<<4)|Nibble[1]; d)Hàm truyền và nhận File Trên cơ sở hai hàm Translpt();và Receivelpt(); ta tiến hành truyền một File và nhận một File bằng các hàm sau: Void transfile() { while((c=getc(fp))!=EOF) translpt(c); trans(26) ;//truyền ký tự kết thúc } Void receivefile() { While(c!=26) c=receivelpt(); fputc(c,fp)//ghi len file } Tong quá trình truyền nhận này ta sử dụng thêm một kí tự phụ ngoài các kí tự của File làm dấu hiệu báo kết thúc cho máy Slave là kí tự c=26.Sở dĩ ta dùng kí tự này vì trong hệ soan thảo văn bản của C,Pascal thi nó được dùng làm kí tự kết thúc File còn trong DOS thì không có kí tự này trên văn bản(mã kết thuc EOF=-1).Do đó trong khi ta còn đọc File text không bao giờ ta gặp kí tự này,ta sẽ dùng nó làm kí tụ bổ sung báo hiệu kết thúc quá trình B.LẬP TRÌNH CHO GIAO DIỆN RS-232 1.Thủ thuật phần cứng Tương tự như trong giao tiếp qua cổng LPT, đối với RS-232 ta cũng sử dụng thủ thuật bắt tay phần cứng bằng cách đấu lại cáp truyền.Thực tế ta có thể thực hiện giao tiếp giữa hai máy theo phương thức không cần bắt tay phần cứng giữa hai máy mà chỉ cần đặt hai máy ở cùng tốc độ Baud và thực hiện giao tiếp theo phương thức “Modem rỗng”,tuy nhiên phương thức giao tiếp này không tối ưu nó có thể gay nên sự “chồng Bit” của các Byte giữa các lần giao tiếp.Ta đấu chân RD của máy này vào chân TD của máy kia để có thể truyền nhận giữ liệu giữa hai máy, đấu CTS của máy này vào RTS của máy kia để tạo tín hiệu bắt tay. Sơ đồ đấu lại cáp truyền 2.Lập trình 2.1.Giải thuật Để tránh sự chồng bit xảy ra ta sẽ sử dụng thủ thuật bắt tay phần cứng với giải thuật hỏi đáp tương tự như đối với LPT. 2.2.Chương trình a)Xử lý bắt tay trong quá trình truyền Chu kì truyền 1.Máy Master kiểm tra chân CTS.CTS=1 =>Slave free CTS=inportb(STM) &16; while(CTS!=16) CTS=inportb(STM)&8; 2.Máy Master gửi dữ liệu send_character(c); 3.Máy Master gửi tín hiệu báo có dữ liệu xuất RTS=1 RTS=inportb(CTM)|2; outportb(CTM,RTS) ; 4.Máy Master chờ tín hiệu báo đã nhận từ Slave CTS=0 CTS=inportb(STM)&16; while(CTS!=0) CTS=inportb(STM)&16; 5.Máy Master hỏi Slave có nhận tiếp không đưa RTS=0 RTS=inportb(CTM)&253; outportb(CTM,RTS); Chu kì nhận 1.Máy Slave kiểm tra CTS tren STM.CTS=1 =>đã có dữ liệu CTS=inportb(STM)&16; while(CTS!=16) CTS=inportb(STM)&16; 2.Máy Slave nhận dữ liệu get_character(); 3.Máy Slave báo đã nhận được dữ liệu,đưa RTS=0; RTS=inportb(CTM)&253; outportb(CTM,RTS); 4.Máy Slave đợi tín hiệu hỏi tiếp tục nhậnCTS=0 CTS=inportb(STM)&16; while(CTS!=0) CTS=inportb(STM)&16; 5.Máy Slave báo tiếp tục nhận đưa RTS=1 RTS=inportb(CTM)|2; outportb(CTM,RTS) ; b)Hàm cài đặt tốc độ Baud cho cổng void setup_serial(); Với hàm này ta có thể đặt lại tốc độ Baud với lựa chọn của ngưồi dùng,tuy nhiên do ta tiến hành bắt tay phần cứng nên việc cài đặt này không còn mang nhiều ý nghĩa.Ta sẽ cài đặt mặc định Baud rate=9600 cho cả hai máy để đảm bảo thời gian bit trùng nhau c)Hàm truyền và nhận các kí tự trên bộ đệm void send_character(); int get_character(); Do đặc trưng của RS-232 là truyền dữ liệu tuần tự nên ta không thể truyền ngay một Byte hoặc nhận ngay một Byte.Ta tiến hành kiểm tra “Parity error bit” cho việc bắt đầu nhận và “Data ready bit” cho việc bắt đầu truyền 1 Byte d)Hàm truyền và nhận một kí tự giữa Master và Slave void transcom(int c); int receivecom(); e)Hàm truyền và nhận File void send_file(); Truyền một File đọc từ Master sang Slave cộng với kí tự báo kết thúc 26 Void receive_ file (); Nhận các kí tự từ Master và ghi vào một File trên Slave C.LẬP TRÌNH CHO CHỨC NĂNG CHAT GIỮA HAI MÁY 1.Giải thuật Trên cơ sở các chu kì truyền nhận qua các cổng ta có được giải thuật cho chức năng cho phép 2 máy tính chát với nhau qua các cổng. 2.lập trình với giải thuật trên cho phép chúng ta go tcác kí tự từ bàn phím và gửi sang máy bên kia qua các cổng,tương tự như chương trình chat để thực hiện giải thuật này ta thực hiện bằng các hàm sau: TÊN HÀM CHỨC NĂNG Void chatlpt() Chat qua cổng LPT Void chatcom() Chat qua cổng COM Void sendchat() Gửi một câu thoại qua cổng LPT Bấm Enter để kết thúc Void sendchatc() Gửi một câu thoại qua cổng COM Bấm Enter để kết thúc Void recievechat() Nhận một câu thoại qua cổng LPT Void recievechatc() Nhận một câu thoại qua cổng COM Void masterchat() Chat qua LPT với vai trò Master . Bấm Escape để kết thúc Void masterchatc() Chat qua COM với vai trò Master . Bấm Escape để kết thúc Void slavechat() Chat qua LPT với vai trò Slave . Bấm Escape để kết thúc Void slavechat() Chat qua LPT với vai trò Slave . Bấm Escape để kết thúc CHƯƠNG4 KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN ĐỀ TÀI 1.Kết quả-hướng phát triển 1.1.kết quả đạt được Sau một thời gian ngắn thực hiện đề tài chúng em đã thu được những kết quả nhất định.Trước hết là những hiểu biết sâu hơn về lập trình hệ thống bằng ngôn ngữ C,những hiểu biết về cấu trúc của hai loại cổng LPT và COM.Xây dựng được giải thuật giao tiếp giữa hai máy tính qua hai loại cổng trên với sự bắt tay phần cứng khá tối ưu,tránh được mọi rắc rối của việc chồng bit dữ liệu mà các giải thuật không có bắt tay phần cứng không thể có được. Trên cơ sở các hiểu biết và giải thuật trên chúng em đã xây dựng được chương trình “Giao tiếp máy tính qua cổng”.Chương trình đã đạt được yêu cầu về việc truyền nhận dữ liệu giữa hai máy tính mà cụ thể là các File text(.txt).Với giải thuật truyền củ ta thì chương trình thì có thể phát triển để truyền nhận một Byte(kiểu char) ,2Byte(Kiểu int) hoặc là nByte bất kì trong một chu kì truyền nhận.Do đó chương trình có thể truyền dữ liệu bất kì miễn sao ta có thể mã hoá dữ liệu thành các bit nhị phân.Ngoài ra,chương trình còn có một tiện ích nữa là cho phép “chat” giữa hai may thông qua các cổng. Do thời gian gấp rút nên chương trình này chỉ là một chương trình có tính minh hoạ cho kĩ thuật truyền dữ liệu qua cổng nên nó còn có rất nhiều hạn chế,nó chưa phải là môt chương trình ứng dụng thực sự 1.2.Hướng phát triển Về chương trình cụ thể là chương trình giao tiếp máy tính đã nêu ở trên thì ta có thể viết lại trên các ngôn ngữ như Visual Basic,Visual C... để biến nó thành một chương trình ứng dụng thực sự có thể chạy trong môi trường Window Trên cơ sở những hiểu biết về cấu trúc các loại cổng cũng như các phương thức truyên dữ liệu khác nhau ,chúng em đã có một vốn kiến thức nhất định về giao tiếp giữa máy tính và thiết bị ngoại vi nên có thể ứng dụng rất nhiều vào chuyên ngành điện tử của mình.Ta có thể sử dụng máy tính như một nguồn tín hiệu điều khiển thiết bị,hay là biến máy tính thành một trung tâm xử lí tín hiệu...Từ đó ta có thể xây dưng các hê thống điện tử thông minh dưới sự trợ giúp của máy tính ví dụ như hệ thống nhân và xử lý tín hiệu điều khiển từ đường dây điện thoại để điều khiển thiết bị từ xa,hay là một hệ thống điều khiển từ xa cho máy tính,biến máy tính thành các máy đo lường ví dụ như một máy Oscillo,khối xử lý tín hiệu số... 2.Hướng dẫn sử dụng chương trình 2.1.Yêu cầu cấu hình Để có thể chạy được chương trình giao tiếp máy tính qua cổng ta cần phải có môi trương DOS thật.Môi trường DOS thật này ta có thể tạo bằng cách boot trực tiếp từ đĩa,hoặc chạy trên nền DOS có sẵn trên Window98.Ta phải lựa chọn môi trường làm việc cho chương trình như vậy vì để xây dựng chương trình này ta dã sử dụng các hàm :inportb();ouportb() của thư viện DOS.h các hàm này chỉ chạy dược trong môi trường DOS thật. 2.2.Hướng dấn sử dụng chương trình Giao diện của chương trình rất đơn giản,người dùng có thể quan sát trên đó để thao tác rất dẽ dàng -Chọn giao tiếp bằng COM ấn C -Chọn giao tiếp bằng LPT ấn L -Chọn chức năng chat ấn T Trong chức năng trao đổi File giữ liệu -Chọn vai trò Master để tuyền ấn M -Chọn vai trò Slave để nhận ấn R Bạn cần phải nhạp đúng phím chức năng.Nếu một máy đã chọn chức năng Master thì máy còn lại phải chọn chức năng Slave. -khi chương trình hoạt động có các yêu cần hiển thị rõ ràng người dùng có thể thao tác theo các yêu cầu đó ví dụ như một số yêu cầu sau: Báo lỗi khi bạn nhập phím chức năng sai.Bạn ấn C để nhập lại và phím bất kì để thoát. Yêu cầu nhập tên File để lưu trữ dữ liệu nhận được Yêu cầu nhập tên File cần truyền.Tên File cần truyền bao gồm cả đường dẫn cụ thể đến File đó. Nếu Bạn nhập tên một File không tồn tại học lỗi ...thì máy báo và yêu cầu bạn nhập lại.Bạn hãy ấn C để nhập lại và phím bất kì để thoát. -Trong chức năng chat yêu ccầu người dùng chọn cổng để chat và vai trò trong cuộc nói chuyện là Master hay Slave.Thực chất cách chọn này chỉ là để quyết định ai sẽ chat trước(Master sẽ chat trước).Ban cần phải nhập đúng phím chức năng và thực hiện đúng vai trò trong cuộc chat của mình. Bạn ấn L để chọn chat qua LPT,ấn C để chọn chat qua COM. Bạn ấn M để chọn chức năng Master,ấn S để chọn chức năng Slave.Nếu một người đã chọn Master thì người còn lại phải chọn Slave. Còn một số chức năng khác của chương trình không thể liệt kê hết ra đây, bạn có thể thao tác theo các Menu rất trực quan trong chương trình. 3.Kết luận Trong một thời gian ngắn đồng thời phải tìm hiểu nhiều vấn đề như ngôn ngữ lập trình,cấu trúc máy tính...nên trong thời gian thực hiện đề tài này chúng em đã gặp không ít khó khăn.Tuy nhiên, với sự giúp đỡ tận tình của thầy giáo hướng dấn cùng với sự trợ giúp đắc lực của Internet với nguồn tài liệu tiếng anh phong phú,các kinh nghiệm học hỏi trên các diễn đàn đã giúp chúng em hoàn thành đề tài này. Qua đề tài này ngoài những hiểu biết về ngôn ngữ lập trình C,chúng em đã trang bị cho mình một vốn kiến thức nhất định về cấu trúc máy tính đặc biệt là các loại cổng giao tiếp,nhưngx kĩ năng về dịch thuật,tra cứu tìm kiếm các tài liệu...Chúng em xin cảm ơn thầy giáo hướng dẫn cùng tất cả những ngưòi bạn đã giúp chúng em hoàn thành đề tài này. PHỤ LỤC PROGRAM CODE #include #include #include #include #include #include #define dport 0x378 #define sport dport+1 #define cport dport+2 #define COM1BASE 0x3f8 #define COM2BASE 0x2f8 #define TXDATA COM1BASE #define LCR COM1BASE+3 #define LSR COM1BASE+5 #define CTM COM1BASE+4 #define STM COM1BASE+6 typedef struct list1 { int value; struct list1 *next; }list; list *p,*fpl; int temc,tems,testm,tests,c,charac,i,k,nibble,hnibble,lnibble,byte,cts,rts; int nibblet[2];nibbler[2];stop[2]; long j,count; char fn[50],fnr[50],fnt[50]; FILE *fp,*fpt,*fpr; void translpt(); void transdata(); void trans_character(int c); int recieve_character(); void receivelpt(); int receivechar(); int receivecharac(); void receivecom(); void receivedata(); void readfile(char fn[50]); void send_file(); void receive_file(); void setup_serial(); void send_character(int ch); int get_character(); void transcom(int c); void receive(); void menuchat(); void menuchatcom(); void menuchatlpt(); void menu(); void menucom(); void menulpt(); void comchat(); void lptchat(); void sendchat(); void sendchatc(); void recievechat(); void recievechatc(); void masterchat(); void masterchatc(); void slavechat(); void slavechatc(); void chat(); void LPT(); void COM(); void main() { clrscr(); menu(); redomain:fflush(stdin); switch(tolower(getch())) { case 'l':LPT(); case 'c':COM(); case 't':chat(); default: { printf("\nBAN DA NHAP SAI PHIM CHUC NANG-HAY AN C DE NHAP LAI"); if(tolower(getch())=='c') goto redomain; else exit(1); } } //getch(); } /*------------------------------------------------------------------*/ /*----------------------chuong trinh chinhLPT-----------------------*/ //Do truyen theo che do Nibble(dung 4 chan status de nhan du lieu vao) //nen moi lan truyen ta chi truyen duoc 4 bit.Khi truyen mot tep Text //ta chia mot ki tu=1Byte thanh 2 Nibble va truyen lien tiep 2 Nibble //Ben may Slave cung nhan lien tiep 2 Nibble va ghep lai thanh 1Byte void LPT() { clrscr(); menulpt(); redomainlpt:fflush(stdin); switch(tolower(getch()))//Bien moi ki tu ve dang ki tu thuong { case 'r':receivedata(); case 't':transdata(); default://Kiem soat loi bam nham phim { printf("\nBAN DA NHAP SAI PHIM CHUC NANG-HAY AN C DE NHAP LAI"); if(tolower(getch())=='c') goto redomainlpt; else exit(1); } } getch(); exit(0); } /*---------------Ham truyen du lieu hoan chinh---------------------*/ void transdata() { translpt(); printf("\nBan co muon doc File vua nhan khong\n\n"); fflush(stdin); switch(tolower(getch())) { case 'c': readfile(fnt); default:exit(1); } }//End of Transdata /*------------Ham truyen ki tu duoc doc tu File qua Dataport--------*/ void translpt() { clrscr(); //Doc ten File tu ban phim redo:printf("\nNhap ten File ban muon gui:\n"); gets(fnt); fpt=fopen(fnt,"rt"); if(fpt==NULL) { printf("\nFile khong truy nhap duoc"); printf("\nBan co muon doc File khac khong\n(C/K)\n"); fflush(stdin); switch(tolower(getch())) { case'c':goto redo; case'k':exit(1); }//end switch }//end if //Bat dau doc ki tu tu File de truyen temc=inportb(cport); temc=temc|1; //Strobe=1 outportb(cport,temc);//bat tay luc ban dau dua erro of slave=0 printf("\nDang cho truyen du lieu-------------------------------\n"); while((c=getc(fpt))!=EOF)//Chua ket thuc File { printf("%c",c); trans_character(c); }//End While chu trinh truyen Nibble chinh fclose(fpt);//Dong File vua truyen //Truyen them ki tu 26 de bao ket thuc truyen //Ta chon ki tu 26 lam ki tu ket thuc truyen vi khi doc tep //neu gap ki tu 26 hoac cuoi tep thi ta moi nhan duoc //ma EOF do do trong tep MASTER dang truyen khong the //co ki tu 26 Chi khi nao ket thuc tep moi co trans_character(26); //Reset lai sport cua may slave de phuc vu cho qua trinh truyen lan sau temc=inportb(cport); temc=temc|1; //Strobe=1 outportb(cport,temc);//reset Slave dua erro of Slave =0 printf("\nDa truyen xong---------------------------------------\n"); }//end of translpt /*-----------Ham truyen mot ki tu tu may Master sang Slave----------*/ void trans_character(int c) { nibblet[0]=c>>4;//Nibble cao nibblet[1]=c&15;//Nibble thap for(i=0;i<2;i++)//Truyen lien tiep 2 Nibble cua 1 byte { temc=inportb(cport); temc=temc&14; //strobe=0 tems=inportb(sport); tems=tems&8; while(tems!=8) //cho nhan tin hieu free tu may slave { tems=inportb(sport); tems=tems&8; } outportb(dport,nibblet[i]);//gui nibble outportb(cport,temc);//gui tin hieu bao co nibble dua erro of slave=1 temc=inportb(cport); temc=temc|1; tems=inportb(sport); tems=tems&8; while(tems!=0)//cho nhan tin hieu bao da nhan dc nibble cua may slave { tems=inportb(sport); tems=tems&8; } outportb(cport,temc);//hoi co tiep tuc nhan nibble hay khong }//End of for }//End trans_character /*-----------------Ham nhan du lieu hoan chinh----------------------*/ void receivedata() { receivelpt(); printf("\nBan co muon doc File vua nhan khong\n\n"); fflush(stdin); switch(tolower(getch())) { case 'c': readfile(fnr); default:exit(1); } }//End of Receivedata /*-----------Ham nhan du lieu tu Status port va ghi vao File---------*/ void receivelpt() { clrscr(); //Doc ten File luu tru du lieu nhan duoc tu ban phim redo1:printf("\nBan hay nhap ten File luu tru du lieu vua nhan\n"); fflush(stdin); gets(fnr); fpr=fopen(fnr,"wt"); if(fpr==NULL) { printf("\nLoi khong ghi duoc"); printf("\nBan co muon luu vao File khac khhong\n\n"); fflush(stdin); switch(tolower(getch())) { case 'c':goto redo1; case 'k':exit(1); } }//End of if temc=inportb(cport); temc=temc&14; outportb(cport,temc); //bat tay ban dau charac=100; printf("\ndang cho nhan du lieu---------------------\n"); while(charac!=26) //Chua gap ki tu 26 bao ket thuc tu may Master thi tiep tuc nhan //Ta chon ki tu 26 lam ki tu ket thuc truyen vi khi doc tep //neu gap ki tu 26 hoac cuoi tep thi ta moi nhan duoc //ma EOF do do trong tep MASTER dang truyen khong the //co ki tu 26 Chi khi nao ket thuc tep moi co { charac=recieve_character(); fputc(charac,fpr); //Ghi Byte nay vao File printf("%c",charac); //In len man hinh khi tu vua nhan duoc }//End while xong chu trinh nhan du lieu tu Sport va ghi vao File fclose(fpr);//Dong File vua luu tru temc=inportb(cport); temc=temc|1; //Strobe=1=>Dat lai Error of slave=0 outportb(cport,temc); //Reset lai Master printf("\nDa nhan xong du lieu---------------------\n"); }//end of receive /*-----------------Ham nhan mot ki tu tu may Master----------------*/ int recieve_character() { charac=100; for(i=0;i<2;i++) //Nhan lien tiep 2 Nibble sau do ghep lai thanh Byte { temc=inportb(cport); temc=temc|1; // strobe=1 tems=inportb(sport); tems=tems&8; //kiem tra Error=1? while(tems!=8) //cho nhan tin hieu bao co Nibble { tems=inportb(sport); tems=tems&8; } //Da co Nibble tems=inportb(sport); //doc 5 bit cao tu sport tems=tems^128; //dao bit cao nhat vi chan vao ung voi bit nay bi dao nibbler[i]=tems>>4; //day 5 bit cao cua sport thanh 4 bit thap outportb(cport,temc); //gui tin hieu bao da nhan duoc nibble temc=inportb(cport); temc=temc&14; //dua Strobe ve khong tems=inportb(sport); tems=tems&8; //Kiem tra bit thu 5 ten sportchan Error while(tems!=0) //cho nhan tin hieu hoi nhan nibble { tems=inport(sport); tems=tems&8; } //end while outportb(cport,temc); //gui tin hieu bao tiep tuc nhan }//End of for hnibble=nibbler[0]<<4; //Day 4 bit thap nhan tu Sport thanh cao lnibble=nibbler[1]; byte=hnibble|lnibble; //Ket hop 2 bit thanh mot Byte return byte; //tra gia tri cua ham ve Byte vua nhan duoc }//End of receive_character /*------------------------------------------------------------------*/ /*----------Chuong trinh chinh giao tiep qua cong COM---------------*/ //Chuong trinh nay truyen nhan lan luot cac ki tu gia hai may //Trong qua trinh truyen giua cac ki tu thi co su bat tay"hoi-dap" //Chinh nho co su bat tay nay ma tranh duoc viec chong bit //Tuong tu chuong trinh LPT ta chon ki tu 26 lam dau hieu ket thuc void COM() { clrscr(); setup_serial(); menucom(); redomaincom:fflush(stdin); switch(tolower(getch())) { case 'r':receive_file(); case 't':send_file(); //case 's':set_baurate(); default: { printf("\nBAN DA NHAP SAI PHIM CHUC NANG - HAY AN C DE NHAP LAI\n"); if(tolower(getch())=='c') goto redomaincom; } } getch(); }//End main Com /*-----------------Ham cai dat toc do cho cong com-------------------*/ //Voi ham nay ta co the dat toc do Baud rate bat ki cho cong com //Tuy nhien do ta trao doi co bat tay nen viec cai dat khong can thiet lam //Ta chon mot che do mac dinh la Baud rate=9600 so chia=12=0x0c void setup_serial() { outportb(LCR,0x80); outportb(TXDATA,0x0c); outportb(TXDATA+1,0x00); outportb(LCR,0x0a); }//End setup /*---------------Ham gui mot ki tu ra thanh ghi TXDATA--------------*/ void send_character(int ch) { char status; do { status=inportb(LSR)&0x40; } while (status!=0x40); outportb(TXDATA,ch); }//End send_character /*--------Ham gui mot ki tu cho may SLAVE qua thanh ghi TXDATA------*/ void transcom(int c) { cts=inportb(STM)&16; rts=inportb(CTM)&253;//Dua rts=0 outportb(CTM,rts); //Bat tay ban dau while(cts!=16) //cts=0 may Slave chua Free cts=inportb(STM)&16; send_character(c); //Truyen ki tu len bo dem rts=inportb(CTM)|2; //Dua rts=1 outportb(CTM,rts); //Bao da co Data cts=inportb(STM)&16; rts=inportb(CTM)&253;//Dua rts=0 while(cts!=0) //cts=1 may Slave chua bao nhan duoc data cts=inport(STM)&16; outportb(CTM,rts); //Hoi co nhan tiep khong }//End transcom /*--------------Ham nhan mot ki tu tu thanh ghi TXDATA-----------*/ int get_character() { int status; do { status=inportb(LSR)&0x01; }while(status!=0x01); return(inportb(TXDATA)); } /*----------------Ham nhan mot ki tu tu may Master-----------------*/ int recievechar() { cts=inportb(STM)&16; rts=inportb(CTM)|2; //Dat rts=1 outportb(CTM,rts); //Bao da san sang nhan while(cts!=16) //cts=0 may Master chua gui data den cts=inportb(STM)&16; c=get_character(); //Nhan ki tu tu bo dem cts=inportb(STM)&16; rts=inportb(CTM)&253;//Dat rts=0 outportb(CTM,rts); //Bao da nhan duoc data while(cts!=0)//cts=1 chua nhan duoc tin hieu hoi lai cua Master cts=inportb(STM)&16; return c; //tra ham ve gia tri ki tu vua nhan duoc }//End receivechar /*------------Ham nhan ki tu tu may MASTER va ghi vao File---------*/ void receivecom() { //Doc ten File luu tru du lieu nhan duoc tu ban phim redo1:printf("\nBan hay nhap ten File luu tru du lieu vua nhan\n"); fflush(stdin); gets(fnr); fpr=fopen(fnr,"wt"); if(fpr==NULL) { printf("\nLoi khong ghi duoc"); printf("\nBan co muon luu vao File khac khhong\n\n"); fflush(stdin); switch(tolower(getch())) { case 'c':goto redo1; default:exit(1); } }//End of if printf("\nDang cho nhan du lieu------------------------------\n"); c=0; //Nhan ki tu qua COM va ghi vao File while((c=recievechar())!=26)//Chua gap ki tu ket thuc printf("%c",c); //In ki tu vua nhan duoc de minh hoa fputc(c,fpr); //Ghi ki tu nhan duoc vao File fclose(fpr); printf("\nDa nhan xong du lieu---------------------------------\n"); }//End receivecom /*-----------Ham gui mot File hoan chinh qua cong COM--------------*/ void send_file() { int c; FILE *fpt; char fnt[50]; clrscr(); //Doc ten File tu ban phim redo:printf("\nNhap ten File ban muon gui:\n"); gets(fnt); fpt=fopen(fnt,"rt"); if(fpt==NULL) { printf("\nFile khong truy nhap duoc"); printf("\nBan co muon doc File khac khong\n(C/K)\n"); switch(getch()) { case'c':goto redo; default:exit(1); }//end switch } //end if printf("\nDang cho truyen du lieu------------------------------\n"); //Doc ki tu tren file va truyen qua COM while((c=getc(fpt))!=EOF) { transcom(c); printf("%c",c);//in len man hinh de minh hoa } transcom(26);//Truyen ki tu bao hieu ket thuc printf("\nDa truyen xong---------------------------------------\n"); //Doc lai File vua gui de kiem tra printf("\nBan co muon doc File vua nhan khong\n\n"); fflush(stdin); switch(tolower(getch())) { case 'c':readfile(fnt); default:exit(1); } getch(); exit(0); }//End send_file /*--------------Ham nhan File hoan chinh qua COM-------------------*/ void receive_file() { clrscr(); receivecom(); //Doc file vua nhan de kiem tra lai printf("\nBan co muon doc File vua nhan khong\n\n"); fflush(stdin); switch(getch()) { case 'c': readfile(fnr); default:exit(1); } }//End of Receive_file /*-----------------------------------------------------------------*/ /*-------------CHUONG TRINH CHAT QUA CAC LOAI CONG-----------------*/ void chat() { clrscr(); menuchat(); redochat:fflush(stdin); switch(tolower(getch())) { case 'l':lptchat(); case 'c':comchat(); default: //Neu nhap sai phim chuc nang thi cho phep nhap lai { textcolor(YELLOW); gotoxy(1,wherey()); cprintf("\nBAN DA NHAP SAI PHIM CHUC NANG HAY:AN C DE NHAP LAI\n"); gotoxy(1,wherey()); textcolor(WHITE); if(getch()=='c') goto redochat; else exit(1); } } } /*---------------chuong trinh chat qua cong LPT--------------------*/ void lptchat() { clrscr(); menuchatlpt(); textcolor(YELLOW); gotoxy(1,wherey()); cprintf("BAN DANG THAM GIA VAO CHUONG TRINH CHAT QUA CONG LPT\n"); gotoxy(1,wherey()); textcolor(WHITE); redochatlpt:fflush(stdin); switch(tolower(getch())) { case 'm': { textcolor(YELLOW); gotoxy(1,wherey()); cprintf("\nBAN DANG THAM GIA VAO CHUONG TRINH CHAT QUA CONG LPT VOI VAI TRO MASTER\n"); gotoxy(1,wherey()); textcolor(WHITE); masterchat(); } case 's': { textcolor(YELLOW); gotoxy(1,wherey()); cprintf("\nBAN DANG THAM GIA VAO CHUONG TRINH CHAT QUA CONG LPT VOI VAI TRO SLAVE\n"); gotoxy(1,wherey()); textcolor(WHITE); slavechat(); } default: //Neu nhap sai phim chuc nang thi cho phep nhap lai { textcolor(YELLOW); gotoxy(1,wherey()); cprintf("\nBAN DA NHAP SAI PHIM CHUC NANG HAY:AN C DE NHAP LAI\n"); gotoxy(1,wherey()); textcolor(WHITE); if(getch()=='c') goto redochatlpt; else exit(1); } } } /*----------Ham gui mot cau thoai nhap tu ban phim qua cong LPT------*/ void sendchat() { testm=0;i=0; fflush(stdin); while((i=getche())!=13) { if(i==27) testm=i; if(fpl==NULL) { fpl=(list*)malloc(sizeof (list)); p=fpl; } else { p->next=(list*)malloc(sizeof (list)); p=p->next; } p->value=i; p->next=NULL; fflush(stdin); }//End while p->next=(list*)malloc(sizeof (list)); p=p->next; p->value=13; p->next=NULL;//Ghi them ki tu 13 vao cuoi danh sach //gui danh sach p=fpl; temc=inportb(cport); temc=temc|1; //Strobe=1 outportb(cport,temc);//bat tay luc ban dau dua erro of slave=0 while(p!=NULL) { trans_character((*p).value); p=p->next; } fpl=NULL;//Khoi tao lai danh sach //Reset lai sport cua may slave de phuc vu cho qua trinh truyen lan sau temc=inportb(cport); temc=temc|1; //Strobe=1 outportb(cport,temc);//reset Slave dua erro of Slave =0 }//End of sendchat /*---------------Ham nhan mot cau thoai qua cong LPT----------------*/ void recievechat() { charac=10;tests=0; temc=inportb(cport); temc=temc&14; outportb(cport,temc); //bat tay ban dau while(charac!=13) { charac=recieve_character(); printf("%c",charac); if (charac==27) tests=charac; } temc=inportb(cport); temc=temc|1; //Strobe=1=>Dat lai Error of slave=0 outportb(cport,temc); //Reset lai Master }//End of receivechat /*----------Ham tao chuc nang chat qua LPT voi vai tro Master--------*/ void masterchat() { testm=tests=0; while((testm!=27)&&(tests!=27)) { textcolor(YELLOW); gotoxy(1,wherey()); cprintf("\nMaster:"); textcolor(WHITE); sendchat(); textcolor(YELLOW); gotoxy(1,wherey()); cprintf("\nSlave:"); textcolor(WHITE); recievechat(); printf("\n--------------------"); } printf("\nKet thuc qua trinh chat-Hen gap lai\n"); getch(); exit(1); }//End of Masterchat /*----------Ham tao chuc nang chat qua LPT voi vai tro Slave---------*/ void slavechat() { testm=tests=0; while((testm!=27)&&(tests!=27)) { textcolor(YELLOW); gotoxy(1,wherey()); cprintf("\nMaster:"); textcolor(WHITE); recievechat(); textcolor(YELLOW); gotoxy(1,wherey()); cprintf("\nSlave:"); textcolor(WHITE); sendchat(); printf("\n--------------------"); } printf("\nKet thuc qua trinh Chat-Hen gap lai\n"); getch(); exit(1); }//End of Slavechat /*-----------------Chuong trinh chat qua cong COM--------------------*/ void comchat() { clrscr(); menuchatcom(); textcolor(YELLOW); gotoxy(1,wherey()); cprintf("BAN DANG THAM GIA VAO CHUONG TRINH CHAT QUA CONG COM\n"); gotoxy(1,wherey()); textcolor(WHITE); redochatcom:fflush(stdin); switch(tolower(getch())) { case 'm': { textcolor(YELLOW); gotoxy(1,wherey()); cprintf("\nBAN DANG THAM GIA VAO CHUONG TRINH CHAT QUA CONG COM VOI VAI TRO MASTER\n"); gotoxy(1,wherey()); textcolor(WHITE); masterchatc(); } case 's': { textcolor(YELLOW); gotoxy(1,wherey()); cprintf("\nBAN DANG THAM GIA VAO CHUONG TRINH CHAT QUA CONG COM VOI VAI TRO SLAVE\n"); gotoxy(1,wherey()); textcolor(WHITE); slavechatc(); } default: //Neu nhap sai phim chuc nang thi cho phep nhap lai { textcolor(YELLOW); gotoxy(1,wherey()); cprintf("\nBAN DA NHAP SAI PHIM CHUC NANG HAY:AN C DE NHAP LAI\n"); gotoxy(1,wherey()); textcolor(WHITE); if(getch()=='c') goto redochatcom; else exit(1); } } } /*----------Ham gui mot cau thoai nhap tu ban phim qua cong COM------*/ void sendchatc() { testm=0;i=0; fflush(stdin); while((i=getche())!=13) { if(i==27) testm=i; if(fpl==NULL) { fpl=(list*)malloc(sizeof (list)); p=fpl; } else { p->next=(list*)malloc(sizeof (list)); p=p->next; } p->value=i; p->next=NULL; //printf("\n"); fflush(stdin); }//end if p->next=(list*)malloc(sizeof (list)); p=p->next; p->value=13; p->next=NULL;//Ghi them ki tu 13 vao cuoi danh sach //gui danh sach p=fpl; while(p!=NULL) { transcom((*p).value);//Truyen ki tu trong danh sach qua cong Com p=p->next; } fpl=NULL;//khoi tao lai danh sach }//End of sendchatc void recievechatc() { charac=10;tests=0; while(charac!=13) { charac=recievechar();//Nhan ki tu qua cong Com printf("%c",charac); if (charac==27) tests=charac; } }//End of receivechatc void masterchatc() { testm=tests=0; while((testm!=27)&&(tests!=27)) { textcolor(YELLOW); gotoxy(1,wherey()); cprintf("\nMaster:"); textcolor(WHITE); sendchatc(); textcolor(YELLOW); gotoxy(1,wherey()); cprintf("\nSlave:"); textcolor(WHITE); recievechatc(); printf("\n--------------------"); } printf("\nKet thuc qua trinh chat-Hen gap lai\n"); getch(); exit(1); }//End of Masterchat /*---------------Ham nhan mot cau thoai qua cong COM----------------*/ void slavechatc() { testm=tests=0; while((testm!=27)&&(tests!=27)) { textcolor(YELLOW); gotoxy(1,wherey()); cprintf("\nMaster:"); textcolor(WHITE); recievechatc(); textcolor(YELLOW); gotoxy(1,wherey()); cprintf("\nSlave:"); textcolor(WHITE); sendchatc(); printf("\n--------------------"); } printf("\nKet thuc qua trinh Chat-Hen gap lai\n"); getch(); exit(1); }//End of Slavechatc /*------------------------------------------------------------------*/ /*-----------------------Cac ham giao dien--------------------------*/ /*-----------Ham tao Menu giao dien cho giao tiep com---------------*/ void menucom() { char fn[50]; textmode(C80); textbackground(GREEN); window(1,1,80,25); clrscr(); textbackground(BLUE); window(20,2,60,8); clrscr(); textcolor(LIGHTMAGENTA); cprintf("\n%5cCOM - DATA TRANSFORMER PROGRAM",' '); cprintf("%15cDESIGNED BY: E-SOFT",' '); cprintf("%22c*****************",' '); textcolor(WHITE); gotoxy(1,3); cprintf("\n\n%3cTRANS DATA:T RECIEVE DATA:R\n",' '); textbackground(BLACK); window(1,10,80,25); }//end of menucom /*-----------------Ham tao Menu giao dienLPT-----------------------*/ void menulpt() { char fn[50]; textmode(C80); textbackground(GREEN); window(1,1,80,25); clrscr(); textbackground(RED); window(20,2,60,8); clrscr(); textcolor(YELLOW); cprintf("\n%6cLPT - DATA TRANSFORMER PROGRAM",' '); cprintf("%15cDESIGNED BY: E-SOFT",' '); cprintf("%22c*****************",' '); textcolor(WHITE); gotoxy(1,3); cprintf("\n\n%3cTRANS DATA:T RECIEVE DATA:R\n",' '); textbackground(BLACK); window(1,10,80,25); }//end of menulpt /*-----------Ham tao Menu giao dien chiuong trinh chinh--------------*/ void menu() { char fn[50]; textmode(C80); textbackground(GREEN); window(1,1,80,25); clrscr(); textbackground(BLUE); window(20,2,60,8); clrscr(); textcolor(LIGHTMAGENTA); cprintf("\n%5cPORT - DATA TRANSFORMER PROGRAM",' '); cprintf("%15cDESIGNED BY: E-SOFT",' '); cprintf("%22c*****************",' '); textcolor(WHITE); gotoxy(1,3); cprintf("\n\n%3cTRANS LPT:L CHAT:T TRANS COM:C\n",' '); textbackground(BLACK); window(1,10,80,25); }//end of menu /*------------------Ham tao me nu cho chat ultilities----------------*/ void menuchat() { char fn[50]; textmode(C80); textbackground(GREEN); window(1,1,80,25); clrscr(); textbackground(BLUE); window(20,2,60,8); clrscr(); textcolor(LIGHTMAGENTA); cprintf("\n%6cPORT CHATTING UTILITIES PROGRAM",' '); cprintf("%15cDESIGNED BY: E-SOFT",' '); cprintf("%22c*****************",' '); textcolor(WHITE); gotoxy(1,3); cprintf("\n\n%3c LPT CHAT:L COM CHAT:C\n",' '); textbackground(BLACK); window(1,10,80,25); }//end of menuchat /*--------------------Ham tao me nu cho LPT chat--------------------*/ void menuchatlpt() { char fn[50]; textmode(C80); textbackground(GREEN); window(1,1,80,25); clrscr(); textbackground(BLUE); window(20,2,60,8); clrscr(); textcolor(LIGHTMAGENTA); cprintf("\n%6cLPT CHATTING UTILITIES PROGRAM",' '); cprintf("%15cDESIGNED BY: E-SOFT",' '); cprintf("%22c*****************",' '); textcolor(WHITE); gotoxy(1,3); cprintf("\n\n%3c MASTER CHAT:M SLAVE CHAT:S",' '); textbackground(BLACK); window(1,10,80,25); }//end of menuchatlpt /*---------------------Ham tao me nu cho COM chat--------------------*/ void menuchatcom() { char fn[50]; textmode(C80); textbackground(GREEN); window(1,1,80,25); clrscr(); textbackground(BLUE); window(20,2,60,8); clrscr(); textcolor(LIGHTMAGENTA); cprintf("\n%6cCOM CHATTING UTILITIES PROGRAM",' '); cprintf("%15cDESIGNED BY: E-SOFT",' '); cprintf("%22c*****************",' '); textcolor(WHITE); gotoxy(1,3); cprintf("\n\n%3c MASTER CHAT:M SLAVE CHAT:S",' '); textbackground(BLACK); window(1,10,80,25); }//end of menuchatcom /*------------------------Ham doc File------------------------------*/ void readfile(char fn[50]) { fp=fopen(fn,"rt"); count=j=0; k=0; while((i=getc(fp))!=EOF) { printf("%c",i); count++; if(i==10)//gap ki tu xuong dong { k++;j++; } if(k==40)//hien thi duoc 40 dong thi xoa het man hinh de hien trang moi { getch();//bam phim bat ki de lat sang trang clrscr(); k=0; } }//end While fclose(fp); printf("\nFile vua doc co dung luong %li Byte",count); printf("\nFile vua doc co %li dong\n",j); getch(); }//end of read File TÀI LIỆU THAM KHẢO ……. 000 …… 1. Ngôn ngữ lập trình C-cơ bản và nâng cao Phạm Văn Ất-NXB giao thông vận tải-2002 2. The C language Bjarne Stroustrup-Nhà xuất bản Weshley Longman Inc 3. Cấu trúc máy tính và thiết bị ngoại vi Nguyễn Nam Trung-Nhà xuất bản KHKT-2000 4. Kĩ thuật ghép nối máy tính Ngô Diên Tập-Nhà xuất bản KHKT-2004 5. The Parallel Port Complete Jan Axelson-Lakeview Research Madison The Serial Port Complete Jan Axelson-Lakeview Research Madison 7. Programming Parallel Port Dhananjay V. Gadre R&D book-Lawrence 8. Interfacing Rs-232 John Peacock 9. Các trang Web

Các file đính kèm theo tài liệu này:

  • doc24794.doc
Tài liệu liên quan