发表于:2005-12-12 23:48:00
2楼
设置好读写的频率,我想是不是读写太快,读写缓冲区溢出了
这是我写的嵌入式系统的一段 Modbus Rtu读写程序,你可以参考一下
//*************************************************************************
//**函 数 名:RtuData
//**输 入:Addr - 设备地址(1~247)
//** :Mode - 功能模式
//** :DataStart - 数据区起始地址
//** :DataArray() - 读写数据缓存区
//** :DataNum - 数据个数
//**输 出:操作的信息: 0 - 正确 1-接收的数据长度不对 2 - 接收的数据错误 3- 数据长度错
//**功能描述:以RTU模式读写数据
//**全局变量:
//**调用模块:
//**作 者:叶帆
//**日 期:2005-2-2
//**修 改 人:
//**日 期:
//**版 本:V1.0
//*************************************************************************
WORD RtuData(BYTE Addr, BYTE Mode, WORD DataStart, BYTE *DataArray, WORD DataNum)
{
BYTE bytSendArray[255]; //发送数据缓冲区
BYTE bytReceiveArray[255]; //接收数据缓冲区
UINT intCRC16;
int i;
int intOffSet;
int intSendNum;
int intGetDataLen; //实际接收数据的帧长度
if (DataNum>64 || DataNum<1) return 3;
bytSendArray[0] = Addr; //设备地址
bytSendArray[1] = Mode; //功能模式
bytSendArray[2] = DataStart / 256; //机车地址高位
bytSendArray[3] = DataStart & 0xFF; //机车地址低位
bytSendArray[4] = DataNum / 256; //数据个数高位
bytSendArray[5] = DataNum & 0xFF; //数据个数低位
if (Mode==WriteData)
{
bytSendArray[6] = DataNum * 2; //数据的字节个数
for(i = 1;i<DataNum * 2+1;i++)
bytSendArray[6+i] = DataArray[i-1];
intOffSet = 7 + DataNum * 2;
}
else
{
intOffSet = 6;
}
intCRC16=GetCheckCode(bytSendArray,intOffSet);
bytSendArray[intOffSet] = intCRC16 & 0xFF; //CRC校验低位
bytSendArray[intOffSet + 1] = (intCRC16>>8) &0xff; //CRC校验高位
intSendNum=intOffSet+2;
NB_Delay(3);
if (Mode==WriteData) intGetDataLen = 8;
else intGetDataLen = 5 + DataNum * 2;
//发送和接收数据
if (GZ_Command(intSendNum,bytSendArray,intGetDataLen,bytReceiveArray)!=0)
{
return 1; //数据接收错误
}
//信息处理
intCRC16=GetCheckCode(bytReceiveArray,intGetDataLen-2);
//CRC16校验检验
if (bytReceiveArray[intGetDataLen - 2]==(intCRC16 & 0xFF) && bytReceiveArray[intGetDataLen - 1]==((intCRC16>>8) &0xff))
{
//帧数据是否正确
if (bytReceiveArray[0] == bytSendArray[0] && bytReceiveArray[1] == bytSendArray[1])
{
if( Mode==WriteData)
{
//
}
else
{
for(i=0;i<bytReceiveArray[2];i++)
DataArray[i] = bytReceiveArray[3 + i];
}
return 0;
}
}
return 2;
}