您的位置:程序门 -> delphi -> 网络通信/分布式开发



dephi与单片机通讯


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


dephi与单片机通讯
发表于:2007-12-31 22:26:51 楼主
procedure   tczform.commreceivedata(sender:   tobject;   buffer:   pointer;
    bufferlength:   word);
var
        p:   pchar;
      str,ss:string;
      i:integer;
begin

            p   :=   buffer;
            str   :=   p;
            str:=trim(str);

            with   dmcz.tbcssj   do
            begin
                first;
                if   fieldbyname('ybrx').asstring='jlcw'   then
                begin
                    i:=length(str);
                    ss:=copy(str,0,i-2);
                    memo1.lines.text:=ss;
                end;
            end;

end;                          
主要用来接收称重数据,仪表发送方式为连续发送,接收有时会错乱,希有好心人帮助解决,给一个源码参考,急       发送格式为1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   1000.2kg   ...........
发表于:2008-01-01 08:04:561楼 得分:0
你的格式是8个字符+1个空格吧
var
      b:string;
procedure       tczform.commreceivedata(sender:       tobject;       buffer:       pointer;  
        bufferlength:       word);  
var  
                p:       pchar;
              s:string;  
            i,j:integer;  
begin  
                        p       :=       buffer;  
                      for   i:=0   to   bufferlength-1   do
                        b:=b+p[i];
                        j:=pos(#32,b);
                      if   j <=0   then   exit;
                        s:=copy(b,1,j-1);
                        b:=copy(b,j+1,1000);
                        with       dmcz.tbcssj       do  
                        begin  
                                first;  
                                if       fieldbyname('ybrx').asstring='jlcw'       then   //这个判断干什么的?
                                begin  
                                        memo1.lines.lines.add(s);  
                                end;  
                        end;  
end;          
发表于:2008-01-01 08:56:412楼 得分:0
不一定,最长10位最短5位   -3000.0kg   0.0kg   也有,最后都有一个kg,前面有时有负号-100.kg,那个是我预留的,因为仪表不同,格式也不同,谢了,我试试看一下,波特率有1200,2400,4800,9600,不过好像都没起到作用,
发表于:2008-01-01 09:00:463楼 得分:0
我只要取出1000.0到0.0   或   -1000.0到-0.0就可以
发表于:2008-01-01 09:02:004楼 得分:0
能不能设置缓冲区大小,
发表于:2008-01-01 09:09:185楼 得分:0
首先   你要保证能收到数据

我那个代码,只要用单个空格隔开得数据都能正确解出的
你自己把后面单位符号去掉就可以了
发表于:2008-01-01 09:35:246楼 得分:0
我每次只要取出前面几位,如50.0   后面的没用,仪表数字会不断更新,只要仪表数字有变化,仪表显示为50.0   接收过程取出最新的值如50.0   仪表显示为100.0   接收过程要取出最新的值100.0   仪表数字时时刻都可能变化,能不能我取出一次,就把缓冲清空,下次再取出,再清空,这样就好控制了
发表于:2008-01-01 09:37:127楼 得分:0
接收数据早就可以了,只是后面控制比较麻烦
发表于:2008-01-01 09:38:248楼 得分:0
非常感谢,我如弄好,一定给你个回复

发表于:2008-01-01 09:43:359楼 得分:0
你要明白
并不是你发一个包   接收方就能受到一个完整包
比如
我发   10.000kg
你有可能触发   receive事件8次   ,每次只收到一个字符
也有可能一次收到几个包
发表于:2008-01-01 09:57:3210楼 得分:0
接收数据是独立线程中的,要处理的最好另外做一个接收缓冲再有一个处理队列
发表于:2008-01-01 19:24:1511楼 得分:0
我把inx_xonxoffflow设false
      outx_xonxoffflow设false
      txcontinueonxoff设false
procedure   tczform.commreceivedata(sender:   tobject;   buffer:   pointer;
    bufferlength:   word);

    var
        p:   pchar;
      str:string;
begin
            p   :=   buffer;
            str   :=   p;
            str:=copy(str,0,bufferlength-2);
            with   dmcz.tbcssj   do
            begin
                first;
                if   fieldbyname('ybrx').asstring='jlcw'   then     //预留
                begin
                        str:=copy(str,0,length(str)-2);
                        memo1.lines.text:=str;
                end;
          end;

end;
以上源码已在两台机子上连续测试两小时通过,接收正常,单片机为atmel   89s52   格式为1位起始位,1停止位,8位数据位,1标志位,谢谢各位,供大家参考
发表于:2008-01-01 20:33:0312楼 得分:0
单片机送上来的是16进制的,你直接解当然出现乱码了,你要将16进制转成10进制
发表于:2008-01-02 09:59:4413楼 得分:0
up


快速检索

最新资讯
热门点击