SPComm的反应为什么不灵敏? (80分)

  • 主题发起人 主题发起人 yfdciom
  • 开始时间 开始时间
Y

yfdciom

Unregistered / Unconfirmed
GUEST, unregistred user!
最近做了个项目,其中和电子称进行串口通讯,接收电子称的数据。串行通讯的控件用的是spcomm,可问题是:有时候车停在称上,电子称的显示屏能够正常显示称重数据,点击“称重”按钮,电子称的数据不能传到计算机上;(这种情况称10次能出现5次),为什么?
通讯的源代码很简单:
strNum,strPot,strRecv:string;
base_v,result_v:Extended;

procedure Tshowweight_F.commRecReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word);
begin
strRecv:='';
strnum:='';
strPot:='';
base_v:=0;
result_v:=0;
setLength(strRecv,BufferLength);
Move(Buffer^,pchar(strRecv)^,BufferLength);

//电子称传输的字符串为11位,不停的传。第一位和最后一位是+号,2-6位位数据。第7位为标志位。
if (pos('+',strRecv)<>0 ) and (copy(strrecv,pos('+',strRecv)+7,1)<>'') then
begin
strnum:=copy(strRecv,pos('+',strRecv)+1,6);
strPot:=copy(strRecv,pos('+',strRecv)+6,1);
base_v:=math.Power(10,strtofloatdef(strPot,0));
result_v:=strtofloatdef(strNum,0)/base_v/1000;
labweight.Caption:=floattostr(result_v); //显示称重数据
end;
end;
分数肯定可以再加。


 
分数不够我再另加。
 
我用SPCOMM做电子称的程序已经有3套了,包括公正系统、粮油系统等,仪表支持上海耀华、济南金钟、托利多等,你的是什么仪表,波特率是多少,建议把波特率调到4800以上。
 
我的波特率是1200。仪表是什么我还真不知道。
 
另外,耀华的低档仪表的数据传输不是很好,托利多和金钟的倒是很稳定。
你在哪里,可以联系,相互交流。
 
fakirc,我在沈阳。我的qq:34917820。
 
1200太低了,其它的肯定可以,不过那要进入仪表的参数设置里进行修改,具体的每种仪表的设置方法不一样,好好看看说明书,如果你使用的仪表是经质量技术监督局检定过的注意不要把仪表的有关称重参数给改了,否则仪表要重新标定。
 
SPCOMM存在一个BUG(在WIN9X下,2K下没问题),当接收的数据超过一定的数量后会出现数据丢失问题,我通过研究发现在commRecReceiveData事件最后加上
PurgeComm(Comm1.Handle,PURGE_RXCLEAR);该过程用来清除缓冲区的数据。
我测试过连接PLC没问题,试试吧!
 

这倒是个新发现,不过我用SPCOMM写的东东好像在WIN98下运行了半年没有出现类似的问题,不过后来对程序升级,使用了SQL SERVER就使用WIN2000了,呵呵。
 
我用到OS是win 2K pro
 
  那就与缓冲区没关系了。不过我的程序是在Delphi 3.0下编译的,后来一点问题没有,我看到网上其他人也遇到这种情况。
 
偶的qq:6875880
 
问题依旧!
大家帮忙啊!
 
  你首先得详细的跟踪一下strRecv的数据,如显示出来看究竟是什么情况,数据是否是完整的等情形(我遇到的就是那种周期性的变化)
 
你的操作流程能说说吗??是让串口一直开着呢还是点击某个按钮的时候才开串口??
ReadInterValTimeOut属性设置的是多少??流控制打开没有??默认屏蔽的字符(默认的是#17和#19)可不可能出现在串口数据中??这些都是问题,如果有一个没有解决好就会出现串口不稳定。
还有:波特率只影响接受和发送数据的时间,ReadInterValTimeOut可以根据波特率计算出来,所以波特率越低,ReadInterValTimeOut就越长。
ReadInterValTimeOut是最关键的。
 
联系我:QQ46760485,注明“串口”
 
后退
顶部