有做过CRC校验或串口通信的兄弟吗?现有个奇怪的问题,望指点一二!!! ( 积分: 10 )

  • 主题发起人 主题发起人 borbery
  • 开始时间 开始时间
B

borbery

Unregistered / Unconfirmed
GUEST, unregistred user!
我写了一个函数CRC ,用来算CRC8
软件单步执行可以看到结果是和理想符合的
但是执行以下语句

MSCOMM1.OUTPUT:=CRC(SBUF,23);

实际从串口接收的数据要么是正确的数据,要么是0,但算出来的绝对不是0
其他的数据发送接收没有问题
为什么要么不出错,要么就是0呢??
究竟什么回事啊????
 
我写了一个函数CRC ,用来算CRC8
软件单步执行可以看到结果是和理想符合的
但是执行以下语句

MSCOMM1.OUTPUT:=CRC(SBUF,23);

实际从串口接收的数据要么是正确的数据,要么是0,但算出来的绝对不是0
其他的数据发送接收没有问题
为什么要么不出错,要么就是0呢??
究竟什么回事啊????
 
没有人知道是什么回事吗?
 
不清楚,奇怪的问题,,

你在哪看你接收到的数的?是不是那里的问题呢?
 
我是从本机COM2发送,用串口精灵从COM1接收看数据
或者是弹片机接收,反正其他位是完全没有问题,就是CRC的位有时会变成0

implementation

uses login,
datamodule;

{$R *.dfm}

function CRC(buff1: string; len: Integer): byte;
var
j: Integer;
i: byte;
crcc:byte;
begin
crcc:=0;
for j:= 1 to len do
begin
i:=$80;
while i<>0 do
begin

if (crcc and $80) <> 0 then
crcc := (crcc *2) xor $31
else
crcc := crcc *2;

if (integer(buff1[j]) and i ) <> 0 then
crcc:=crcc xor $31;
i:=i shr 1;

end;

end;
Result:= crcc;
end;
这个函数位置和结构有问题么?需不需要在前面什么地方声明一下?
 
CRC的返回值会超过255吗?
函数返回类型改为integer类型试试
 
不会超过255
 
CRC8 返回是一个字节的。
var
ckByte:byte
ckByte:=CRC(SBUF,23);
//监控一下 ckByte的值
MSCOMM1.OUTPUT :=ckByte

还有你的CRC8多项式有没有选对。
 
要不看看 1754418 话题
有我 的CRC 8算法
 
if (integer(buff1[j]) and i ) <> 0 ....
不知道你的函数是怎么定义的,我一般在这种地方传过来buff1的要么是16进制数据,要么是用ord()取,而不是用integer,不知道有没有关系。
 
请问yueing
1754418话题是什么意思?
 
yueing
你的是右移算法,移最低位
我的是左移,移最高位
不管算法对否,起码算出来值不是0
但很多时候发送出去就变成0了
 
后退
顶部