一串口通讯程序在WIN98及WINME下工作正常,但WIN2K和XP下不行(20分)

  • 主题发起人 主题发起人 xuming
  • 开始时间 开始时间
X

xuming

Unregistered / Unconfirmed
GUEST, unregistred user!
一串口通讯程序在WIN98及WINME下工作正常,但WIN2K和XP下不行。
调试时,总是发现取回的校验值不对。
怎么办?
 
没人理呀?
 
应当是做了保护的
 
有这么问的吗?!

(我的程序WIN98及WINME下工作正常,但WIN2K和XP下不行,死机了,怎么回事,帮帮我!)

没有这么问的!!

 
to:各位大哥:
问题表述的不清楚。再描述一下吧
1:计算机通过查询式方式和单片机通讯。(计算机发送读命令,单片机返回状态数据)
2:发送的命令格式是:机号+命令+CRC
3:发送机号时,RTS为高电平,发送命令和CRC时,RTS为低电平
4:单片机收到数据时,首先返回55H,然后再返回状态数据。
经过跟踪调试,发现在2000及XP下根本收不到55H,所以,就什么数据都收不到了。
程序是用API与的,在98及ME下,工作很正常。
如果有需要我把代码贴上来。
 
一定是串口打开方式不对,原来我遇见过这样的问题。
也是用API函数写的,在createfile里面的参数不合win2k的脾气[:D]
 
给我加300分,我给你提示。
 
to :mzr
300分没问题,但你要一直协助我搞定这问题,我就给你。:P
 
描述还不够详细。
 
发送代码:
LenOfSbuf:=length(sssbuf); //-----取数据帧长度。
//------------------------------ 准备工作 ----------------------------//
//??? setupcomm(hcom,4096,4096);//---------input buff and output buff is 4096 bytes.
getcommstate(hcom,lpdcb);
lpdcb.BaudRate:=CBR_1200;//----------BautRate is 1200 bps.
lpdcb.StopBits:=OneStopBit;
lpdcb.ByteSize:=8;
lpdcb.Parity:=3; //----------------恒为1,传号校验。
setcommstate(hcom,lpdcb);
/////////-------------------------^^^^^^^^^^^^
ResetEvent(post_event);
PurgeComm(hCom,PURGE_TXCLEAR);//---清发送缓冲
PurgeComm(hCom,PURGE_RXCLEAR);//---清接收缓冲。
EscapeCommFunction(hcom,CLRRTS);//--------改RTS为高电平,发送模式。
sleep(10);
//--------------------------送机号地址----------------------------------//
writefile(hcom,sssbuf[1],1,snum,lpol);//---送机地址。
// waitforsingleobject(POST_EVENT,infinite);
GetOverlappedResult(hcom,lpol^,snum,true);
resetevent(post_event);
if snum<1 then
begin
// form11.myshowmessage('发送错误!');
exit ;
end;
sleep(10);
//------------------------- 送数据 -------------------------------------//
getcommstate(hcom,lpdcb);
lpdcb.BaudRate:=CBR_1200;//----------BautRate is 1200 bps.
lpdcb.StopBits:=OneStopBit;
lpdcb.ByteSize:=8;
lpdcb.Parity:=4; //----------------------恒为0,空号校验。
setcommstate(hcom,lpdcb);
EscapeCommFunction(hcom,CLRRTS);//--------保持RTS为高电平,发送模式。
sleep(10);

for i:=2 to LenOfSbuf do
begin
writefile(hcom,sssbuf,1,snum,lpol);//--发送数据到串口。
// waitforsingleobject(POST_EVENT,infinite);
GetOverlappedResult(hcom,lpol^,snum,true);
resetevent(post_event);
if snum<1 then
begin
// form11.myshowmessage('发送错误!');
exit ;
end;
sleep(10);
end;

///!!! writefile(hcom,sbuf[2],Lenofsbuf-1,snum,lpol);//--发送数据到串口。
//------------------------- 送数据完毕,进行接收返回信息----------------//

while true do
begin
clear:=clearcommerror(hcom,lperrors,@coms);
if clear then
begin
cbNum:=coms.cbOutQue;
if cbnum<1 then break;
end;
end;

EscapeCommFunction(hcom,SETRTS); //------改RTS为低电平,进入接收模式。
// sleep(1);

PurgeComm(hCom,PURGE_TXCLEAR);//---清发送缓冲
PurgeComm(hCom,PURGE_RXCLEAR);//---清接收缓冲。
 
各位富翁有资码啊?能发点上来啊?
 
分太少,问题过于复杂。
代码不全,到底是不能发出去,还是不能接收?
 
你说的现象我碰到过,好象是在2000下不能用重载,留下e_mail我给你发个在2000下运行的程序。你自己分析一下,很久了,具体为什么我忘了。
 
程序是用API
98,2K不一样
 
to:chen_cch,我的E-MAIL是:dgxum@163.net
谢谢大家的关注。
TO SS2000
如果是谁帮我解决这个问题,我出300分。
 
这是接收的程序,大家帮忙看一下:
就是在这里收到到55H的,


//////接收第一个BYTE ,是否 55H
function tfjyjcomm.Receive55h(mno:integer):boolean;
var
flag:boolean;
counttime:Integer;
rnum:cardinal;
bcdmno:byte;
begin
bcdmno:=asc1tobcd1(mno);
rbuffer:='';
counttime:=0;
flag:=True;

while true do
begin
counttime:=counttime+1;
if counttime>6 then ///原来为 10 ;changed on 12.11 ;
begin
flag:=False;
break;
end;
readfile(hcom,ch,1,rnum,lpol);
waitforsingleobject(POST_EVENT,infinite);
GetOverlappedResult(hcom,lpol^,rnum,true);
if rnum<>1 then
begin
flag:=False;
end
else
if ((ch=chr($55)) or (ch=chr(bcdmno))) then
begin
flag:=True;//---------------接收到帧头,已经成功。
rbuffer:=rbuffer+(ch);
head:=ord(ch);
break;
end
else
;
end;
Result:=flag;
end;
 
谢谢 chen_cch,
谢谢你发给我的代码,但我看了一下,好像和我的差不多。
又仔细看了一下,
问题进一步明确,不是发不出数据,也不是收不到数据。只是收到的数据好像不是正确的。
这仪器上有两个灯,一个收到数据时,会亮,一个发送数据时也会亮。
通讯的时候,这两个灯都是一闪一闪的,
但我这是就是无法收到55H这个数据头。
大家可以看看我上面的:
function tfjyjcomm.Receive55h(mno:integer):boolean;
看看有什么问题
 
看来是没人理了,唉~
分太少了?
少了可以加。
谁协助我搞定这问题我再加300分。
我的QQ:19955091
E-MAIL:dgxum@163.net
 
如果别的数据都能接收,只有55h或别的个别数据不能的化,说明在串口设置中,55h是一个标志数据。比如结束符等。串口把这个数据过滤了。你检查一下。仔细看一下dcb。
 
后退
顶部