?? 4.txt
字號(hào):
串口通信,首先要對(duì)端口進(jìn)行初始化。
具體的參數(shù)可參考下面:1. 寄存器定義(以COM1為例)
序號(hào) 0x3fb.7 寄存器地址 定義
1 1 0x3f8 波特率因子LSB(W)
2 1 0x3f9 波特率因子MSB(W)
3 0 0x3f8 收/發(fā)數(shù)據(jù)寄存器(R/W)
4 X 0x3f9 中斷允許寄存器(W)
5 X 0x3fa 中斷識(shí)別寄存器(R)
6 X 0x3fb 線路控制寄存器(W)
7 X 0x3fc Modem控制寄存器(W)
8 0x3fd 線路狀態(tài)寄存器(R)
9 0x3fe Modem狀態(tài)寄存器(R)
************************************************************************
int bioscom(int cmd,char type,int port) 本函數(shù)負(fù)責(zé)對(duì)數(shù)據(jù)的通訊工作, 位于conio.h中
cmd可以為以下值:
0 置通訊參數(shù)為字節(jié)byte值 1 發(fā)送字符通過(guò)通訊線輸出
2 從通訊線接受字符 3 返回通訊的當(dāng)前狀態(tài)
port為通訊端口,port=0時(shí)通訊端口為COM1,port=1時(shí)通訊端口為COM2,以此類推
byte為傳送或接收數(shù)據(jù)時(shí)的參數(shù),為以下位的組合:
┌───┬─────┬───┬─────┐
│byte值│意義 │byte值│意義 │
├───┼─────┼───┼─────┤
│0x02 │7數(shù)據(jù)位 │0x03 │8數(shù)據(jù)位 │
│0x04 │2停止位 │0x00 │無(wú)奇偶性 │
│0x18 │偶數(shù)奇偶性│0x00 │110波特 │
│0x40 │300波特 │0x60 │600波特 │
│0xA0 │2400波特 │0xC0 │4800波特 │
│0x00 │1停止位 │0x08 │奇數(shù)奇偶性│
│0x20 │150波特 │0x80 │1200波特 │
│0xE0 │9600波特 │ │ │
└───┴─────┴───┴─────┘
例如:0xE0|0x08|0x00|0x03即表示置通訊口為9600波特,奇數(shù)奇偶性,1停止位,
8數(shù)據(jù)位.
函數(shù)返回值為一個(gè)16位整數(shù),定義如下:
第15位 超時(shí)
第14位 傳送移位寄存器空
第13位 傳送固定寄存器空
第12位 中斷檢測(cè)
第11位 幀錯(cuò)誤
第10位 奇偶錯(cuò)誤
第 9位 過(guò)載運(yùn)行錯(cuò)誤
第 8位 數(shù)據(jù)就緒
第 7位 接收線信號(hào)檢測(cè)
第 6位 環(huán)形指示器
第 5位 數(shù)據(jù)設(shè)置就緒
第 4位 清除發(fā)送
第 3位 δ接收線信號(hào)檢測(cè)器
第 2位 下降邊環(huán)形檢測(cè)器
第 1位 δ數(shù)據(jù)設(shè)置就緒
第 0位 δ清除發(fā)送
*************************************************************
For initialization, the byte is made up of the following bits:
0000 0000
7654 3210 Meaning
---- --10 7 bits/character(0x02)
---- --11 8 bits/character(0x03)
---- -0-- 1 stop bit(0x00)
---- -1-- 2 stop bits(0x04)
---X 0--- no parity(0x00)
---0 1--- odd parity(0x08)
---1 1--- even parity(0x18)
000- ---- 110 baud(0x00)
001- ---- 150 baud(0x20)
010- ---- 300 baud(0x40)
011- ---- 600 baud(0x60)
100- ---- 1200 baud(0x80)
101- ---- 2400 baud(0xA0)
110- ---- 4800 baud(0xC0)
111- ---- 9600 baud(0xE0)
例如:0xE0|0x08|0x00|0x03即表示置通訊口為9600波特,奇數(shù)奇偶性,1停止位, 8數(shù)據(jù)位. 函數(shù)返回值為一個(gè)16位整數(shù)
Example:bioscom(0, 0xe3, 0); /* 9600 baud, no parity, one stop, 8 bits */
*********************************************************************************
*********************************************************************************
8250系列寄存器的定義:
寄存器名稱 偏移量 縮寫 訪問(wèn)方式
接收緩沖區(qū)寄存器 0 RBR 只讀
發(fā)送保持寄存器 0 THR 只寫
中斷啟用寄存器 1 IER 讀/寫
中斷標(biāo)識(shí)寄存器 2 IIR 只讀
FIFO控制寄存器 2 FCR 只寫
線路控制寄存器 3 LCR 讀/寫
調(diào)制解調(diào)器控制寄存器 4 MCR 讀/寫
線路狀態(tài)寄存器 5 LSR 只讀
調(diào)制解調(diào)器狀態(tài)寄存器 6 MSR 只讀
臨時(shí)寄存器(16450/550) 7 SCR 讀/寫
除數(shù)寄存器(16位) 0/1 DL 讀/寫
上表中所列的偏移量是指基于I/O總線的UART的基址所具有的偏移量。
舉例說(shuō)明,IBM PC中的COM1通常被設(shè)成為地址0X3F8,因此對(duì)一些參數(shù)的設(shè)置可以用
outputb(0x3f8 偏移量,****)來(lái)設(shè)置。
void Init()
{
outportb(0x3fb,0x80); //outportb(0x3f8 3,0x80) 對(duì)LCR的最高位置‘1',是說(shuō)明以下為輸入波特率因子
outportb(0x3f8,0x0c); //outportb(0x3f8 0,0xoC) 輸入波特率因子的低8位
outportb(0x3f9,0x00); //outportb(0x3f8 1,0x00) 輸入波特率因子的高8位
outportb(0x3fb,0x1f); //outportb(0x3f8 3,0x1f) 設(shè)置奇偶校驗(yàn)位,中止位,數(shù)據(jù)位
有必要把線路控制寄存器(8位)的各位設(shè)置說(shuō)明一下:
第7位: 因子鎖存訪問(wèn)位
第6位: 中斷控制
第5,4,3位:奇偶校驗(yàn)位
第2位: 終止位的位數(shù)
第1,0位: 字長(zhǎng)選擇
flylonginsky(AGV->future) 于 2004-11-5 13:10:33
#include <bios.h>
#include <conio.h>
#define COM1 0
#define DATA_READY 0x100
#define TRUE 1
#define FALSE 0
#define SETTINGS ( 0x80 | 0x02 | 0x00 | 0x00)
int main(void)
{
int in, out, status, DONE = FALSE;
bioscom(0, SETTINGS, COM1);
cprintf("... BIOSCOM [ESC] to exit ...\n");
while (!DONE)
{
status = bioscom(3, 0, COM1);
if (status & DATA_READY)
if ((out = bioscom(2, 0, COM1) & 0x7F) != 0)
putch(out);
if (kbhit())
{
if ((in = getch()) == '\x1B')
DONE = TRUE;
bioscom(1, in, COM1);
}
}
return 0;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -