串口通信的问题(50分)

  • 主题发起人 主题发起人 guan1573
  • 开始时间 开始时间
G

guan1573

Unregistered / Unconfirmed
GUEST, unregistred user!
我在计算机与单片机之间通信,每次单片机发7个字节,可计算机每次都接受10或11个字节
,多出3,4 个字节,我不知是怎回事?,我用spcomm控件,捕捉的错误信息为sce_frame;
我用mscomm控件,捕捉的错误信息为1004,我现在很急,哪位朋友能帮帮我!!!
 
看看双方定义的数据位长度和停止位长度是否一致。
 
如果用的是Mscomm可能与接收缓冲区事件响应大小设置有关你将其设置为7或1试试呢
 
看一下通讯协议的波特率是否一致。
最好是自己用API函数编写
 
学习一下
 
数据位,停止位,校验位,应该没有错误,我换了别的数据位,停止位,校验位后会产生
更多的错误,,
xiaoywh:你说的是那一个属性,能否说清楚一点?
谢谢各位!!!!!!!!!!!!!!!
 
数据位,停止位,校验位,可能有错误
若没有错误,则有可能单片机向上发的数据中有控制信息,需要去掉
 
wrf:

你说的控制信息是指什么?如果控制信息是指在发送的数据上加一些额外的数据来代表
一定的信息,那我也不应该扑捉到错误信息呀!
 
用spcomm的话,可能是readintervaltimeout
属性值设的太大了。改小点试试。
 
给你个例子看看是否有帮助!
部分源代码如下:

变量说明
var
CommForm: TCommForm;
ss :string;
savef,readf :file of char;
i,j :longint;

初始化
procedure TCommForm.FormCreate(Sender: TObject);
begin
mscomm.commport:=1;
mscomm.settings:='9600,n,8,1';
mscomm.inputlen:=1;
mscomm.inbuffercount:=0;
mscomm.portopen:=true;
ss:='';
i:=0;
j:=0;
assignfile(savef,'save1');
rewrite(savef);
assignfile(readf,'read1');
reset(readf);
end;

设置确定
procedure TCommForm.btnConfirmClick(Sender: TObject);
begin
if mscomm.portopen then
mscomm.portopen:=false;
mscomm.commport:=strtoint(edtCommport.text);
mscomm.settings:=edtCommsetting.Text;
end;

传输事件
procedure TCommForm.MSCommComm(Sender: TObject);
var
filenrc :char;
buffer :variant;
s1:string;
c :char;
begin
case mscomm.commEvent of
comEvSend:
begin
while not(eof(readf)) do
begin
read(readf,filenrc);
mscomm.output:=filenrc;
j:=j+1;
lblDisplay.caption:=inttostr(j);
if mscomm.outbuffercount>=2 then
break;
end;
end;
comEvReceive:
begin
buffer:=mscomm.Input;
s1:=buffer;
c:=s1[1];
ss:=ss+c;
i:=i+1;
lblDisplay.caption:=c+inttostr(i);
write(savef,c);
if (c=chr(10))or(c=chr(13)) then
begin
lblDisplay.caption:='cr'+inttostr(i);
memDisplay.lines.add(ss);
ss:='';
end;
end;
end;
end;

 
肯定是协议的问题
 
谢谢各位!!!!!
我的程序应该没有问题,我也认为是通信协议的问题,
主要是我现在只知道一部分通信协议,
别的我没法知道,因为此单片机历史很久 了,我只知道它会主动(不需要我发请求)的不断的向我发7个字节的
信息,我只需分析数据便可,
 
1,软件办法:就象你已经做过的,变换波特率、帧格式来监听
2,硬件办法:用示波器,最好是带录波的,观察数据帧波形来分析
 
多人接受答案了。
 
后退
顶部