1. 程式人生 > >深入淺出VC++串列埠程式設計之DOS的串列埠程式設計

深入淺出VC++串列埠程式設計之DOS的串列埠程式設計

/* Name : Sample Comm's Program - 1024 Byte Buffer - buff1024.c */
/* Written By : Craig Peacock <[email protected]> */
#include <dos.h>
#include <stdio.h>
#include <conio.h>

#define PORT1 0x3F8 /* Port Address Goes Here */
#define INTVECT 0x0C /* Com Port's IRQ here (Must also change PIC setting) */

/* Defines Serial Ports Base Address */
/* COM1 0x3F8 */
/* COM2 0x2F8 */
/* COM3 0x3E8 */
/* COM4 0x2E8 */

int bufferin = 0;
int bufferout = 0;
char ch;
char buffer[1025];

void interrupt(*oldport1isr)();

void interrupt PORT1INT() /* Interrupt Service Routine (ISR) for PORT1 */
{
 int c;
 do
 {
  c = inportb(PORT1 + 5);
  if (c &1)
  {
   buffer[bufferin] = inportb(PORT1);
   bufferin++;
   if (bufferin == 1024)
   {
    bufferin = 0;
   }
  }
 }
 while (c &1);
  outportb(0x20, 0x20);
}

void main(void)
{
 int c;
 outportb(PORT1 + 1, 0); /* Turn off interrupts - Port1 */

 oldport1isr = getvect(INTVECT); /* Save old Interrupt Vector of later
 recovery */

 setvect(INTVECT, PORT1INT); /* Set Interrupt Vector Entry */
 /* COM1 - 0x0C */
 /* COM2 - 0x0B */
 /* COM3 - 0x0C */
 /* COM4 - 0x0B */

 /* PORT 1 - Communication Settings */

 outportb(PORT1 + 3, 0x80); /* SET DLAB ON */
 outportb(PORT1 + 0, 0x0C); /* Set Baud rate - Divisor Latch Low Byte */
 /* Default 0x03 = 38,400 BPS */
 /* 0x01 = 115,200 BPS */
 /* 0x02 = 57,600 BPS */
 /* 0x06 = 19,200 BPS */
 /* 0x0C = 9,600 BPS */
 /* 0x18 = 4,800 BPS */
 /* 0x30 = 2,400 BPS */
 outportb(PORT1 + 1, 0x00); /* Set Baud rate - Divisor Latch High Byte */
 outportb(PORT1 + 3, 0x03); /* 8 Bits, No Parity, 1 Stop Bit */
 outportb(PORT1 + 2, 0xC7); /* FIFO Control Register */
 outportb(PORT1 + 4, 0x0B); /* Turn on DTR, RTS, and OUT2 */

 outportb(0x21, (inportb(0x21) &0xEF)); /* Set Programmable Interrupt Controller */
 /* COM1 (IRQ4) - 0xEF */
 /* COM2 (IRQ3) - 0xF7 */
 /* COM3 (IRQ4) - 0xEF */
 /* COM4 (IRQ3) - 0xF7 */

 outportb(PORT1 + 1, 0x01); /* Interrupt when data received */

 printf("/nSample Comm's Program. Press ESC to quit /n");

 do
 {
  if (bufferin != bufferout)
  {
   ch = buffer[bufferout];
   bufferout++;
   if (bufferout == 1024)
   {
    bufferout = 0;
   }
   printf("%c", ch);
  }

 if (kbhit())
 {
  c = getch();
  outportb(PORT1, c);
 }
}
while (c != 27);

outportb(PORT1 + 1, 0);
/* Turn off interrupts - Port1 */
outportb(0x21, (inportb(0x21) | 0x10)); /* MASK IRQ using PIC */
/* COM1 (IRQ4) - 0x10 */
/* COM2 (IRQ3) - 0x08 */
/* COM3 (IRQ4) - 0x10 */
/* COM4 (IRQ3) - 0x08 */
setvect(INTVECT, oldport1isr); /* Restore old interrupt vector */
}

相關推薦

深入淺出VC++串列程式設計DOS串列程式設計

/* Name : Sample Comm's Program - 1024 Byte Buffer - buff1024.c *//* Written By : Craig Peacock <[email protected]> */#include <dos.h>#inc

程式設計美3.6——程式設計判斷兩個連結串列是否相交

問題: 給出兩個單向連結串列的頭指標,而兩個連結串列都可能帶環,判斷這兩個連結串列是否相交,並且給出他們相交的第一個節點。 (1)判斷連結串列是否存在環 設定兩個連結串列指標(fast, slow),初始值都指向連結串列頭結點,然後連個指標都往前走,不同的是s

Android網路程式設計socket和http程式設計的區別

HTTP為短連線         Http協議是建立在TCP協議之上的一種應用。它與TCP連線不同之處在於,客戶端每次請求都需要伺服器返回響應,在請求結束後,會主動釋放連線,從建立連線到關閉連線的過程稱為“一次連線”。由於HTTP每次請求都會釋放連線,因為

Java 併發程式設計美:併發程式設計高階篇之一-chat

借用 Java 併發程式設計實踐中的話:編寫正確的程式並不容易,而編寫正常的併發程式就更難了。相比於順序執行的情況,多執行緒的執行緒安全問題是微妙而且出乎意料的,因為在沒有進行適當同步的情況下多執行緒中各個操作的順序是不可預期的。 併發程式設計相比 Java

Java 併發程式設計美:併發程式設計高階篇之一

借用 Java 併發程式設計實踐中的話:編寫正確的程式並不容易,而編寫正常的併發程式就更難了。相比於順序執行的情況,多執行緒的執行緒安全問題是微妙而且出乎意料的,因為在沒有進行適當同步的情況下多執行緒中各個操作的順序是不可預期的。併發程式設計相比 Java 中其他知識點學習起

深入淺出VC++串列程式設計基於控制元件

1.MSComm控制元件  Visual C++為我們提供了一種好用的ActiveX控制元件Microsoft Communications Control(即MSComm)來支援應用程式對串列埠的訪問,在應用程式中插入MSComm控制元件後就可以較為方便地實現對通

深入淺出VC++串列程式設計基本概念

  除錯工具  在MS-DOS下使用的程式設計環境是TC 2.0;  在Windows 2000下的程式設計環境是VC++ 6.0;  藉助工具:串列埠除錯助手2.1(圖8)。 圖8 串列埠除錯助手   串列埠除錯助手是由《Visual C++/Turbo C串列埠通訊程式設計實踐》一書作者龔建偉編寫的

深入淺出VC++串列程式設計簡訊應用開發

前面數次連載我們以較長的篇幅講解了串列埠通訊的硬體原理、DOS平臺控制以及基於WIN32 API、控制元件和第三方類的串列埠程式設計。作為本系列文章的最後一次連載,本章將給出一個典型的應用例項:西門子簡訊服務模組TC35

深入淺出VC++串列程式設計--簡訊應用開發

前面數次連載我們以較長的篇幅講解了串列埠通訊的硬體原理、DOS平臺控制以及基於WIN32 API、控制元件和第三方類的串列埠程式設計。作為本系列文章的最後一次連載,本章將給出一個典型的應用例項:西門子簡訊服務模組TC35的串列埠控制。  1.簡訊控制終端  作為簡訊 (Sho

串列程式設計串列初始化

Linux串列埠程式設計 常見資料通訊方式:並行通訊,序列通訊 UART的主要操作: 資料傳送及接受 產生中斷 產生波特率 Loopback模式 紅外模式 自動流控模式 串列埠引數的配置主要包括:波特率、資料位

UART0串列程式設計系列 串列(UART0)UC/OS(一)

一.在UC/OS中設計串列埠程式所要考慮的問題 1.     串列埠通訊資料以幀為單位進行處理,如果需要接收大量資料,則幀緩衝區規模必然很大;如果需要傳送大量資料,則可將原始資料快看作緩衝區,不需要另外再建立幀緩衝區。 2.     幀緩衝區是全域性資料結構,通常為共

串列通訊 CRC校驗

一、CRC16簡介       迴圈冗餘碼CRC檢驗技術廣泛應用於測控及通訊領域。CRC計算可以靠專用的硬體來實現,但是對於低成本的微控制器系統,在沒有硬體支援下實現CRC檢驗,關鍵的問題就是如何通過軟體來完成CRC計算,也就是CRC演算法的問題。下

串列通訊 QByteArray詳解

QByteArray在串列埠通訊中經常被使用,有一定必要較為全面詳細的對QByteArray進行闡述。本文通過以下幾個部分加以介紹 1 初始化 2 訪問與賦值    訪問QByteArray主要有4中方式,分別為[]、at()、data[]和constDat

018_STM32程式移植_串列接收中文

(一)在平時資料傳輸中很少用到接收中文的情況,但是最近需要用到就花了半天時間來弄弄 (二)接收原理,從現在接收情況分析:一箇中文佔兩個數據的空間,也就是兩個十六進位制可以轉化成為一箇中文 (三)示例情況,用Hex Editor來看看中文 “你好”,可以看到四個十六進位制資料:0xc4,0xe3,0xba,

串列驅動程式設計詳解---串列初始化(上)

TTY驅動程式架構: 1. TTY概念解析     1.1 /dev/ttySCA0     1.2 /dev/tty1-n     1.3 /dev/console       在linux系統中,終端是一類字元型裝置,它包括多種型別,通常使用tty來簡稱各種型別的終端裝

串列驅動寫操作

繼上分析讀操作後。。。。。。。。。。。。。。。。。 “drivers/char/tty_io.c” 此檔案完成核心層函式的實現。包含file_operations結構體與使用者空間進行資料互動。 整體流程如: tty_write–>do_

Android開發jni串列

前言 我第一次聽說串列埠完全是懵逼狀態,腦子沒一點概念,於是我就到處百度,但是發現網上的例子都是一些亂七八糟的程式碼,有程式碼也基本都不會解釋,現在做這個串列埠開發也有段時間了,現在根據我的理解寫了這篇部落格。 串列埠是什麼? 串列埠就是一個可以將

串列驅動程式設計詳解---串列開啟、傳送、接收(下)

上一篇部落格分析了串列埠驅動初始化部分,下面逐步分析串列埠驅動中的開啟串列埠,資料傳送和接收! 初始化主要工作流程: 先來分析串列埠開啟操作流程,還是先上圖: 這裡分析還是離不開上篇部落格中的兩張重要的圖: 串列埠操作重要的資料結構: 由上一篇串列埠驅動分析可知

MTKUART串列收發資料

暫存器 UARTn_RBR: Rx Buffer Register,通過讀取該暫存器接收資料。要求LCR[7]=0。 UARTn_THR: Tx Holding Register,資料先寫入該暫存器,再送至PC端。要求LCR[7]=0。 UARTn_IER

嵌入式Linux驅動學習USART串列控制:基於AT91SAM9261EK

    普通微控制器的串列埠操作比較容易,但是基於Linux系統的串列埠操作難不難呢?其實,基於Linux作業系統的串列埠操作分為兩個部分:串列埠驅動部分(底層驅動與設備註冊)與串列埠的應用程式(使用者程式)。一般廠家或是Linux核心已經提供了基於開發板的串列埠驅動,只需