📄 rs232.cpp
字号:
/*1)初始化串口函数
参数说明:
comPortAddr串口端口地址(c0M1口是03F8H cOM2口是02F8H)
IntvectNum 中断处理号(一般选择0x0b)
Baud 波特率
Data 数据位
stop 停止位
Parity 奇偶校验位*/
#include <stdio.h>
#include <stdlib.h>
#include <bios.h>
#include <dos.h>
void Init_C0M (int ComPortAddr,unsigned char IntVectNum, int Baud,
unsigned char Data, unsigned char Stop,unsigned char Parity)
{
unsigned char High,Low;
int f;
comportaddr=ComPortAddr;
intvectnum=IntVectNum;
CharsInBuf=0; CircIn=0; CircOut=0;
//set baud rate 设置波特率
f=(Baud/100);
f=1152/f; High=f/256;
Low=f-High*256;
outportb(ComPortAddr+3,0x80);
outportb(ComPortAddr,Low);
outportb(ComPortAddr+1,High);
//set data bits stop bits,and parity设置数据位 停止位 校验
Data=(Data-5)|((Stop-1)*4);
if(Parity==2)
Data=Data|0x18;
else if(Parity==1)
Data=Data|0x8;
outportb(ComPortAddr+3,Data);
//set MCR (DTR,RTS=0,OUT1,OUT2=1)设置MODEM控制位
outportb(ComPortAddr+4,0x0b);
//set input data ready interrupt mode设置输入数据中断模式
outportb(ComPortAddr+1,0x01);
//set 0C interrupt vector设置中断源
disable();
OldAsyncInt=getvect(IntVectNum);
setvect(IntVectNum,AsyncInt);
enable();
//open interrupt打开中断
maskb=inp(Port8259+1);
if(IntVectNum==0x0c)
outport(Port8259+1,maskb&0xef); //INT4
else
outport(Port8259+1,maskb&0xf7); //INT3
}
//握手信号控制
void wait(char ch)
{
if(ReceiveChar(COM232)==ch)
return;//确定对方已经成功接受或者发送,就返回空
else
{
SendChar(ch); //把接受或者发送出去的字符重新发送
wait(ch); //递归调用,直到对方确定接受或者发送成功为止
}
}
//向串行口发送一个字符
//该函数的思想是先申请占有中断,后进行发送数据通信;
int SendChar(unsigned char Char)
{
do
{
printf("send waiting>>>>>>>>>\n");//在屏幕上提示用户正在等待中断进行
}
while((inportb(comportaddr+5)&0x20)==0);//检查发送端数据线是否准备好
outportb(comportaddr,Char); //发送数据到缓冲区
return (Char);//返回发送完成的字符
}
//从串行口接受一个字符
//该函数的思想是先取得中断控制,后面进行接收数据通信;
int ReceiveChar(int port)
{
do
{
printf("receive waiting>>>>>>>\n");//在屏幕上提示用户正在等待中断进行
}
while((inportb(comportaddr+5)&0x01)==0);//检查接收端数据线是否准备好
return (inportb(port));//从接收数据缓冲区取数据
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -