项目要求接60个左右的从站,我自己测试的时候4个从站通信完全没问题,但是到了实际测试的时候,20个左右的从站就会出现通信不通畅的问题,有的时候能正确通信,有的时候个别开关量无**常控制,比如智能打开不能关闭,监视串口的结果发现报文发送成功,但从站却没有返回报文。
确定接线上没有问题,我想请各位大牛帮我看看从站判断功能码上有没有问题,我对报文的处理是先判断地址码,再判断功能码最后判断CRC,因为功能只涉及到单一个开关量的打开和关闭报文很固定,所以并没有判断报文长度,不知道这样的逻辑顺序有没有问题,会不会有BUG
从站判断功能码段的代码如下:
if (receBuf[0]==localAddr) //判断从机地址
{
switch(receBuf[1])
{
case 3: //功能码=3
{
crcData=crc16(receBuf, 6);
if(crcData == receBuf[6]+(receBuf[7]<<8)) //CRC校验
{
readRegisters(); //启动读取寄存器设置函数
}
break;
}//下同
case 5:
{
crcData=crc16(receBuf, 6);
if(crcData == receBuf[6]+(receBuf[7]<<8))
{
setIO();
}
break;
}
case 1:
{
crcData=crc16(receBuf, 6);
if(crcData == receBuf[6]+(receBuf[7]<<8))
{
readIO();
}
break;
}
case 16:
{
crcData=crc16(receBuf, receCount-2);
if(crcData == receBuf[receCount-2]+(receBuf[receCount-1]<<8))
{
setRegisters();
}
break;
}
default:break;
}
} |