串口与硬件的数据交换 ( 积分: 100 )

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

liuguilg

Unregistered / Unconfirmed
GUEST, unregistred user!
协议:
以字符串(AscⅡ码或汉字)的形式向串口发送数据。串口设置1或2,
波特率9600 1位起始位 8位数据位 1位寄偶校验位 1位停止位 。
发地址时,寄偶校验位置1,如VB设置 “2400,M,8,1”
地址3个字节,既ASCII码字符(例如“~&A”),等待回送字符“A”,回送正确后再发数据,寄偶校验位清0,如VB设置 “2400,S,8,1”
(多机通讯:地址不同,如”B”或”C” ”D” ”E”......)
我用的是SPComm
我对
:串口设置1或2,波特率9600 1位起始位 8位数据位 1位寄偶校验位 1位停止位 。
我的理解是
Comm1.CommName :='COM1' ;
Comm1.BaudRate := 9600 ;
Comm1.ParityCheck := true ; //有奇偶校验
Comm1.Parity := Tparity(markparity) ; //奇偶校验位1位
Comm1.ByteSize := TByteSize(8) ; //数据位 8位
Comm1.StopBits := TStopBits(1) ; //停止位 1位
Comm1.StartComm ;
不知道正确不?恳请各位老师指正!

后面对硬件的地址处理就不会了;

还有就是发送数据
(10字条屏)
如发送1幕信息(发送汉字字符串或ASCII码字符串):

发送字符:*6
发送字符:
01234567890123456789 1 0 0 1 ^
条屏长20个字节 移入 停留 停留时间 移出 本幕结束符
返回字符: ^ 等待返回
我的理解是:
str:='012345678901234567891001^^
comm1.writecommdata(@str,Length(str));
恳请各位老师不吝赐教,指点
 
我不知道你是SPCOMM是哪个版本的,如果是2.5版,那么
你对 :串口设置1或2,波特率9600 1位起始位 8位数据位 1位寄偶校验位 1位停止位的理解是:
Comm1.CommName :='COM1' ;
Comm1.BaudRate := 9600 ;
Comm1.ParityCheck := true ; //有奇偶校验
Comm1.Parity := Tparity(markparity) ; //奇偶校验位1位
Comm1.ByteSize := TByteSize(8) ; //数据位 8位
Comm1.StopBits := TStopBits(1) ; //停止位 1位
Comm1.StartComm ;

你的理解有错误!SPCOMM 2.5版正确应该是
Comm1.CommName :='COM1' ;
Comm1.BaudRate := 9600 ;
Comm1.ParityCheck := true ;
Comm1.Parity := Mark ;
Comm1.ByteSize := _8 ;
Comm1.StopBits := _1 ;
Comm1.StartComm ;

另外:
你的 comm1.writecommdata(@str,Length(str));
最好是:comm1.writecommdata(Pchar(str),Length(str));
 
非常感谢,
能解释一下那个地址的处理方式吗
 
你问的“地址处理”我还不明白你的意思。我对你的问题的理解是这样,你看对不对?
你是不是说:原来你的软件将串口设置为“2400,M,8,1”,等待另一台机器或下位机发送“~&A”或“~&B”或“~&C”或“~&D”后,你的软件就将串口设置为“2400,S,8,1”
然后你就发送'012345678901234567891001^'。是不是这样?

SPCOMM接收的字符串不一定将接收的“~&A”在一次OnRecieveData就全部给你,也许先给你一个“~”,下次给你“&A”,或者一次就给你“~&A~&B”,你需要将每次接收到的字符串全部先拼起来,然后处理,处理后的删除。
例如:
var RecvStr:string; //此变量不要放在OnRecieveData的过程里作为局部变量,要作为全局变量。
procedure TCommForm.spcomReceiveData(Sender: TObject; Buffer: Pointer; BufferLength: Word);
var Str:string;
i : integer;
begin
SetString(Str,Pchar(Buffer),BufferLength);
RecvStr := RecvStr + Str; //将每次接收到的字符串全部先拼起来
While true do
begin
i:=pos('~&',RecvStr);
if (i > 0) and (Length(RecvStr) > i+2)then
begin
case RecvStr[i+2] of
'A':
begin
//在此写处理地址A的代码
end;
'B':
begin
//在此写处理地址B的代码
end;
'C':
begin
//在此写处理地址C的代码
end;
'D':
begin
//在此写处理地址D的代码
end;
end;
RecvStr := Copy(RecvStr, i+3, maxint); //丢掉已经处理完毕的字符串
end else
break; //退出while循环
end;
end;
因为我对你的问题理解不对,也许回答的不是你要的东西。
 
非常感谢,我试一下
 
后退
顶部