还是不明白,用spcomm两台PC通信,发送和接收就是不一样!!!(10分)

  • 主题发起人 主题发起人 lcl_003
  • 开始时间 开始时间
L

lcl_003

Unregistered / Unconfirmed
GUEST, unregistred user!
到现在我也死活不明白串口通信到底是不是16进制格式的,我的发送和接收代码在下面。
我想实现的是在发送端从0开始逐一增加就是0,1,2,3,4,.....8,9,10,11....
这样发送。可是发送端显示的数字是:
发送83 01 00 00 00 00
发送83 02 00 00 00 00
发送83 03 00 00 00 00
发送83 04 00 00 00 00

接收端的数字是:
接收131 1 0 0 0 0
接收131 2 0 0 0 0
接收131 3 0 0 0 0
接收131 4 0 0 0 0
可是发送端一发到8接收端就变成了16,以后就有时候一样有时候不一样了。

为什么接收和发送的不一样啊。有几个疑问:
1:比如我发送的是83 01 00 00 00 00
而接收的却是131 1 0 0 0 0 为啥少了一个“0”?
2:难道我只能发16进制的数?
3:象我现在的程序接收和发送不一样,问题在那里?


代码如下:

发送端:
var
Form1: TForm1;
SendBuffer,ReceiveBuffer:array[0..5] of byte;
sendbufferlength:integer;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);

begin
try
Comm1.startcomm;//创建窗体时,将comm1控件打开。
SendBuffer[0]:=$83;
SendBuffer[1]:=$0;
SendBuffer[2]:=$0;
SendBuffer[3]:=$0;
SendBuffer[4]:=$0;
SendBuffer[5]:=$0;
SendBufferLength:=6;
Sendtimer.Enabled :=true;
Except
on E:Exception do
showmessage(E.Message );
//comm1.StopComm ;
end;
end;






procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
comm1.StopComm;//关闭窗体时,将comm1控件关闭。
end;

procedure TForm1.sendtimerTimer(Sender: TObject);
var
viewstring:string;
i,j:integer;
a:array[0..5] of byte;
begin
sendbuffer[1]:=sendbuffer[1]+1;
i:=sendbuffer[1] mod 16;
if i=9 then
sendbuffer[1]:=sendbuffer[1]+7;
if sendbuffer[1]=$A0 then
begin
sendbuffer[1]:=0;
sendbuffer[2]:=sendbuffer[2]+1;
i:=sendbuffer[2] mod 16;
if i=9 then
sendbuffer[2]:=sendbuffer[2]+7;

end;
comm1.WritecommData(pchar(@sendbuffer),SendBufferLength);
for i:=0 to SendBufferLength-1 do
viewstring:=viewstring+inttohex(sendbuffer,2)+' ';
viewstring:='发送'+viewstring;
Memo1.Lines.Add(viewstring);
memo1.Lines.Add ('');
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
sendtimer.Enabled:=false;
end;

end.



接收端:

procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);

var
viewstring:string;
i:integer;
ReceiveBuffer:array[0..5] of byte;
begin
Move(Buffer^,ReceiveBuffer, BufferLength);
for i:=0 to bufferlength-1 do
viewstring:=viewstring+inttostr(ReceiveBuffer)+' ';
viewstring:='接收'+viewstring;
Memo1.Lines.Add(viewstring);
Memo1.Lines.Add('');
Memo1.Invalidate;


end;

procedure TForm1.FormCreate(Sender: TObject);
begin
comm1.StartComm;
end;

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

end.



 
没看你的程序,不过问一下,你用的效验方式,停止位,数据位一致吗?
 
都一样啊
 
串口通信不是16进制的,是按照比特位来的,发送的进制是接受双方共同约定的。

建议你现不要做大量数据的测试,先发一些熟悉的字符进行测试。如果测试通过
再进行下一步的大量数据测试。因为数据的发送速度(不是波特率)过快也会产
生误码。一般来说在数据发送端要加一个延时函数sleep(2)
 
to shadowno:
你说的发送的进制是双方约定的,那我怎么约定呢?比如我想发送和接收10进制的数字?
 
来QQ,我给你解释:584740
 
你程序真是麻烦
我没仔细看,

你就发'我爱中国'这样的字符串
你看它收什么,
它都可以发汉字的,没有问题,你再看看你的其它部分,
SPCOMM好用的很
 
接受答案了.
 

Similar threads

I
回复
0
查看
650
import
I
I
回复
0
查看
620
import
I
I
回复
0
查看
804
import
I
后退
顶部