Board logo

标题: STM32F的232口简易MODBUS-RTU通讯程序(2) [打印本页]

作者: smartpeople    时间: 2016-7-14 21:23     标题: STM32F的232口简易MODBUS-RTU通讯程序(2)

void Modbus_Function_6(void)
{
    u16 tempdress = 0;
    u8 tx_flat = 0;
    u16 crcresult;
    tempdress = (Uart0_rev_buff[2]<<8) + Uart0_rev_buff[3];
    switch(tempdress)
    {
        case 0x0126:
     {
            Mkzt_bz = (Uart0_rev_buff[4]<<8) + Uart0_rev_buff[5];
            if(user_day > 0)
      {
                tx_flat = 1;
      }
        }break;
        case 0x012A:
     {
            OutX_current = (Uart0_rev_buff[4]<<8) + Uart0_rev_buff[5];
            if(user_day > 0)
      {
                tx_flat = 1;
      }
        }break;
        case 0x012C:
     {
            Jc_voltage = (Uart0_rev_buff[4]<<8) + Uart0_rev_buff[5];
            if(user_day > 0)
      {
                tx_flat = 1;
      }
        }break;
        case 0x012E:
     {
            Fc_voltage = (Uart0_rev_buff[4]<<8) + Uart0_rev_buff[5];
            if(user_day > 0)
      {
                tx_flat = 1;
      }
        }break;
        case 0x01EE:
     {
            user_day = (Uart0_rev_buff[4]<<8) + Uart0_rev_buff[5];
            tx_flat = 1;
            //eeprom_write_word (&user_day_eep,user_day);
        }break;
        default: //命令码无效不应答
                {
                    tx_flat = 0;
                }
    }
    if(tx_flat == 1)
    {
        Uart0_send_buff[0] = Com0_id;
        Uart0_send_buff[1] = 0x06;
        Uart0_send_buff[2] = Uart0_rev_buff[2];
        Uart0_send_buff[3] = Uart0_rev_buff[3];
        Uart0_send_buff[4] = Uart0_rev_buff[4];
        Uart0_send_buff[5] = Uart0_rev_buff[5];
        Uart0_send_counter = 6;
        //UCSRB |= (1<<TXCIE)|(1<<TXEN);//发送、发送中断允许
        crcresult = getCRC16(Uart0_send_buff,Uart0_send_counter);
        Uart0_send_buff[Uart0_send_counter] = crcresult & 0xff;
        Uart0_send_buff[Uart0_send_counter+1] = (crcresult >> 8) & 0xff;
        Uart0_send_counter = Uart0_send_counter+2;
        Uart0_send_pointer = Uart0_send_buff;
            USART_SendData(USART1, *Uart0_send_pointer++);
                USART_ITConfig(USART1, USART_IT_TXE, ENABLE);               
    }
}
/////////////////////////////////////////////////////////////
void Com0_Communication(void)
{
    s8 i =0;        
    if(Uart0_rev_comflag == 1)//接收完成标志=1处理,否则退出
    {
        if(Uart0_rev_buff[0] == Com0_id)//地址错误不应答
     {
            unsigned short crcresult;
            unsigned char temp[2];
            crcresult = getCRC16(Uart0_rev_buff,Crc_counter-2);
            temp[1] = crcresult & 0xff;
            temp[0] = (crcresult >> 8) & 0xff;
            if((Uart0_rev_buff[Crc_counter-1] == temp[0])&&(Uart0_rev_buff[Crc_counter-2] == temp[1]))//crc校验错误不应答
         {
                //SETBIT(PORTC,PC6);
                Delay(1);
                    switch(Uart0_rev_buff[1])
                 {
                            case 0x03:
                      {
                        if(user_day > 0)
            {
                            Modbus_Function_3();
                  }      
           }
                            break;  
                            case 0x06:
                         {
                        Modbus_Function_6();
           }
                            break;            
                    }      
      }
     }
        Uart0_rev_comflag = 0;
        for(i = 100;i > -1;i--)
     {
                    Uart0_rev_buff = 0;
     }
    }


}
/*******************************************************************************
* Function Name  : Delay
* Description    : Inserts a delay time.
* Input          : nCount: specifies the delay time length.
* Output         : None
* Return         : None
*******************************************************************************/
void Delay(vu32 nCount)
{
  for(; nCount != 0; nCount--);
}
//////////////////////////////////////////////////////////////////////////




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0