这段C++代码用Delphi怎样写出来, 100分(100分)

  • 主题发起人 主题发起人 LIUYECAI
  • 开始时间 开始时间
L

LIUYECAI

Unregistered / Unconfirmed
GUEST, unregistred user!
限用通迅构件,MSCOMM, OR SPCOMM:
注: 这是 for dos,or win3.1代码,
通过查询端口状态,然后读取接收数据,并返回 long 数.

long MainWindow::H_position()
{
long position;
int j,
i,
delay,
length,
keycode,
H_exit = 0,
InPut,
slength;

char s[100],
sr[100],
s1[10],
c;
strcpy(sr, "%1PR%");
strcpy(s, "");
do{
InPut=inportb(0x2fd)


}while((InPut &amp
0x0E)||(!(InPut &amp
0x20)));

slength = strlen(sr);

for(i=0;i<slength;i++){
if(sr != '%'){
outportb(0x2f8,(int)sr)

H_delay();
}
else{
outportb(0x2f8,0x0d);
H_delay();
outportb(0x2f8,0x0A);
H_delay();
}
}

while(H_exit == 0)
{

while(inportb(0x2fd)&amp;0x01)
{
c = inportb(0x2f8);

switch(c)
{
case 0x0D: break;
case 0x0A: if( strlen(s) <= 6)
{
strcpy(s," ");
break;
}
else
{
H_exit = 1;
break;
}
case '/0': break;
default :
{
sprintf(s1, "%c", c);
strcat(s, s1);
break;
}
}
}
}
if((keycode=strlen(s)) >= 8) //只取后8位
{
delay = strlen(s) - 8;
for(j=0
j < 8
j++) //前移
{
s[j] = s[j+delay];
}
for(j=8
j<keycode
j++) //后面的清成 '/0'
{
s[j] = '/0';
}
}
position=atol(s)
//

return(position)
//返回 long.

}
 
function H_position: Integer;
var
position,j,i,delay,length,keycode, H_exit,slength: Integer;
InPut:Byte;
s,sr: Array[0..99] of Char;
s1: Array[0..99] of Char;
c: Char;
begin
StrPCopy(sr, '%1PR%');
StrPCopy(s, '');
repeat
asm
mov dx,$2fd;
in al,dx;
mov InPut,al;
end;
until ( ((InPut and $E)=0) and ((InPut and $20)=$20) );
//直到有数据准备好,且无传输错误
//后面刘兄自己改吧
 
Reboot兄:
在Win2k下是不能用嵌入编程的只能用API, MSCOMM!
现在我用的是MSCOMM,所以希望能用MSCOMM把上面的代码转化过来!

哪位高手写一写!可是100相送哦!
 
看看VB的例子,补补身体
Private Sub Form_Load ()
' 保存输入子串的缓冲区
Dim Instring As String
' 使用 COM1。
MSComm1.CommPort = 1
' 9600 波特,无奇偶校验,8 位数据,一个停止位。
MSComm1.Settings = "9600,N,8,1"
' 当输入占用时,
' 告诉控件读入整个缓冲区。
MSComm1.InputLen = 0
' 打开端口。
MSComm1.PortOpen = True
' 将 attention 命令送到调制解调器。
MSComm1.Output = "ATV1Q0" &amp
Chr$(13) ' 确保
' 调制解调器以"OK"响应。
' 等待数据返回到串行端口。
Do
DoEvents
Buffer$ = Buffer$ &amp
MSComm1.Input
Loop Until InStr(Buffer$, "OK" &amp
vbCRLF)
' 从串行端口读 "OK" 响应。

' 关闭串行端口。
MSComm1.PortOpen = False
End Sub
 
还有这句怎么写呢?
while (inportb(0x2fd) &amp
&amp;0x01)
{
c = inportb(ox2f8);
switch(c)
{
case 0x0d: break;
case 0x0a: if (strlen(s) <= 6)
{
strcpy(s,'');
break;
}
case '/0': break;
default:
{
sprintf(s1,'%c',c);
strcat(s,s1);
break;
}
}
}

//这个 '/0' 怎么搞定啊?
 
/0就是字符串的结束符的意思
 
'/0' 在DELPHI中怎样表示,NULL, OR, NIL
 
急死人啊!
注:这是C++ for win3.1 program.
限用MSCOMM组件,(因为在WIN2k下不能用别的东东!)
long MainWindow::H_position()
{
long position;
int j,
i,
delay,
length,
keycode,
H_exit = 0,
InPut,
slength;

char s[100],
sr[100],
s1[10],
c;
strcpy(sr, "%1PR%");
strcpy(s, "");
do{
InPut=inportb(0x2fd)


}while((InPut &amp
0x0E)&amp;brvbar;&amp;brvbar;(!(InPut &amp
0x20)))
//wait data

slength = strlen(sr);

for(i=0;i<slength;i++){
if(sr != '%'){
outportb(0x2f8,(int)sr)

H_delay();
}
else{
outportb(0x2f8,0x0d);
H_delay();
outportb(0x2f8,0x0A);
H_delay();
}
}

while(H_exit == 0)
{

while(inportb(0x2fd)&amp;0x01)
{
c = inportb(0x2f8);

switch(c)
{
case 0x0D: break;
case 0x0A: if( strlen(s) <= 6)
{
strcpy(s," ");
break;
}
else
{
H_exit = 1;
break;
}
case '/0': break;
default :
{
sprintf(s1, "%c", c);
strcat(s, s1);
break;
}
}
}
}
if((keycode=strlen(s)) >= 8) //只取后8位
{
delay = strlen(s) - 8;
for(j=0
j < 8
j++)
{
s[j] = s[j+delay];
}
for(j=8
j<keycode
j++)
{
s[j] = '/0';
}
}
position=atol(s)

return(position);

}

上面的程序是这样的功能:
向端口发送 1PR 命令, 端口响应并返回数据,
对数据进行分析,只取最后8位.
inportb, ourportb--------win3.1 function read,write a port!

 
多人接受答案了。
 
后退
顶部