如何发送完整的命令帧

[复制链接]
 楼主| hace1983 发表于 2008-10-31 10:11 | 显示全部楼层 |阅读模式
rc, CRC, AN, TE, COM
我要发送一个消息帧,由地址码、控制码、数据长度、数据域、校验码组成,其中校验是用CRC16算法。我现在就是不明白,当计算出校验码后,如何把他们组成一帧放松出去。
下面是我写的一函数,不知道正确否
void frame_format()
{
 transmit_command[4] = {0x05,0x80,0x01,0x02};
 for(i=1;i<=4;i++)
  {
    unsigned int len = 4;
    unsigned char crc_half_byte 
    crc_half_byte = crc16(transmit_command,len);
   //crc16(transmit_command,len)是CRC16校验算法
  }
 buffer[ ] = {0xfe,0xfe,0x05,0x80,0x01,0x02,crc_half_byte};
//crc_half_byte 是2个字节,如何把拆分成高低字节
}


谢谢了。
 楼主| hace1983 发表于 2008-10-31 10:33 | 显示全部楼层

得到高低字节

get_high_byte = crc_half_byte & 0xF0;//得到高字节
get_low_byte = crc_half_byte & 0x0F;//得到低字节
buffer[] = 0xFE,0xFE,0x01,0x03,0x01,0x03,get_high_byte,get_low_byte};
 楼主| hace1983 发表于 2008-11-3 09:59 | 显示全部楼层

我是刚开始写程序的

请多指教
db10 发表于 2008-11-3 14:15 | 显示全部楼层

...

 组成一帧放松出去??
 不知道你要表达什么?是如何将数据包发送出去吗?

  你将所有要发送的数据放到一个区间,可以是数据里,再将数据通过硬件发送出去就可以啊(硬件驱动程序),硬件可以是串口,网口,USB等。。。
syk 发表于 2008-11-3 22:23 | 显示全部楼层

楼主做什么东东

楼主做什么东东 是做电表么用的是通讯规约吧 。
 楼主| hace1983 发表于 2008-11-4 09:55 | 显示全部楼层

我做的是读传感器中的温度值,传感器中带有校验算法

zhx0919 发表于 2008-11-4 12:46 | 显示全部楼层

你的程序错误

错误的地方:unsigned char crc_half_byte 
    crc_half_byte = crc16(transmit_command,len);
应该改成:short crc_half_byte ;
         char High_Byte,Low_Byte;
crc_half_byte = crc16(transmit_command,len);
High_Byte=(char)(crc_half_byte &0xff00)>>8;
Low_Byte=(char)(crc_half_byte &0x00ff);
henry188 发表于 2008-11-4 15:02 | 显示全部楼层

回复

buffer[ ] = {0xfe,0xfe,0x05,0x80,0x01,0x02,crc_half_byte>>8,crc_half_byte};
 楼主| hace1983 发表于 2008-11-4 15:17 | 显示全部楼层

多谢朋友们的帮忙。

我用的传感器中带CRC16校验算法,在读传感器中的温度值时,也要加入CRC16算法,我不知道在哪个位置加?
从传感器中返回的数据放在一个数组里,其中最后两位是CRC码。我知道,只要接受到的数据的CRC码与传感器发送的数据的CRC码相等,说明所接收的数据是正确的,否则是错误的。关键是如何比较CRC码?我想了很久,就是写不出来。

 楼主| hace1983 发表于 2008-11-4 15:27 | 显示全部楼层

例如

发给传感器的命令 Transmit_Command[3] = {0x01,0x03,0x01,0x03};

传感器回应的数据 
get_tempreture_value[9] = {0x01,0x43,0x05,0x72,0x01,0xFA,0x00,0x8E,0x0A};// 0x8E,0x0A是CRC码。



//CRC16函数
unsigned  CRC16(unsigned char *pMsg,unsigned char Len);

如何判断接收到的数据与传感器发送的数据的CRC码相等?

db10 发表于 2008-11-4 15:43 | 显示全部楼层

。。。

CRC16算法。
 大部分普通通信协议格式:
 包头关键字+包头其他数据+数据+CRC16+包结束关键字

 包头关键字和包结束关键字可以用相同的数据表示,这个是一般通用的数据包,CRC16一般计算包头其他数据+数据的部分数据就可以了,还有数据传输是否要拆分和其它处理(包括数据部分如果跟包头关键字相同进行分散处理)等,那要看你传输的线什么?有无线传输,还有有线普通传,还是TCP传等,都是要考虑的。
 楼主| hace1983 发表于 2008-11-12 18:11 | 显示全部楼层

写出来了。

谢谢朋友们的帮助,有时间我把程序帖上来。
rzm2001 发表于 2008-12-17 11:42 | 显示全部楼层

这应该很简单的

这应该不是难事,按正常发送程序,将后面的校验码发送出去即可了
madcool 发表于 2010-5-28 16:08 | 显示全部楼层
byte h_byte = crc_half_byte>>8;
byte l_byte = crc_half_byte;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

63

帖子

1

粉丝
快速回复 返回顶部 返回列表