第 一个不懂,第二个
2:主机发送:01 03 00 0F 00 01 B4 09
这个具体通讯代码要怎么写?是发送8次两十六进制数据还是别的,麻烦给个具体代码,谢谢!
直接
用byte[] buffer=new byte[你要发送的长度]
buffer[0]=0x01;
buffer[1]=0x03;
buffer[2]=0x00;
...
buffer[6]=0xB4;最后一位较验位是这么算的for(int i=0;i<buffer.Length-1;i++)
{
buffer[7] ^=buffer[i];
}然后直接调用SericePort的Send(buffer);
2:主机发送:01 03 00 0F 00 01 B4 09
这个具体通讯代码要怎么写?是发送8次两十六进制数据还是别的,麻烦给个具体代码,谢谢!
直接
用byte[] buffer=new byte[你要发送的长度]
buffer[0]=0x01;
buffer[1]=0x03;
buffer[2]=0x00;
...
buffer[6]=0xB4;最后一位较验位是这么算的for(int i=0;i<buffer.Length-1;i++)
{
buffer[7] ^=buffer[i];
}然后直接调用SericePort的Send(buffer);
CRC校验码高字节是通讯信息帧的最后一个字节。
CRC校验码由主机计算,放置于发送信息帧的尾部。从机再重新计算接收到信息的CRC,比较计算得到的CRC与接收到的CRC是否一致,如果不一致,则表明出错。CRC计算只用到了8个数据位,计算方法如下:
① 预置1个16位的寄存器为十六进制FFFF(即全为1),称此寄存器为CRC寄存器;
② 把第一个8位二进制数据(通讯信息帧的第1个字节)与16位CRC寄存器的低8位相异或,结果放于CRC寄存器;
③ 把CRC寄存器的内容右移一位(朝低位)并用0填补最高位,检查右移后的移出位;
④ 如果移出位为0:重复第③步(再次右移一位);
如果移出位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;
⑤ 重复步骤③和④,直到右移8次,这样整个8位数据全部进行了处理;
⑥ 重复步骤②到步骤⑤,进行通讯信息帧下一个字节的处理;
⑦ 将该通讯信息帧所有字节(不包括CRC校验码高、低字节)按上述步骤计算完成后,CRC寄存器内容即为CRC校验码。
能不能没有校验码?
http://blog.csdn.net/yeqi3000/article/details/8236446
public byte[] CRC16(byte[] data)
{
byte CRC16Lo;
byte CRC16Hi; //CRC寄存器
byte CL; byte CH; //多项式码&HA001
byte SaveHi; byte SaveLo;
byte[] tmpData; int Flag;
CRC16Lo = 0xFF;
CRC16Hi = 0xFF;
CL = 0x01;
CH = 0xA0;
tmpData = data;
for (int i = 0; i < tmpData.Length; i++)
{
CRC16Lo = (byte)(CRC16Lo ^ tmpData[i]); //每一个数据与CRC寄存器进行异或
for (Flag = 0; Flag <= 7; Flag++)
{
SaveHi = CRC16Hi;
SaveLo = CRC16Lo;
CRC16Hi = (byte)(CRC16Hi >> 1); //高位右移一位
CRC16Lo = (byte)(CRC16Lo >> 1); //低位右移一位
if ((SaveHi & 0x01) == 0x01) //如果高位字节最后一位为1
{
CRC16Lo = (byte)(CRC16Lo | 0x80); //则低位字节右移后前面补1
} //否则自动补0
if ((SaveLo & 0x01) == 0x01) //如果LSB为1,则与多项式码进行异或
{
CRC16Hi = (byte)(CRC16Hi ^ CH);
CRC16Lo = (byte)(CRC16Lo ^ CL);
}
}
}
byte[] ReturnData = new byte[2];
ReturnData[0] = CRC16Hi; //CRC高位
ReturnData[1] = CRC16Lo; //CRC低位
return ReturnData;
}
crc校验
http://download.csdn.net/detail/yeqi3000/4853494