请各位大侠把刀相助!!串行通信

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函数以及第三方控件



...全文
68 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
warton 2002-12-23
  • 打赏
  • 举报
回复
http://bcbget.myrice.com/net.htm
NowCan 2002-12-23
  • 打赏
  • 举报
回复
Windows中一般都是多线程方式。
http://www.gjwtech.com/serialcomm.htm

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧