📄 4.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 + -