最近一个项目用到以16进制数据进行串口通讯
要求:读取信号测量值
命令:A30CC
A (范围0X00-0XFF),表示指定传感器的16进制地址,一字节
30 功能码(十六进制)
CC CRC16校验码
回答:A3004(data)CC
A (范围0X00-0XFF),表示指定传感器的16进制地址,一字节
30 功能码(十六进制)
04 数据字节长度
data 四字节数据,表示信号的测量值
CC CRC16校验码命令集中所有数据均为16进制表示以前只做过串口读取ascii码的数据,没做过读取16进制数据,不知道怎么发送请求命令,并读取数据.还有数据是16进制的,在控件上要不要设什么还有最后的crc16效验码不知道怎么生成,网上看见些现成的crc16函数,但不知道怎么和这问题结合起来高手帮帮我啊,我一般使用cnrs232控件(spcomm的修改版)
要求:读取信号测量值
命令:A30CC
A (范围0X00-0XFF),表示指定传感器的16进制地址,一字节
30 功能码(十六进制)
CC CRC16校验码
回答:A3004(data)CC
A (范围0X00-0XFF),表示指定传感器的16进制地址,一字节
30 功能码(十六进制)
04 数据字节长度
data 四字节数据,表示信号的测量值
CC CRC16校验码命令集中所有数据均为16进制表示以前只做过串口读取ascii码的数据,没做过读取16进制数据,不知道怎么发送请求命令,并读取数据.还有数据是16进制的,在控件上要不要设什么还有最后的crc16效验码不知道怎么生成,网上看见些现成的crc16函数,但不知道怎么和这问题结合起来高手帮帮我啊,我一般使用cnrs232控件(spcomm的修改版)
解决方案 »
- 关于.sdc文件的读取问题
- 请教高手,DBGrid的问题 希望大家帮我解决谢谢!
- 请问怎样制作一个集成到word中的控件(一个按钮),点击按钮对word文档进行操作?
- (1000分大贴)delphi6怎么调用由WebLogic发布的Web Service呀?高手快进,跪求.......
- 用ShockwaveFlash控件时怎么显示和控件进度?
- 急求高手解决中间层程序动态创建adoQuery和DataSetProvider的问题!!!
- 小小与祈晴娃娃及爱翔技术交流二 实际应用操作
- 请问用Delphi6的QuickRep能不能从数据库中取出多行文本并打印?
- 图片透明的问题,分不够可以加
- 恳请Pascal 和数据结构 高手指教,我这个类哪里出错了,为什么Create不了
- 打开一个程序前,如何通知关闭另外一个程序?并且如何知道通知的程序是否可以关闭?
- 如何让ShellExecute堵塞线程???
返回的数据中,data是四字节的16进制,我如何转化为实际的数据啊
A[0]:=$30;
buf: array[0..4] of byte;
procedure send;
begin
buf[0]:=$01;
buf[1]:=$30;
buf[2]:=..;
senddata(buf);
end;procedure senddata(sbuf:array of byte);
begin
if not comm1.WriteCommData(@sbuf,length(sbuf)) then
begin
showmessage('发送错误');
end;
end;
procedure Tfrmmain.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
rbuf:array of byte;
begin
setLength(rbuf, BufferLength);
move(Buffer^, PChar(rbuf)^, BufferLength);
//如果接收的数据为$01 $30..那么 rbuf[0]=$01 rbuf[1]=$30 rbuf[2]
end;
var
Output: array[1..3] of Char;
begin
Output := 'S'#13#10;
dmMain.RS232_1.WriteCommData(@OutPut[1], 3);
end;//接收
procedure TdmMain.RS232_1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
Input: array of byte;
i: Integer;
begin
Input := Buffer;
for i := 0 to BufferLength - 1 do
begin
S_RS232[1] := S_RS232[1] + Chr(Input[i]);
end;
//分析串口接收到的数据
FenXiS_RS232(1);
end;
f:single;
b:array[0..3] of byte;begin move(b,f,sizeof(f));
end;
interface
uses
Windows,SysUtils;
type
PBYTE =^Byte;
//计算CRC检验码
function Get_CRC16(const pData:Pointer;nLength:Integer):string;
//检验函数
function Check_CRC16(const pData:Pointer;nLength:Integer):Boolean;
//获取指定字符串的CRC验证码
function Get_CRC16Code(strValue : string) : string;
const
//16位的CRC检验表
CRCTable16 : array[0..255] of Word = (
$0000, $1189, $2312, $329b, $4624, $57ad, $6536, $74bf,
$8c48, $9dc1, $af5a, $bed3, $ca6c, $dbe5, $e97e, $f8f7,
$1081, $0108, $3393, $221a, $56a5, $472c, $75b7, $643e,
$9cc9, $8d40, $bfdb, $ae52, $daed, $cb64, $f9ff, $e876,
$2102, $308b, $0210, $1399, $6726, $76af, $4434, $55bd,
$ad4a, $bcc3, $8e58, $9fd1, $eb6e, $fae7, $c87c, $d9f5,
$3183, $200a, $1291, $0318, $77a7, $662e, $54b5, $453c,
$bdcb, $ac42, $9ed9, $8f50, $fbef, $ea66, $d8fd, $c974,
$4204, $538d, $6116, $709f, $0420, $15a9, $2732, $36bb,
$ce4c, $dfc5, $ed5e, $fcd7, $8868, $99e1, $ab7a, $baf3,
$5285, $430c, $7197, $601e, $14a1, $0528, $37b3, $263a,
$decd, $cf44, $fddf, $ec56, $98e9, $8960, $bbfb, $aa72,
$6306, $728f, $4014, $519d, $2522, $34ab, $0630, $17b9,
$ef4e, $fec7, $cc5c, $ddd5, $a96a, $b8e3, $8a78, $9bf1,
$7387, $620e, $5095, $411c, $35a3, $242a, $16b1, $0738,
$ffcf, $ee46, $dcdd, $cd54, $b9eb, $a862, $9af9, $8b70,
$8408, $9581, $a71a, $b693, $c22c, $d3a5, $e13e, $f0b7,
$0840, $19c9, $2b52, $3adb, $4e64, $5fed, $6d76, $7cff,
$9489, $8500, $b79b, $a612, $d2ad, $c324, $f1bf, $e036,
$18c1, $0948, $3bd3, $2a5a, $5ee5, $4f6c, $7df7, $6c7e,
$a50a, $b483, $8618, $9791, $e32e, $f2a7, $c03c, $d1b5,
$2942, $38cb, $0a50, $1bd9, $6f66, $7eef, $4c74, $5dfd,
$b58b, $a402, $9699, $8710, $f3af, $e226, $d0bd, $c134,
$39c3, $284a, $1ad1, $0b58, $7fe7, $6e6e, $5cf5, $4d7c,
$c60c, $d785, $e51e, $f497, $8028, $91a1, $a33a, $b2b3,
$4a44, $5bcd, $6956, $78df, $0c60, $1de9, $2f72, $3efb,
$d68d, $c704, $f59f, $e416, $90a9, $8120, $b3bb, $a232,
$5ac5, $4b4c, $79d7, $685e, $1ce1, $0d68, $3ff3, $2e7a,
$e70e, $f687, $c41c, $d595, $a12a, $b0a3, $8238, $93b1,
$6b46, $7acf, $4854, $59dd, $2d62, $3ceb, $0e70, $1ff9,
$f78f, $e606, $d49d, $c514, $b1ab, $a022, $92b9, $8330,
$7bc7, $6a4e, $58d5, $495c, $3de3, $2c6a, $1ef1, $0f78);
implementation
function Get_CRC16(const pData:pointer;nLength:Integer):string;
var
fcs : Word;
p : PBYTE;
begin
p := PBYTE(pData);
fcs := $ffff;
while(nLength>0)do
begin
fcs := (fcs shr 8) xor CRCTable16[(fcs xor p^) and $ff];
Dec(nLength);
Inc(p);
end;
Result := IntToStr(not fcs);
end;
function Check_CRC16(const pData:Pointer;nLength: Integer):Boolean;
var
fcs:Word;
p:PBYTE;
begin
p := PBYTE(pData);
fcs := $ffff;
while(nLength>0) do
begin
fcs := (fcs shr 8) xor CRCTable16[(fcs xor p^) and $ff];
Dec(nLength);
Inc(p);
end;
end;
function Get_CRC16Code(strValue : string) : string;
var
crc , i:Word;
begin
crc := 0;
for i:= 1 to length(strValue) do
begin
crc := CRCTable16[(Byte(crc shr 8) and $ff) xor (ord(strValue[i]) and $ff)] xor (crc shr 8);
end;
Result := IntTohex(crc,2);
end;