打印

如何发送完整的命令帧

[复制链接]
5224|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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等。。。

使用特权

评论回复
5
syk| | 2008-11-3 22:23 | 只看该作者

楼主做什么东东

楼主做什么东东 是做电表么用的是通讯规约吧 。

使用特权

评论回复
6
hace1983|  楼主 | 2008-11-4 09:55 | 只看该作者

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

使用特权

评论回复
7
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);

使用特权

评论回复
8
henry188| | 2008-11-4 15:02 | 只看该作者

回复

buffer[ ] = {0xfe,0xfe,0x05,0x80,0x01,0x02,crc_half_byte>>8,crc_half_byte};

使用特权

评论回复
9
hace1983|  楼主 | 2008-11-4 15:17 | 只看该作者

多谢朋友们的帮忙。

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

使用特权

评论回复
10
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码相等?

使用特权

评论回复
11
db10| | 2008-11-4 15:43 | 只看该作者

。。。

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

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

使用特权

评论回复
12
hace1983|  楼主 | 2008-11-12 18:11 | 只看该作者

写出来了。

谢谢朋友们的帮助,有时间我把程序帖上来。

使用特权

评论回复
13
rzm2001| | 2008-12-17 11:42 | 只看该作者

这应该很简单的

这应该不是难事,按正常发送程序,将后面的校验码发送出去即可了

使用特权

评论回复
14
madcool| | 2010-5-28 16:08 | 只看该作者
byte h_byte = crc_half_byte>>8;
byte l_byte = crc_half_byte;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

63

帖子

1

粉丝