⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 4.txt

📁 首先要设定通信协议
💻 TXT
字号:
串口通信,首先要对端口进行初始化。
具体的参数可参考下面:1. 寄存器定义(以COM1为例) 

序号 0x3fb.7 寄存器地址 定义 
1 1 0x3f8 波特率因子LSB(W) 
2 1 0x3f9 波特率因子MSB(W) 
3 0 0x3f8 收/发数据寄存器(R/W) 
4 X 0x3f9 中断允许寄存器(W) 
5 X 0x3fa 中断识别寄存器(R) 
6 X 0x3fb 线路控制寄存器(W) 
7 X 0x3fc Modem控制寄存器(W) 
8 0x3fd 线路状态寄存器(R) 
9 0x3fe Modem状态寄存器(R) 
************************************************************************
int bioscom(int cmd,char type,int port) 本函数负责对数据的通讯工作, 位于conio.h中
cmd可以为以下值: 
0 置通讯参数为字节byte值 1 发送字符通过通讯线输出 
2 从通讯线接受字符 3 返回通讯的当前状态 
port为通讯端口,port=0时通讯端口为COM1,port=1时通讯端口为COM2,以此类推 
byte为传送或接收数据时的参数,为以下位的组合: 
┌───┬─────┬───┬─────┐ 
│byte值│意义      │byte值│意义      │ 
├───┼─────┼───┼─────┤ 
│0x02  │7数据位   │0x03  │8数据位   │ 
│0x04  │2停止位   │0x00  │无奇偶性  │ 
│0x18  │偶数奇偶性│0x00  │110波特   │ 
│0x40  │300波特   │0x60  │600波特   │ 
│0xA0  │2400波特  │0xC0  │4800波特  │ 
│0x00  │1停止位   │0x08  │奇数奇偶性│
│0x20  │150波特   │0x80  │1200波特  │
│0xE0  │9600波特  │      │          │
└───┴─────┴───┴─────┘ 

例如:0xE0|0x08|0x00|0x03即表示置通讯口为9600波特,奇数奇偶性,1停止位, 
8数据位. 

函数返回值为一个16位整数,定义如下: 
第15位 超时 
第14位 传送移位寄存器空 
第13位 传送固定寄存器空 
第12位 中断检测 
第11位 帧错误 
第10位 奇偶错误 
第 9位 过载运行错误 
第 8位 数据就绪 
第 7位 接收线信号检测 
第 6位 环形指示器 
第 5位 数据设置就绪 
第 4位 清除发送 
第 3位 δ接收线信号检测器 
第 2位 下降边环形检测器 
第 1位 δ数据设置就绪 
第 0位 δ清除发送
*************************************************************
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波特,奇数奇偶性,1停止位, 8数据位. 函数返回值为一个16位整数
Example:bioscom(0, 0xe3, 0); /* 9600 baud, no parity, one stop, 8 bits */


*********************************************************************************
*********************************************************************************
8250系列寄存器的定义:
寄存器名称 偏移量 缩写 访问方式
接收缓冲区寄存器 0 RBR 只读
发送保持寄存器 0 THR 只写
中断启用寄存器 1 IER 读/写
中断标识寄存器 2 IIR 只读
FIFO控制寄存器 2 FCR 只写
线路控制寄存器 3 LCR 读/写
调制解调器控制寄存器 4 MCR 读/写
线路状态寄存器 5 LSR 只读
调制解调器状态寄存器 6 MSR 只读
临时寄存器(16450/550) 7 SCR 读/写
除数寄存器(16位) 0/1 DL 读/写

上表中所列的偏移量是指基于I/O总线的UART的基址所具有的偏移量。
举例说明,IBM PC中的COM1通常被设成为地址0X3F8,因此对一些参数的设置可以用
outputb(0x3f8 偏移量,****)来设置。

void Init() 
{ 
outportb(0x3fb,0x80); //outportb(0x3f8 3,0x80) 对LCR的最高位置‘1',是说明以下为输入波特率因子
outportb(0x3f8,0x0c); //outportb(0x3f8 0,0xoC) 输入波特率因子的低8位
outportb(0x3f9,0x00); //outportb(0x3f8 1,0x00) 输入波特率因子的高8位
outportb(0x3fb,0x1f); //outportb(0x3f8 3,0x1f) 设置奇偶校验位,中止位,数据位
有必要把线路控制寄存器(8位)的各位设置说明一下:
第7位: 因子锁存访问位
第6位: 中断控制
第5,4,3位:奇偶校验位
第2位: 终止位的位数
第1,0位: 字长选择
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; 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -