OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6538|回复: 10

stm32f429的rs485通信问题(新手求助)

[复制链接]

1

主题

4

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-6-4
在线时间
4 小时
发表于 2019-6-4 15:07:23 | 显示全部楼层 |阅读模式
1金钱
我用的是429提供的HAL库版rs485例程,使用两块板子通信,为什么只能一端发送数据另一端接收,而另一端发送的数据无法接收?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10560
金钱
10560
注册时间
2017-2-18
在线时间
1911 小时
发表于 2019-6-4 17:28:52 | 显示全部楼层
拍照下两板子间的接法
回复

使用道具 举报

10

主题

83

帖子

0

精华

高级会员

Rank: 4

积分
924
金钱
924
注册时间
2016-3-21
在线时间
111 小时
发表于 2019-6-4 17:35:32 | 显示全部楼层
代码和连线贴出来看一下
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-6-4
在线时间
4 小时
 楼主| 发表于 2019-6-4 19:31:21 | 显示全部楼层
peng1554 发表于 2019-6-4 17:28
拍照下两板子间的接法

A接A,B接B,共地
微信图片_20190604192932.jpg
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10560
金钱
10560
注册时间
2017-2-18
在线时间
1911 小时
发表于 2019-6-4 19:34:29 | 显示全部楼层
墨问12 发表于 2019-6-4 19:31
A接A,B接B,共地

硬件接法没问题~~
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-6-4
在线时间
4 小时
 楼主| 发表于 2019-6-4 19:38:01 | 显示全部楼层
本帖最后由 墨问12 于 2019-6-4 19:47 编辑
触电丶 发表于 2019-6-4 17:35
代码和连线贴出来看一下

UART_HandleTypeDef USART2_RS485Handler;  //USART2¾ä±ú(óÃóúRS485)

#if EN_USART2_RX                   //èç1ûê1Äüá˽óêÕ            
//½óêÕ»o′æÇø         
u8 RS485_RX_BUF[64];          //½óêÕ»o3å,×î′ó64¸ö×Ö½ú.
//½óêÕμ½μÄêy¾Y3¤¶è
u8 RS485_RX_CNT=0;  

void USART2_IRQHandler(void)
{
    u8 res;        
    if((__HAL_UART_GET_FLAG(&USART2_RS485Handler,UART_FLAG_RXNE)!=RESET))  //½óêÕÖD¶Ï
                {                 
       HAL_UART_Receive(&USART2_RS485Handler,&res,1,1000);
                  if(RS485_RX_CNT<64)
                  {
                           RS485_RX_BUF[RS485_RX_CNT]=res;                //&#188;&#199;&#194;&#188;&#189;óê&#213;μ&#189;μ&#196;&#214;μ
                          RS485_RX_CNT++;                                                //&#189;óê&#213;êy&#190;Y&#212;&#246;&#188;ó1
                  }                        
        }
}   
#endif

//3&#245;ê&#188;&#187;ˉIO ′&#174;&#191;ú2
//bound:2¨ì&#216;&#194;ê
void RS485_Init(u32 bound)
{
    //GPIO&#182;&#203;&#191;úéè&#214;&#195;
        GPIO_InitTypeDef GPIO_Initure;
        
        PCF8574_Init();                         //3&#245;ê&#188;&#187;ˉPCF8574£&#172;ó&#195;óú&#191;&#216;&#214;&#198;RE&#189;&#197;
        
        __HAL_RCC_GPIOA_CLK_ENABLE();                        //ê1&#196;üGPIOAê±&#214;ó
        __HAL_RCC_USART2_CLK_ENABLE();                        //ê1&#196;üUSART2ê±&#214;ó
        
        GPIO_Initure.Pin=GPIO_PIN_2|GPIO_PIN_3; //PA2,3
        GPIO_Initure.Mode=GPIO_MODE_AF_PP;                //&#184;′ó&#195;í&#198;íìê&#228;3&#246;
        GPIO_Initure.Pull=GPIO_PULLUP;                        //é&#207;à-
        GPIO_Initure.Speed=GPIO_SPEED_HIGH;                //&#184;&#223;&#203;ù
        GPIO_Initure.Alternate=GPIO_AF7_USART2;        //&#184;′ó&#195;&#206;aUSART2
        
        HAL_GPIO_Init(GPIOA,&GPIO_Initure);                   //3&#245;ê&#188;&#187;ˉPA2,3

    //USART 3&#245;ê&#188;&#187;ˉéè&#214;&#195;
        USART2_RS485Handler.Instance=USART2;                                //USART2
        USART2_RS485Handler.Init.BaudRate=bound;                        //2¨ì&#216;&#194;ê
        USART2_RS485Handler.Init.WordLength=UART_WORDLENGTH_8B;        //×&#214;3¤&#206;a8&#206;&#187;êy&#190;Y&#184;&#241;ê&#189;
        USART2_RS485Handler.Init.StopBits=UART_STOPBITS_1;                //ò&#187;&#184;&#246;í£&#214;1&#206;&#187;
        USART2_RS485Handler.Init.Parity=UART_PARITY_NONE;                //&#206;T&#198;&#230;&#197;&#188;D£&#209;é&#206;&#187;
        USART2_RS485Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE;        //&#206;Tó2&#188;tá÷&#191;&#216;
        USART2_RS485Handler.Init.Mode=UART_MODE_TX_RX;                    //ê&#213;·¢&#196;£ê&#189;
        HAL_UART_Init(&USART2_RS485Handler);                                //HAL_UART_Init()&#187;áê1&#196;üUSART2

  __HAL_UART_DISABLE_IT(&USART2_RS485Handler,UART_IT_TC);
#if EN_USART2_RX
        __HAL_UART_ENABLE_IT(&USART2_RS485Handler,UART_IT_RXNE);//&#191;a&#198;&#244;&#189;óê&#213;&#214;D&#182;&#207;

        HAL_NVIC_EnableIRQ(USART2_IRQn);                                        //ê1&#196;üUSART1&#214;D&#182;&#207;
        HAL_NVIC_SetPriority(USART2_IRQn,3,3);                                //&#199;à&#213;&#188;ó&#197;&#207;è&#188;&#182;3£&#172;×óó&#197;&#207;è&#188;&#182;3
#endif        
  RS485_TX_Set(0);                                        //éè&#214;&#195;&#206;a&#189;óê&#213;&#196;£ê&#189;        
}

//RS485·¢&#203;ílen&#184;&#246;×&#214;&#189;ú.
//buf:·¢&#203;í&#199;&#248;ê×μ&#216;&#214;·
//len:·¢&#203;íμ&#196;×&#214;&#189;úêy(&#206;aá&#203;oí±&#190;′ú&#194;&#235;μ&#196;&#189;óê&#213;&#198;¥&#197;&#228;,&#213;aà&#239;&#189;¨òé2&#187;òa3&#172;1y64&#184;&#246;×&#214;&#189;ú)
void RS485_Send_Data(u8 *buf,u8 len)
{
        RS485_TX_Set(1);                        //éè&#214;&#195;&#206;a·¢&#203;í&#196;£ê&#189;
        HAL_UART_Transmit(&USART2_RS485Handler,buf,len,500);
        RS485_RX_CNT=0;        
        RS485_TX_Set(0);                        //éè&#214;&#195;&#206;a&#189;óê&#213;&#196;£ê&#189;
}
//RS4852é&#209;ˉ&#189;óê&#213;μ&#189;μ&#196;êy&#190;Y
//buf:&#189;óê&#213;&#187;o′&#230;ê×μ&#216;&#214;·
//len:&#182;áμ&#189;μ&#196;êy&#190;Y3¤&#182;è
void RS485_Receive_Data(u8 *buf,u8 *len)
{
        
        u8 rxlen=RS485_RX_CNT;
        u8 i=0;
        *len=0;                                //&#196;&#172;è&#207;&#206;a0
        delay_ms(10);                //μè′y10ms,á&#172;D&#248;3&#172;1y10ms&#195;&#187;óD&#189;óê&#213;μ&#189;ò&#187;&#184;&#246;êy&#190;Y,&#212;òè&#207;&#206;a&#189;óê&#213;&#189;áê&#248;
        if(rxlen==RS485_RX_CNT&&rxlen)//&#189;óê&#213;μ&#189;á&#203;êy&#190;Y,&#199;ò&#189;óê&#213;íê3éá&#203;
        {
                for(i=0;i<rxlen;i++)
                {
                        buf=RS485_RX_BUF;        
                }               
                *len=RS485_RX_CNT;        //&#188;&#199;&#194;&#188;±&#190;′&#206;êy&#190;Y3¤&#182;è
                RS485_RX_CNT=0;                //&#199;&#229;á&#227;
        }
}
//RS485&#196;£ê&#189;&#191;&#216;&#214;&#198;.
//en:0,&#189;óê&#213;;1,·¢&#203;í.
void RS485_TX_Set(u8 en)
{
        PCF8574_WriteBit(RS485_RE_IO,en);
}

主函数:
int main(void)
{
    u8 key;
        u8 i=0,t=0;
        u8 cnt=0;
        u8 rs485buf[5];
    HAL_Init();                     //3&#245;ê&#188;&#187;ˉHAL&#191;a   
    Stm32_Clock_Init(360,25,2,8);   //éè&#214;&#195;ê±&#214;ó,180Mhz
    delay_init(180);                //3&#245;ê&#188;&#187;ˉ&#209;óê±oˉêy
    uart_init(115200);              //3&#245;ê&#188;&#187;ˉUSART
    LED_Init();                     //3&#245;ê&#188;&#187;ˉLED
    KEY_Init();                     //3&#245;ê&#188;&#187;ˉ°′&#188;ü
    SDRAM_Init();                   //3&#245;ê&#188;&#187;ˉSDRAM
    LCD_Init();                     //3&#245;ê&#188;&#187;ˉLCD
                RS485_Init(2500000);                        //3&#245;ê&#188;&#187;ˉRS485
          POINT_COLOR=RED;
        LCD_ShowString(30,50,200,16,16,"Apollo STM32F4/F7");
        LCD_ShowString(30,70,200,16,16,"RS485 TEST");        
          LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
        LCD_ShowString(30,110,200,16,16,"2016/1/16");                        
        LCD_ShowString(30,130,200,16,16,"KEY0:Send");        
        POINT_COLOR=BLUE;
        LCD_ShowString(30,150,200,16,16,"Count:");                        //&#207;&#212;ê&#190;μ±&#199;°&#188;&#198;êy&#214;μ        
        LCD_ShowString(30,170,200,16,16,"Send Data:");                //ìáê&#190;·¢&#203;íμ&#196;êy&#190;Y        
        LCD_ShowString(30,210,200,16,16,"Receive Data:");        //ìáê&#190;&#189;óê&#213;μ&#189;μ&#196;êy&#190;Y               
                                                                           
        while(1)
          {
                  key=KEY_Scan(0);
                  if(key==KEY0_PRES)  //KEY0°′&#207;&#194;,·¢&#203;íò&#187;′&#206;êy&#190;Y
                  {
                          for(i=0;i<5;i++)
                        
                                {
                                  rs485buf=cnt+i;        
                                  LCD_ShowxNum(30+i*32,190,rs485buf,3,16,0X80);            
                           }
                          RS485_Send_Data(rs485buf,5);
                  }        
                 RS485_TX_Set(0);
                 RS485_Receive_Data(rs485buf,&key);
                 if(key)
                  {
                           if(key>5)key=5;
                            for(i=0;i<key;i++)LCD_ShowxNum(30+i*32,230,rs485buf,3,16,0X80);        
                    }
                  t++;
                 delay_ms(100);

                 {
                         LED0=!LED0;
                         t=0;
                         cnt++;
                         LCD_ShowxNum(30+48,150,cnt,3,16,0X80);        
                 }                  
         }                     
}
图在另一个回复上

回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-6-4
在线时间
4 小时
 楼主| 发表于 2019-6-4 19:39:18 | 显示全部楼层
peng1554 发表于 2019-6-4 19:34
硬件接法没问题~~

代码我发出来了,大神您看看
回复

使用道具 举报

10

主题

83

帖子

0

精华

高级会员

Rank: 4

积分
924
金钱
924
注册时间
2016-3-21
在线时间
111 小时
发表于 2019-6-5 08:35:48 | 显示全部楼层
你可以看一下我这个帖子
http://www.openedv.com/forum.php ... id=92511&extra=
回复

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2019-7-23
在线时间
13 小时
发表于 2019-8-7 11:49:35 | 显示全部楼层
48454545
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2022-4-11
在线时间
0 小时
发表于 2022-4-11 10:25:30 | 显示全部楼层
俩个板子都下程序
回复

使用道具 举报

3

主题

15

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2022-3-29
在线时间
9 小时
发表于 2022-4-11 10:45:07 来自手机 | 显示全部楼层
可以两个板子分别和电脑先连接试试,看有什么问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-25 21:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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