spcomm串口通讯(50分)

  • 主题发起人 主题发起人 孤星2005
  • 开始时间 开始时间

孤星2005

Unregistered / Unconfirmed
GUEST, unregistred user!
我用spcomm通过串口跟单片机通讯,为什么我能收到单片机传给我的数据而单片机收不到我传给它的数据呢
 
各位大哥帮帮忙呀
 
是不是 断了一根线
还有 检查 RtsControl XonChar
 
你是怎么知道单片机收不到的?你是怎么传数据给单片机的?你们之间有没有协议?是不是你把数据传过去了但是协议不对所以对方才不接收?
 
不是呀,我能收到单片机发给我的数据,是这样子的,我想把中文名字传给单片机以便单片机能够打印出中文商户名
 
XonChar起什么作用啊,我用超级终端就可以传给单片机,不知我的程序和超级终端有哪些设置有区别
 
好象已经送到串口buffer中了,我用超级终端发送数据把我以前用我的程序发的数据都在单片机上显示出来了,不知什么原因
 
为什么我用SPCOMM第一遍发送总不成功,从第二遍开始才成功
 
大家帮帮忙呀,是不是哪个设置没有设好呀
 
一般SPCOMM打开串口都需要时间,不要刚刚Comm1.Start马上就写数据,最好Sleep一会
 
应用程序启动时StartComm,关闭时StopComm。这样就没事了。
 
已经在FORMCREATE和FORMCOLSE中这样做了呀
 
先做个延时,再传送数据,避开初始化时间
 
:孤星2005, 你好,能不能把你的那段代码公布一下啊,我现在也正在用,不是很清楚
 
延时?如何做
procedure TForm1.ConvertToPos;
var i,ptr:integer;
buf,next_buf:array [0..255] of byte;
flag:boolean;
lrc : byte;
begin
ptr := 0;
flag := false;
lrc :=0;
for i := 0 to 255 do begin
buf := ord(#0);
next_buf := ord(#0);
end;
if High(DataBuf) > 7 then
flag := True;
for i:= low(DataBuf) to High(DataBuf) do
begin
if high(DataBuf) = 15 then
begin
if i <= 7 then begin
move(DataBuf[0], buf[ptr], 8);
move(DataBuf[8], buf[128+ptr], 8);
end
else begin
move(DataBuf[0], next_buf[ptr], 8);
move(DataBuf[8], next_buf[128+ptr], 8);
end;
inc(ptr, 8);
end
else if high(DataBuf) = 31 then
begin
if i <= 7 then begin
move(DataBuf[0], buf[ptr], 8);
move(DataBuf[16], buf[ptr+8], 8);
move(DataBuf[8], buf[128+ptr], 8);
move(DataBuf[24], buf[128+8+ptr], 8);
end
else
begin
move(DataBuf[0], next_buf[ptr], 8);
move(DataBuf[16], next_buf[ptr+8], 8);
move(DataBuf[8], next_buf[128+ptr], 8);
move(DataBuf[24], next_buf[128+8+ptr], 8);
end;
inc(ptr, 16);
end;
end;//end for
txbuf[0] := $02; //ENAC_STX
txbuf[1] := $05;
txbuf[2] := $14;
txbuf[3] := $ff;
move(buf[0], txbuf[4], 256);
if flag then
txbuf[260] := $ff
else txbuf[260] := $00;
move(next_buf[0], txbuf[261], 256);
txbuf[517] := $03; //ENAC_ETX
for i := 1 to 517 do
lrc := lrc xor txbuf;
txbuf[518] := lrc;
comm1.WriteCommData(@txbuf,519);
end;
 
另外:
function TComm2.OutputByte(const ByteData: array of Byte ): Boolean;
var
lrc: LongWord;
i: Integer;
begin
if hComm=0 then
begin
MessageDlg('COM Port is not opened yet!', mtError, [mbOK], 0);
Result := False;
exit;
end;
// 送出数据
for i:=Low(ByteData) to High(ByteData) do
WriteFile(hComm,ByteData,1,lrc, nil);
Result := True;
end;
可不可以一次把所有数据都送完而不是一个字节一个字节的送,如果可以该怎么写,谢谢了
 
没有人知道吗
 
在Start后把DTRControl置为dtrEnable试一下,至于延时我没遇到过哦,
 
如果你每次传送的数据不长,可按字符串传送
var
str:pchar;
n:word;
writecommdata(str,n)
 
我现在也遇到了类似的问题,关注!
 
后退
顶部