#include <stdio.h>
#include <string.h>
#include <dos.h>
#define LSB 0
#define MSB 1
#define RXR 0
#define TXR 0
#define IER 1
#define IIR 2
#define LCR 3
#define MCR 4
#define LSR 5
#define MSR 6
#define Com1_base 0x3f8
#define uchar unsigned char
volatile uchar i=0;
volatile uchar flag=0;
volatile uchar inputdata;
volatile uchar onInput = 0x00;
volatile uchar onOutput = 0x00;
uchar r=0;
uchar data [255];
uchar datad [255];
void interrupt (*OldVect)();
void interrupt SerialISR();
void InitCom()
{
uchar inttemp;
/*设置波特率什么的*/
outportb(Com1_base+LCR,0x80);
outportb(Com1_base+LSB,0x0c);
outportb(Com1_base+MSB,0x00);
outportb(Com1_base+LCR,0x03);
outportb(Com1_base+IER,0x01);
/*设置中断向量*/
OldVect = getvect(0x0c);
disable();
inttemp = inportb(0x21)&0xef;
outportb(0x21,inttemp);
setvect(0x0c,SerialISR);
enable();
}
void CloseCom()
{
disable();
outportb(Com1_base+IER,0x00);
outportb(Com1_base,0x00);
outportb(0x21,inportb(0x21)|~(0xef));
setvect(0x0c,OldVect);
}
void interrupt SerialISR()
{
/*串口中断服务代码*/
inputdata = inportb(Com1_base+RXR);
inputdata ='$';
if(inputdata==10)
{
flag==0;
outportb(0x20,0x20); /*中断结束的代码*/
}
if(inputdata=='$')
{
flag=1;
i=1;
/*服务代码结束*/
outportb(0x20,0x20); /*中断结束的代码*/
}
if(flag==1)
{
data[i]=inputdata;
i++;
}
}
void SendChar(uchar key)
{
while( ((inportb(Com1_base + LSR)) & 0x40) == 0);
outportb(Com1_base + TXR,key);
}
void main()
{
uchar key;
uchar m_sTime,SectionID;
InitCom();
while(1)
{
printf("Bye~.\n");
if(data[3]=='$')
{
strcpy (data ,datad);
for(r=0;r<255;r++){
if(datad[i]=='$') //帧头,SectionID为逗号计数器
SectionID=0;
if(datad[i]==10){ //帧尾
}
if(datad[i]==',') //逗号计数
SectionID++;
else {
switch(SectionID){
case 1: //提取出时间
m_sTime+=datad[i];
printf("%s\n",m_sTime);
break;
case 2: //判断数据是否可信(当GPS天线能接收到有3颗GPS卫星时为A,可信)
if(datad[i]=='A')
// GPSParam[m_nNumber].m_bValid=true;
break;
case 3: //提取出纬度
// m_sPositionY+=datad[i];
break;
case 5: //提取出经度
// m_sPositionX+=datad[i];
break;
case 9: //提取出日期
// m_sDate+=datad[i];
break;
default:
break;
}
}
}
}
}
CloseCom();
printf("Bye~.\n");
}