ZYR310 2020-03-28 18:43 采纳率: 0%
浏览 461
已结题

STM32F103CB使用MAX485接收不到

PC向主机串口1发送的数据,由串口2经MAX485转发,从机接收数据并通过MAX485到串口2,最后控制继电器。目前发现串口1发送485发送的数据正常,从机用示波器测量MAX485和串口2处有信号,但是从机芯片无法接收。主机从机发送正常,单独使用串口2发送到串口1也正常。
串口2是PA2和PA3,使用PA4做MAX485控制引脚

#define RS485_TX GPIO_SetBits(GPIOA,GPIO_Pin_4) //485发送使能(在使用时注意有响应延时)
#define RS485_RX GPIO_ResetBits(GPIOA,GPIO_Pin_4) //485接收使能(在使用时注意有响应延时)
#define USART2_RX_EN 1 //0:不接收;1:接收
#define USART_REC_LEN 200 //定义最大接收字节数 200
u16 USART_RX_STA; // 串口1接收状态标志
u8 USART_RX_BUF[USART_REC_LEN]; //串口1接收缓冲

/**
//功能:RS485串口2初始化
//参数:bound:波特率
//返回值:None
**/
void RS485_Init(u32 bound)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
/*************************************GPIO Config****************************************/
GPIO_InitStructure.GPIO_Pin =   GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode    =   GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed   =   GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin =   GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode    =   GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin =   GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode    =   GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed   =   GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
#if USART2_RX_EN
/*************************************USART Config*****************************************/
USART_InitStructure.USART_BaudRate  =   bound;
USART_InitStructure.USART_WordLength    =   USART_WordLength_8b;
USART_InitStructure.USART_StopBits  =   USART_StopBits_1;
USART_InitStructure.USART_Parity    =   USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl   =   USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode  =   USART_Mode_Rx   |   USART_Mode_Tx;
USART_Init(USART2,&USART_InitStructure);
USART_Cmd(USART1, ENABLE);                                                                                                                  //使能串口外设

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能串口接收中断
USART_ClearFlag(USART1, USART_FLAG_TC); //软件清除发送完成标志位
/**************************************NVIC Config*****************************************/
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority =2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

#endif  
RS485_RX;                                                                                                                   //485默认接收

}
//********************串口2中断服务函数**********//
void USART2_IRQHandler()
{
u16 temp;

if(USART_GetITStatus(USART2, USART_IT_RXNE) !=  RESET)                      //接收中断,必须以0x0d,0x0a结尾
{
    temp = USART_ReceiveData(USART2);   //读取接收到的数据
    if((USART_RX_STA & 0x8000) == 0)                                                                        //接收未完成
    {
        if(USART_RX_STA & 0x4000)                                                                               //如果接收到了0x0d
        {
            if(temp != 0x0a)        USART_RX_STA = 0;                                                       //接受错误,重新开始接收
            else
                            {   
                                USART_RX_STA |= 0x8000;                                                                 //接收完成
                            }
        }
        else                                                                                                                    //未收到0x0d
        {
            if(temp == 0x0d)        USART_RX_STA |= 0X4000;
            else
            {
                USART_RX_BUF[USART_RX_STA & 0X3FFF] = temp;
                USART_RX_STA++;

                if(USART_RX_STA > (USART_REC_LEN - 1))      USART_RX_STA = 0;           //接收数据错误,重新开始接收
            }
        }
    }

}else if(USART_GetFlagStatus(USART2,USART_FLAG_IDLE)!=RESET)
    {
        USART_ClearFlag(USART2,USART_FLAG_IDLE); 
    }

}

int main()
{
u16 t = 0;
u8 length;
u16 times=0;
SysTick_Init();
Delay_us(100);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC优先级分组2:2位抢占优先级,2位响应优先级
UART1_Init(115200);
UART2_Init(9600);
RS485_Init(9600);
printf("\r\n01 finsh\r\n");
printf("\r\n等待接收\r\n");
while(1)
{
if(USART_RX_STA & 0x8000)
{
RS485_RX;
Delay_ms(100);
length = USART_RX_STA&0X3fff; //获取数据长
printf("\r\nyour massage is:\r\n");
for(t=0;t<length;t++)
{
Delay_us(1000);
SendByte(USART1,USART_RX_BUF[t]);//自己写的发送函数,正常
}
printf("\r\n发送完成\r\n");
RS485_RX;
USART_RX_STA=0;

        }else
  {
     times++;
     if(times % 5000 == 0)
     {
        printf("\r\nlab\r\n");
        printf("ALIENTEK\r\n\r\n");
     }
     if(times % 200 == 0)   printf("\r\n waitting \r\n");
     if(times % 30 == 0)     printf("\r\nsystem runing\n");//提示系统正在运行
             Delay_ms(10);
  }
}

}

  • 写回答

3条回答 默认 最新

  • threenewbee 2020-03-28 21:07
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用