搜索
bottom↓
回复: 25

Delphi MSCOMM 接受会掉数据?? 求助!!!【恢复】

[复制链接]

出0入0汤圆

发表于 2008-9-16 20:11:19 | 显示全部楼层 |阅读模式
procedure TForm2.FormCreate(Sender: TObject);

begin

 if MSComm1.PortOpen then MSComm1.PortOpen := false;//关闭端口

 Mscomm1.CommPort:=strtoint(ComboBox1.Text);

 MSComm1.InBufferSize := 1024;//设置接收缓冲区为1024个字节

 MSComm1.OutBufferSize := 256;//设置发送缓冲区为256个字节

 MSComm1.Settings := '9600,n,8,1';//9600波特率,无校验,8位数据位,1位停止位

 MSComm1.InputLen := 0;//读取缓冲区全部内容(2个字节)

 MSComm1.InBufferCount := 0;// 清除接收缓冲区

 MSComm1.OutBufferCount:=0;// 清除发送缓冲区

 MSComm1.RThreshold := 1;//设置接收1个字节产生OnComm 事件

 //  MSComm1.InputMode := comInputModeText;//文本方式

 MSComm1.InputMode := comInputModeBinary;//二进制方式

 //Mscomm1.PortOpen:=true;

end;











procedure Ttest.MSComm1Comm(Sender: TObject);

var

  xtemp:olevariant;

  sbuff:array of byte;

  i,j:integer;

  xRecData:string;

begin

  i:=mscomm1.InBufferCount;

 if i=0 then

exit;

 if mscomm1.CommEvent=2 then

  begin

   xtemp:=mscomm1.Input;

   MSComm1.InBufferCount := 0;// 清除接收缓冲区

   setlength(sbuff,i);

   sbuff:=xtemp;

  for j:=0 to i-1 do



  begin



  

  xRecData:=inttohex(sbuff[j],2);



  memo1.Lines.Add(xrecdata);



  end;

  end;

end;







单片机程序:

  u8 i,j;



  for(i=0;i<11;i++)

   { 

       for(j=0;j<9;j++)

    { 

       Send_data( j);

     //delay_nms(5);



    } 





  }





单片机每 5S调用一次上面的循环 连续发120个字节 会掉数据(用串口调试助手就不会漏),   用delay_nms(5); 就不会掉数据    单片机下我不想用delay_nms(5);    有什么方法解决吗?  谢谢! 

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入22汤圆

发表于 2008-9-16 20:12:52 | 显示全部楼层
mscomm控件,你程序处理不好的话,都会丢数据的。

出0入22汤圆

发表于 2008-9-16 20:49:10 | 显示全部楼层
7楼,mscomm的缓冲区默认是1k,对数据来说是问题不大的,

8楼,API同样有这个问题,我碰到过

这种问题在主板集成的串口中出现不多,在usb转的串口里面出现比较多。



处理原理:当串口中断的时候,启动GetComData函数,在函数里面进行查询接收,超时后退出。超时时间请根据需要自己把握



处理办法:使用如下相关办法。注意:代码是VB代码,可能不如何规范,仅供参考



Private Function GetComData() As String

    On Error GoTo DealError

    Dim nTemp As Integer

    Dim strTemp As String

    Dim strRet As String

    

start0:

    strTemp = COM.Input

    strRet = strRet & strTemp

    If strTemp = "" And nTemp>= 3 Then

        nTemp = nTemp + 1

        Sleep (20)

        GoTo start0

    Else

        GoTo End0

    End If

End0:

    GetComData = strTemp

    Exit Function

DealError:

    WriteErrLog ("frmMain.GetComData " & Err.Description)

    Exit Function

End Function

出0入0汤圆

发表于 2008-9-16 20:33:32 | 显示全部楼层
从古老的文件夹里抠了段出来

{*********************************



  串口中断!! 按照

  $FE xxx xxx xxx xxx $EF

  的格式接收数据



***********************************}



procedure TForm1.MSComm1Comm(Sender: TObject);

var

    SerialInput: Variant;

    i: Integer;

    InputLen: Integer;



begin

    if MSComm1.CommEvent = 2 then

    begin



        InputLen := MSComm1.InBufferCount; //读入字节数计数

        SerialInput := MSComm1.Input; //串口读入数据

        for i := 0 to InputLen - 1 do

        begin

            if DataPtr = 0 then //如果还没有收到起始位

            begin

                if SerialInput = $FE then //判断是否是起始位

                begin

                    Data[DataPtr] := SerialInput;

                        //把接收到的数据放入接收缓冲区

                    DataPtr := DataPtr + 1; //指针++

                end

                else

                begin

                    DataPtr := 0; //如果不是起始位,则ptr=0,继续等待起始位

                end;

            end

            else if DataPtr < 4 then //判断是否接收够6位

            begin

                Data[DataPtr] := SerialInput; //不够,继续把数据放入缓冲区

                DataPtr := DataPtr + 1;

            end

            else if DataPtr = 4 then //如果收到6个数,

            begin

                if SerialInput = $EF then //判断是否是结束位

                begin

                    Data[DataPtr] := SerialInput;

                    //是,则把结束位送入缓冲,执行后续操作



                    RecvCnt := RecvCnt + 1; //收到包计数++

                    saveToCar();

                    dispCar();

                end

                else

                begin

                    DataPtr := 0; //不是结束位,则ptr=0,继续等待起始位

                end;

            end

            else

            begin

                DataPtr := 0; //缓冲区已满,清除缓冲继续等待

            end;

        end;

    end;

end;

出0入22汤圆

发表于 2008-9-16 20:23:24 | 显示全部楼层
我不会delphi,我只会VB。不过处理原理都是一样的。

出0入0汤圆

发表于 2008-9-16 20:23:04 | 显示全部楼层
不应该啊。 你的波特率那么低,数据量也才120个。。。

出0入0汤圆

 楼主| 发表于 2008-9-16 20:16:31 | 显示全部楼层
zxq6 小马哈  能提供个上位机处理程序吗   非常感谢!

 

出0入0汤圆

发表于 2008-9-16 22:16:21 | 显示全部楼层
你试试这个行不行,很久以前编用spcomm的,只有接收测试了,发送没测,如果不好使,我也没办法了



点击此处下载 ourdev_419684.rar(文件大小:180K) (原文件名:test1.rar) 

出0入0汤圆

发表于 2008-9-16 22:06:12 | 显示全部楼层
我只有接收的

后来都用api做了

出0入0汤圆

发表于 2008-9-17 08:57:16 | 显示全部楼层
源码

注意一下,我的数据显示方式也不是很好,是以行为单位的,所以有些闪动

你可以在优化下

点击此处下载 ourdev_419924.rar(文件大小:199K) (原文件名:porject-10.rar)

出0入0汤圆

 楼主| 发表于 2008-9-17 08:36:28 | 显示全部楼层
 ilymy  我测试可以  谢谢!  遗憾的是没源码!!!!  能提供源码吗 ?

本贴被 lin28 编辑过,最后修改时间:2008-09-17,08:37:10.

出0入0汤圆

 楼主| 发表于 2008-9-17 11:09:50 | 显示全部楼层
再次感谢ilymy  现在不漏数据了 我决定用SPCOMM了  

出0入0汤圆

发表于 2008-9-16 20:56:12 | 显示全部楼层
SPCOMM你处理好显示,应该不会

出0入0汤圆

 楼主| 发表于 2008-9-16 20:55:18 | 显示全部楼层
  可惜 不会用API  !  用SPCOMM会不会也漏数据呀?

出0入0汤圆

发表于 2008-9-16 20:48:09 | 显示全部楼层
MSComm1.InBufferCount := 0;// 清除接收缓冲区 



这句看不懂,注释掉试试



另外你用的数据显示方式太慢,相当于每一个字符都要刷一下memo,太慢了,优化一下吧

出0入0汤圆

发表于 2008-9-16 20:40:23 | 显示全部楼层
不行的话,用API重写下看看

理论上不存在任何问题啊。。。

出0入0汤圆

发表于 2008-9-16 20:39:54 | 显示全部楼层
发送数据不能连续大量的发,mscomm控件的缓冲区是有一定大小的

出0入0汤圆

 楼主| 发表于 2008-9-16 20:35:22 | 显示全部楼层
应该跟波特率关系不大,  我用19200 4800   也丢数据,    加入delay_nms(5);  就没问题  ,  好像PC机处理不过来! 我是用USB转串口的,  可是我用串口调试助手 不用加入delay_nms(5);   也正常啊   所以只能怀疑PC的程序了  难道MSCOMM真的想传说中的会漏数据吗?  郁闷。。。。

出0入0汤圆

发表于 2008-9-17 12:48:58 | 显示全部楼层
不喜欢用控件,最好用api

出0入0汤圆

发表于 2008-9-17 12:02:40 | 显示全部楼层
spcomm 默认是开软件流控的 设置好了一般都不会有什么问题

出0入0汤圆

发表于 2008-9-17 12:01:32 | 显示全部楼层
我都一直用mscomm,没有出现丢数据情况。

出0入0汤圆

 楼主| 发表于 2008-9-17 09:22:25 | 显示全部楼层
好  非常感谢各位   我自己努力试下

出0入0汤圆

 楼主| 发表于 2008-9-16 21:33:12 | 显示全部楼层
ilymy 

 能给个SPCOMM  向单片机能发0Xad(大于128)的 程序吗  谢谢

出0入0汤圆

发表于 2010-2-19 10:09:10 | 显示全部楼层
串口接收事件实际上是一个定时器,所以你要设置好发送超时和接收超时时间,还有就是数据读取回来后处理程序要适当

出0入0汤圆

发表于 2010-2-22 18:14:22 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-17 22:01:04 | 显示全部楼层
delephi怎么调用VB谢谢程序
对VB的文本框  text   combo   command
进行调用,谢谢各位啊
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 23:54

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表