查看: 1143|回复: 0
打印 上一主题 下一主题

STM32 MODBUS通讯失败

[复制链接]
跳转到指定楼层
沙发
发表于 2015-3-23 14:25:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
收到的数据只有一个字节 00,求解

硬件:STM32L152  MAX3485
MAX3485的A和B之间连接120欧电阻,仪表485也有120欧电阻
PB5 做485的控制端
串口1接485的RX和TX,接收中断
串口3输出MODBUS接收到的数据
程序:
/***********************************************************************
  * @brief                 串口1初始化
  *                          
  * @param          None
  *                           
  * @retval         None
  *
**********************************************************************/
void usart1_config()
{
        USART_InitTypeDef        USART_InitStructure;

    GPIO_InitTypeDef         GPIO_InitStructure;


        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);                  //----1  串口时钟使能
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);                            //---2  IO时钟使能

        GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);   //--------3 (1) 配置串口管脚
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;     //-------------------   (2)  配置管脚 AF 模式

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10; //--------------   (3)  配置管脚其他参数
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_Init(GPIOA, &GPIO_InitStructure); //-----------------------------   (4)  调用GPIO初始化函数


        USART_InitStructure.USART_BaudRate = 9600;   //---------------------4        设置波特率等参数
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;
        USART_InitStructure.USART_Parity = USART_Parity_No ;
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

        USART_Init(USART1,&USART_InitStructure);// ---------------------------5 调用串口初始化函数

        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);// 接收中断


        USART_Cmd(USART1, ENABLE);  //----------------------------------------6 开启串口

}


void NVIC_Config(void)
{
        NVIC_InitTypeDef        NVIC_InitStructure;

          /************ 配置 USART1 中断向量*************/
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

}

中断入口函数:
void USART1_IRQHandler(void)
{
  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  {
        USART_ClearITPendingBit(USART1,USART_IT_RXNE);

        USART_SendData(USART3,USART_ReceiveData(USART1));
        while(USART_GetFlagStatus(USART3,USART_FLAG_TXE) == RESET);
  }
}

485控制IO配置:
void MODBUS_GPIO()
{

        GPIO_InitTypeDef        GPIO_InitStructure;
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); //GPIO CLOCK Enable

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;

        GPIO_Init(GPIOB, &GPIO_InitStructure);
}

主函数:
uint8_t msg[8] = {0x01,0x04,0x00,0x00,0x00,0x05,0x30,0x09};
int main(void)
{
        uint8_t i;
        usart3_config();
        usart1_config();
        NVIC_Config();
        MODBUS_GPIO();
        while(1)
        {
                GPIO_SetBits(GPIOB,GPIO_Pin_5); //485发送
                delay_ms(1);
                for(i=0;i<8;i++)
                {
                        USART_SendData(USART1,msg);
                        while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
                        while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET);
                //        delay_ms(10);
                }
                delay_ms(1);
                GPIO_ResetBits(GPIOB,GPIO_Pin_5); //485接收
                delay_ms(100);

        }
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入中科因仑

本版积分规则

快速回复 返回顶部 返回列表