jiongeyes 发表于 2011-12-8 16:22:50

delphi用spcomm控件做串口通讯,为什么接收数据的的准确率只有50%

我先是上位机发送一个6位数组,然后接收单片机返回一个数据。但上位机接收到的数据只有50%是正确的,就是说要发几次才能正确收到单片机发送的数据。我用Terminal测试通讯 是没有问题的,都收到正确的。不知道是不是SPCOMM控件要设置什么,我总觉得这控件的启动通信时间要比较长会不会这个的影响呢

ele_eye 发表于 2011-12-8 16:37:37

spcomm 是接收超时中断的,所以 一包很长的数据 很有可能会发生两次接收中断(分别接收前后两部分的数据)而不是像MSCOMM那样一个字节一个字节接收,需要你自己做好数据帧格式,以及接收的缓冲处理,不是SPCOMM的错,SPCOMM是一个很优秀的控件,好好使用

jiongeyes 发表于 2011-12-8 17:05:07

回复【1楼】ele_eye
-----------------------------------------------------------------------

接收到的数据位数没有少,比如我单片机发送0xF0 0x44 0x57 0x02 0x01 0x43 0xE1 0x0F
            但是上位机接收到的可能会是0xF0 0x44 0xFD 0x02 0x01 0x43 0xE1 0x0F
总是会有几个位不正确,可能连_发三次才能收到一个是完成正确的数据。请问这样是什么原因

madara 发表于 2011-12-8 17:10:27

用SPCOMM尽量不要将下位机做成收到上位机的数据请求命令才向上位机发数据,而且一次发送的数据量也不要过大,还有,把SPCOMM里的缓冲区开小点,最好跟向上位机发的一个数据包一样的大小,这样不用等超时就有接收数据中断。

ele_eye 发表于 2011-12-8 20:38:22

LS在误认子弟

SPCOMM有这么RZ么?

xjjiang 发表于 2011-12-9 08:25:29

我用SPCOMM做过没有出现这个问题呀,楼主有代码可帮分析一下原因

jackiezeng 发表于 2011-12-9 08:42:01

是不是设置了XON,,,属性里面。

jiongeyes 发表于 2011-12-9 09:06:42

回复【5楼】xjjiang
-----------------------------------------------------------------------

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, SPComm, StdCtrls;

type
TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Comm1: TComm;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
      BufferLength: Word);
    procedure Button1Click(Sender: TObject);
private
    { Private declarations }
public
    { Public declarations }
end;

var
Form1: TForm1;

implementation
var
rbuf,sbuf:array of byte;
viewstring:string;
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
comm1.commname:='COM3';
Comm1.StartComm
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Comm1.StopComm;
end;

procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
i:integer;
begin
move(buffer^,pchar(@rbuf)^,bufferlength);
viewstring:='';
for i:=0 to bufferlength-1 do
viewstring:=viewstring+inttohex(rbuf,2)+' ';
viewstring:='接收'+viewstring;
memo1.lines.add(viewstring);
end;

procedure SendData;            //发送数据
var
i:integer;
commflg:boolean;
begin
viewstring:='' ;
commflg:=true;
for i:=0 to 16 do
begin
if not form1.comm1.writecommdata(@sbuf,1) then
begin
commflg:=false;
break;
end;
//发送时字节间的延时
sleep(2);
viewstring:=viewstring+inttohex(sbuf,2)+' ';
end;
viewstring:='发送'+viewstring+' ';
form1.memo1.lines.add(viewstring);
if not commflg then
messagedlg('发送失败',mterror,,0)
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
sum:byte;
begin
sum:= 0;
sbuf := byte($F0);
sbuf := byte($52);
sbuf := byte($51);
sbuf := byte($01);
sbuf := byte($00);
for i:=1 to 4 do
    sum:=sum+sbuf;
inttohex(sum,2);
sbuf := sum;
sbuf := byte($0F);
SendData;
end;

end.

jiongeyes 发表于 2011-12-9 09:42:51

我可能找到原因了,因为我单片机是接收到了就立刻返回数据,我现在加多个延时200MS接收之后延时再发送,目前是一切正常。先谢谢各位的指导

yukaigogogo 发表于 2014-4-28 15:35:13

jiongeyes 发表于 2011-12-9 09:06
回复【5楼】xjjiang
-----------------------------------------------------------------------



终于找到一个对的接收程序
页: [1]
查看完整版本: delphi用spcomm控件做串口通讯,为什么接收数据的的准确率只有50%