STM32/STM8技术论坛
直播中

徐宏波

未满1年用户 5经验值
擅长:嵌入式技术
私信 关注
[问答]

求助大佬们看一下我的程序为什么实现不了RS485通信

我这个是STM32F103通过串口2、RSM3485CT发送信息,为什么USB转RS485插上之后电脑收不到我发送的信息啊,求助求助,搞不明白

这是初始化代码:

void Usart_Init(void)
{
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,&GPIO_InitStructure);
    
    GPIO_SetBits(GPIOB,GPIO_Pin_3);
    
    USART_InitTypeDef USART_InitStructure;
    USART_InitStructure.USART_BaudRate = 9600;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_Init(USART2,&USART_InitStructure);
    
    
    
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_Init(&NVIC_InitStructure);
    
    USART_ClearFlag(USART2,USART_FLAG_TC);
    USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
    USART_Cmd(USART2,ENABLE);
}

这是发送数据的代码:

void RS485_SendData(uint8_t *data, uint16_t len)
{
    GPIO_ResetBits(GPIOB, GPIO_Pin_3);
    
    for (uint16_t i = 0; i < len; i++)
    {
        while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
        USART_SendData(USART2, data[i]);
    }
    
    while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
    
}

这是main中的代码:
int main(void)
{
uint8_t txData[] = "Hello RS485!";

Usart_Init();

while (1)
{
    RS485_SendData(txData, sizeof(txData) - 1);
    Delay_ms(2);
    GPIO_SetBits(GPIOB,GPIO_Pin_3);
}

回帖(3)

周璞

2024-7-30 16:47:03
可以先测试UART发送是否正确,然后测试485发送,如果仍然不对,检查485收发器硬件电路,或者更换USB-485适配线缆
2 举报
  • 徐宏波: 都试了,还是不行
  • 周璞 回复 徐宏波: 一步一步测试,如果UART发送都不正常,先看你的MCU是否能正常运行一个程序(比如点亮LED),然后再检查UART初始化和收发程序。

陨星糖豆

2024-7-31 11:25:37
你是用什么做的延时,如果使用了系统定时器需要配置一下
SysTick_Config(SystemCoreClock / 1000);
举报

jf_28174308

2024-8-6 08:42:37
我感觉你是发送完之后没有延时,因为串口发送完毕不代表 RS485就发送完毕了,RS485芯片把串口电平转化成485需要时间的
1 举报
  • 徐宏波: 最后发现STM32PB2引脚默认复用为JTAG,服用一下就行了

更多回帖

发帖
×
20
完善资料,
赚取积分