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

📄 rs232.cpp

📁 用C++写的实现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 + -