/*******************************************************************************************************************
sum();求和函数
取温度值得十位,个位和小数位上的数据之和,作为校验字节返回
********************************************************************************************************************/
unsigned char sum(unsigned char *dat,unsigned char n)
{
unsigned char i;
unsigned char s_dat=0x00;
for(i=1;i<n+1;i++)
{
s_dat+=dat;
}
return(s_dat);
}
发送部分:
if(mode==2)//模式2界面
{
LCD12864_Display_Words(0, 2, "RS485");
LCD12864_Display_Words(0, 5, "模式");
LCD12864_Display_Words(1,0,"从机1:");
/***********************************************以下为自定义通讯协议***************************************************************/
Temperature =(sDevSystemPara.afAI_InputLast[0]/0.306)*100;//对pt100电流值进行处理转化为温度值,*10保留一位小数
temp = Temperature;//读取温度
aucRxBuff_UART4[0]=0x24; //发送协议起始标志$
aucRxBuff_UART4[1]=temp%1000/100; //存十位上的数据
aucRxBuff_UART4[2]=temp%100/10; //存个位上的数据
aucRxBuff_UART4[3]=temp%10; //存小数位上的数据
aucRxBuff_UART4[4]=sum(aucRxBuff_UART4,3);//存校验和
aucRxBuff_UART4[5]=0x23; //发送协议结束标志位
UART4_SendData(aucRxBuff_UART4,6); //从机向主句发送温度数据
OSTimeDlyHMSM(0,0,0,1000); //延时1秒
}
接收部分:
if(mode==2)
{
LCD12864_Display_Words(0, 2, "RS485");
LCD12864_Display_Words(0, 5, "模式");
LCD12864_Display_Words(1,0,"从机1:");
//以下为接收部分代码
if(ucRx4_RcvReady == 1)//接收完成,数据均缓存到aucRxBuff_UART4[]里
{
if(aucRxBuff_UART4[0]!=0x24)//判断头是不是起始标志0x24
{
uiRx4_DataLen=0;
}
if(uiRx4_DataLen>6)//若接收字节大于6
{
uiRx4_DataLen=0;
sum_reslut=0;
sum_reslut=sum(aucRxBuff_UART4,3);//和校验求和
if(sum_reslut==aucRxBuff_UART4[4])//校验和对则对接收的数据进行显示
{
LCD12864_Write(0xf8,0x98);
LCD12864_Write(0xfa,(aucRxBuff_UART4[1]+0x30));
LCD12864_Write(0xfa,(aucRxBuff_UART4[2]+0x30));
LCD12864_Write(0xfa,'.');
LCD12864_Write(0xfa,(aucRxBuff_UART4[3]+0x30));
}
OSTimeDlyHMSM(0,0,0,1000);
}
}
接收中断部分:
void UART4_IRQHandler(void)
{
u8 c;
static u8 flag = 0;
static u8 uiRx4_DataLen_Temp = 0;
if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit( UART4, USART_IT_RXNE); //清除中断位
c=UART4->DR;
if((c=='$')|(flag==1))
{
flag=1;
aucRxBuff_UART4[uiRx4_DataLen_Temp] = c;
uiRx4_DataLen_Temp++;
if(c == '#')
{
ucRx4_RcvReady = 1;//置位一个接收完成标志?
uiRx4_DataLen = uiRx4_DataLen_Temp;//外部获取接收长度
flag = 0;
}
}
else
{ flag=0;
uiRx4_DataLen_Temp = 0;
}
//aucRxBuff_UART4[uiRx4_DataLen] = c;
//uiRx4_DataLen++;
}
//处理IDLE中断
//当产生IDLE中断时,表示接收完毕一组完整的数据
else if(USART_GetITStatus(UART4, USART_IT_IDLE) != RESET)
{
//这个语句加上上面的判断语句结合起来才能清除IDLE中断
c = UART4->DR;
//
//此时UART4数据接收完毕。
//用户可以处理数据。最好在主程序中处理,而不是在中断程序中处理。
//
ucRx4_RcvReady = 1;
}
}