请各位大侠把刀相助!!串行通信
iec 2002-12-23 11:31:59 开发语言bcb6/c 语言 环境 window98 dos
bcb6 下程序如下:DOS下C代码类似
class ComTx
{
private:
public:
int SendByte(int byte);
Byte inp(int Port);
void outp(int Port,unsigned char Dbyte);
void InitCom();
void SendAskRecive(unsigned char ch);
};
CPP文件:
ComTx *comt = new ComTx();
int waittime1=0,waittime2=0,waittime3=0;
void ComTx:: outp(int Port,byte Dbyte)
{
_asm
{
mov dx,word ptr Port
mov al,byte ptr Dbyte
out dx,al
}
/*
_asm
{
mov ax,word ptr Port
mov dx,ax
mov al,byte ptr Dbyte
out dx,al
}
*/
}
Byte ComTx:: inp(int Port)
{
Byte Result;
_asm
{
mov dx,word ptr Port
in al,dx
mov byte ptr Result,al
}
return Result;
/*
_asm
{
mov ax,word ptr Port
mov dx,ax
in al,dx
mov ah,0
mov Byte ptr Result,al
}
*/
}
void ComTx::InitCom()
{
int set_bdl=0,set_joxy=0,set_tzw=0,set_sjw=0;
char BaultL,BaultH;// if set_bdl,set_joxy,set_tzw,set_sjw
char Ldata=0;
char status;
if (set_bdl==0)
BaultL=0x0c,BaultH=0x00;
if (set_bdl==1)
BaultL=0x18,BaultH=0x00;
if (set_bdl==2)
BaultL=0x30,BaultH=0x00;
if (set_bdl==3)
BaultL=0x60,BaultH=0x00;
if (set_bdl==4)
BaultL=0xc0,BaultH=0x00;
if (set_bdl==5)
BaultL=0x80,BaultH=0x01;
if (set_bdl==6)
BaultL=0x03,BaultH=0x00;
if (set_bdl==7)
BaultL=0x17,BaultH=0x04;
if (set_sjw==0)
Ldata|=0x03;
if (set_sjw==1)
Ldata|=0x02;
if (set_tzw==0)
Ldata|=0x00;
if (set_tzw==1)
Ldata|=0x04;
if (set_joxy==0)
Ldata|=0x00;
if (set_joxy==1)
Ldata|=0x08;
if (set_joxy==2)
Ldata|=0x18;
outp(LCR,0x80);
outp(LOW,BaultL); //0Ch
outp(HIG,BaultH); //00h
// outp(LCR,0x03);
outp(LCR,0);
outp(LCR,Ldata);
outp(IER,0x01); //allow ComPort interrupt
outp(MCR,0x8);
status= inp(P8259_IER);
status=0xa0;
outp(P8259_IER,status);
}
int ComTx::SendByte(int byte)
{
char status ;
unsigned long int i;
for (i=1;i<0x1f;i++)
{
status=inp(LSR);
if ((status&0x20)==0x20)
{
outp(BUF,byte);
ShowMessage("ok");
return 1;
}
else status=inp(BUF);
}
return -1; //if success return 0 else return -1
}
void ComTx::SendAskRecive(unsigned char ch)
{
while(SendByte(0x1b)==-1&&waittime1<=1000)
{
waittime1++;
}
while(SendByte(ch)==-1&&waittime2<=1000)
{
waittime2++;
}
while(SendByte('#')==-1&&waittime3<=10)
{
waittime3++;
}
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
comt->SendAskRecive('&');
waittime1=0;
waittime2=0;
waittime3=0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
comt->InitCom();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
char status;
status=comt->inp(P8259_IER);
status=0x00;
comt->outp(P8259_IER,status);
}
初始化串口,发送一个字符到COM1口,另外一台机器在DOS下,以中断方式接受数据,当
当数据到时产生中断,但是如果(DOS下的那台机器)当它发送数据时,在BCB6下接受数据,只能一查询的方式去读数据(读端口丢入线程中执行),BCB有没有中断方式接受数据?那么串行通讯在WINDOWS下只能一查询方式吗? 本程序不使用API函数以及第三方控件