/* 函数功能:读取输入寄存器(模拟量输入)
函数输入:两个指针,pointer_1指向用来存放输入信息帧的数组,
pointer_2用来指向存放输出信息帧的数组(两个数组的第一个元素都用来存放信息帧的有效字节个数)
后面的元素按照Modbus协议组织。
函数输出:无。
*/
void ReadInputReg(u8 *pointer_1,u8
*pointer_2)//pointer_1用作输入,pointer_2用作输出
{
u16
Address=0;//待读取寄存器起始地址(HoldReg,i为0-99对应地址从0到99)
u16 Num=0;//要读取的寄存器个数
u16 SendKey;//要发送数据的校验值
u32 PortTemp;//用来存放从端口取过来的数据,临时计算用
u16 ReadData=0;//用来临时存放从端口读来的数据
u32 CalTemp=0;//用来临时计算
Address=(u16)(*(pointer_1+3))*256+(*(pointer_1+4));//先得到寄存器起始地址
Num=(u16)(*(pointer_1+5))*256+(*(pointer_1+6));//先得到要读取的寄存器个数
*(pointer_2+2)=0x04;//第三个字节为功能码
if(*(pointer_1)==8) //如果接收到的字节数不是8个,就是一个错误帧
{
if(Address<2) //只要地址小于2,就是合法地址
{
if(Address+Num<=2&&Num>0)
//只要地址加数量大于0小于2,就是合法数量
{
//用于for循环
u8 i;
u8 j;
*(pointer_2+3)=Num*2;//第四个字节为要发送的字节个数
*(pointer_2)=1+1+1+Num*2+2;//有效字节个数等于丛机地址+功能码+字节个数+寄存器信息+CRC校验
//将端口ADC1和ADC2的数据预先读入到临时的数据缓存中
ReadData=ADC_GetConversionValue(ADC2);
PortTemp=(u32)(ReadData);
PortTemp=PortTemp<<16;
ReadData=ADC_GetConversionValue(ADC1);
PortTemp=PortTemp|(u32)(ReadData);
//将PortTemp中的数据先进行预处理
PortTemp=PortTemp<<(Address*16);
for(i=4,j=Num*2;j>0;i++,j-=2)
{
CalTemp=(u16)(PortTemp<<16);
*(pointer_2+i)=(u8)(CalTemp>>8);//先放高位
*(pointer_2+i+1)=(u8)(CalTemp&0x00FF);//再放低位
}
//写入校验码
SendKey=CRC16(pointer_2+1,*pointer_2-2);
//将计算出来的校验码装入输出数据缓存中
*(pointer_2+(*pointer_2-1))=(u8)(SendKey>>8);
*(pointer_2+(*pointer_2))=(u8)(SendKey&0x00FF);
//启动数据发送
USART_ITConfig(USART1,
USART_IT_TC, ENABLE);//开启数据发送中断
}
else
{
ErrorHandle(3,pointer_2);//错误读取数量
}
}
else
{
ErrorHandle(2,pointer_2);//错误起始地址
}
}
else
{
Comu_Busy=0;
}
}
标记红色的那句老是出现错误,错误是main.c(497): error: #20: identifier "ADC2" is undefined ReadData=ADC_GetConversionValue(ADC2);
是不是我包含的头文件不对,还是什么原因?
|