野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 19191|回复: 7

429开发板 485接口 发送与接收不一致

[复制链接]
发表于 2016-1-21 18:51:16 | 显示全部楼层 |阅读模式
本帖最后由 zzp1020 于 2016-1-21 18:54 编辑

1.jpg


485的波特率设置的是115200

485接口 A接A  B接B

发送端 是电脑  接收端是 板子

电脑通过USB转485 发送数据到板子   板子收到数据后  再通过RS232 发送数据回电脑

代码用的是官方例程" USART—485通信"  简单修改了一下

main.c  的代码

  1. /**
  2.   ******************************************************************************
  3.   * @file    main.c
  4.   * @author  fire
  5.   * @version V1.0
  6.   * @date    2015-xx-xx
  7.   * @brief   485通讯例程
  8.   ******************************************************************************
  9.   * @attention
  10.   *
  11.   * 实验平台:野火  STM32 F429 开发板
  12.   * 论坛    :http://www.firebbs.cn
  13.   * 淘宝    :http://firestm32.taobao.com
  14.   *
  15.   ******************************************************************************
  16.   */
  17.   
  18. #include "stm32f4xx.h"
  19. #include "./led/bsp_led.h"
  20. #include "./usart/bsp_debug_usart.h"
  21. #include "./485/bsp_485.h"
  22. #include "./key/bsp_key.h"

  23. static void Delay(__IO u32 nCount);

  24. /**
  25.   * @brief  主函数
  26.   * @param  无
  27.   * @retval 无
  28.   */
  29. int main(void)
  30. {

  31.         char *pbuf;
  32.         uint16_t len;
  33.        
  34.         LED_GPIO_Config();       
  35.        
  36.   /*初始化USART1*/
  37.   Debug_USART_Config();
  38.        
  39.         /*初始化485使用的串口,使用中断模式接收*/
  40.         _485_Config();
  41.        
  42.         LED_BLUE;
  43.        
  44.         Key_GPIO_Config();
  45.        
  46.         printf("\r\n 欢迎使用野火  STM32 F429 开发板。\r\n");
  47.   printf("\r\n 野火F429 485通讯实验例程\r\n");
  48.        
  49.         printf("\r\n 实验步骤:\r\n");

  50.         printf("\r\n 1.使用导线连接好两个485通讯设备\r\n");
  51.         printf("\r\n 2.使用跳线帽连接好:5v --- C/4-5V,485-D --- PD5,485-R ---PD6 \r\n");
  52.         printf("\r\n 3.若使用两个野火开发板进行实验,给两个开发板都下载本程序即可。\r\n");
  53.         printf("\r\n 4.准备好后,按下其中一个开发板的KEY1键,会使用485向外发送0-255的数字 \r\n");
  54.         printf("\r\n 5.若开发板的485接收到256个字节数据,会把数据以16进制形式打印出来。 \r\n");
  55.        
  56.   while(1)
  57.   {
  58.                 /*按一次按键发送一次数据*/
  59.                 if(        Key_Scan(KEY1_GPIO_PORT,KEY1_PIN) == KEY_ON)
  60.                 {
  61.                         uint16_t i;
  62.                        
  63.                         LED_BLUE;
  64.                        
  65.                         _485_TX_EN();
  66.                        
  67.                         for(i=0;i<=20;i++)
  68.                         {
  69.                         _485_SendByte(i);         //发送数据
  70.                         Delay(0xFFFf);
  71.                         }
  72.                        
  73.                         /*加短暂延时,保证485发送数据完毕*/
  74.                         Delay(0xFFF);
  75.                         _485_RX_EN();
  76.                        
  77.                         LED_GREEN;
  78.                        
  79.                         printf("\r\n发送数据成功!\r\n"); //使用调试串口打印调试信息到终端

  80.                 }
  81.                 else
  82.                 {               
  83.                         LED_BLUE;
  84.                        
  85.                         pbuf = get_rebuff(&len);
  86.                         if(len>=1)
  87.                         {
  88.                                 LED_GREEN;
  89.                                 _485_DEBUG_ARRAY((uint8_t*)pbuf,len);
  90.                                 clean_rebuff();
  91.                         }
  92.                 }
  93.   }

  94. }

  95. static void Delay(__IO uint32_t nCount)         //简单的延时函数
  96. {
  97.         for(; nCount != 0; nCount--);
  98. }

  99. /*********************************************END OF FILE**********************/
复制代码

bsp_485.h  的代码

  1. #ifndef __485_H
  2. #define        __485_H

  3. #include "stm32f4xx.h"
  4. #include <stdio.h>



  5. #define _485_USART                             USART2
  6. #define _485_USART_CLK                         RCC_APB1Periph_USART2
  7. #define _485_USART_BAUDRATE                    115200

  8. #define _485_USART_RX_GPIO_PORT                GPIOD
  9. #define _485_USART_RX_GPIO_CLK                 RCC_AHB1Periph_GPIOD
  10. #define _485_USART_RX_PIN                      GPIO_Pin_6
  11. #define _485_USART_RX_AF                       GPIO_AF_USART2
  12. #define _485_USART_RX_SOURCE                   GPIO_PinSource6

  13. #define _485_USART_TX_GPIO_PORT                GPIOD
  14. #define _485_USART_TX_GPIO_CLK                 RCC_AHB1Periph_GPIOD
  15. #define _485_USART_TX_PIN                      GPIO_Pin_5
  16. #define _485_USART_TX_AF                       GPIO_AF_USART2
  17. #define _485_USART_TX_SOURCE                   GPIO_PinSource5


  18. #define _485_RE_GPIO_PORT                                                                                                GPIOD
  19. #define _485_RE_GPIO_CLK                                                                                                RCC_AHB1Periph_GPIOD
  20. #define _485_RE_PIN                                                                                                                        GPIO_Pin_11

  21. #define _485_INT_IRQ                                                                 USART2_IRQn
  22. #define _485_IRQHandler                         USART2_IRQHandler


  23.         /// 不精确的延时
  24. static void _485_delay(__IO u32 nCount)
  25. {
  26.         for(; nCount != 0; nCount--);
  27. }


  28. /*控制收发引脚*/
  29. //进入接收模式,必须要有延时等待485处理完数据
  30. #define _485_RX_EN()                        _485_delay(1000); GPIO_ResetBits(_485_RE_GPIO_PORT,_485_RE_PIN);  _485_delay(1000);
  31. //进入发送模式,必须要有延时等待485处理完数据
  32. #define _485_TX_EN()                        _485_delay(1000); GPIO_SetBits(_485_RE_GPIO_PORT,_485_RE_PIN);  _485_delay(1000);



  33. /*debug*/

  34. #define _485_DEBUG_ON          1
  35. #define _485_DEBUG_ARRAY_ON   1
  36. #define _485_DEBUG_FUNC_ON    1
  37.    
  38.    
  39. // Log define
  40. #define _485_INFO(fmt,arg...)           printf("<<-_485-INFO->> "fmt"\n",##arg)
  41. #define _485_ERROR(fmt,arg...)          printf("<<-_485-ERROR->> "fmt"\n",##arg)
  42. #define _485_DEBUG(fmt,arg...)          do{\
  43.                                                                                                                                                                          if(_485_DEBUG_ON)\
  44.                                                                                                                                                                          printf("<<-_485-DEBUG->> [%d]"fmt"\n",__LINE__, ##arg);\
  45.                                                                                                                                                                  }while(0)

  46. #define _485_DEBUG_ARRAY(array, num)    do{\
  47.                                          int32_t i;\
  48.                                          uint8_t* a = array;\
  49.                                          if(_485_DEBUG_ARRAY_ON)\
  50.                                          {\
  51.                                             for (i = 0; i < (num); i++)\
  52.                                             {\
  53.                                                 printf("%x", (a)[i]);\
  54.                                             }\
  55.                                         }\
  56.                                        }while(0)

  57. #define _485_DEBUG_FUNC()               do{\
  58.                                          if(_485_DEBUG_FUNC_ON)\
  59.                                          printf("<<-_485-FUNC->> Func:%s@Line:%d\n",__func__,__LINE__);\
  60.                                        }while(0)


  61. void _485_Config(void);
  62. void _485_SendByte(  uint8_t ch );
  63. void _485_SendStr_length( uint8_t *str,uint32_t strlen );
  64. void _485_SendString(  uint8_t *str);



  65. void bsp_485_IRQHandler(void);
  66. char *get_rebuff(uint16_t *len);
  67. void clean_rebuff(void);
  68. #endif /* __485_H */
复制代码


哪位大神能告诉我  错在哪里啊??


回复

使用道具 举报

发表于 2016-1-21 19:15:44 | 显示全部楼层
  _485_DEBUG_ARRAY((uint8_t*)pbuf,len);

你这个函数调用的是printf函数,输出%x,发送的是ASCII码
你要想在上位机直接用hex查看,要直接调用串口usart send 函数,直接发送数据



回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-21 20:39:01 | 显示全部楼层
flyleaf 发表于 2016-1-21 19:15
_485_DEBUG_ARRAY((uint8_t*)pbuf,len);

你这个函数调用的是printf函数,输出%x,发送的是ASCII码

是用  USART_SendData  发送么?? 可是发送过去还是7F啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-22 09:48:08 | 显示全部楼层
哎哟 没人知道咋回事么??
回复 支持 反对

使用道具 举报

发表于 2016-1-22 10:28:17 | 显示全部楼层
zzp1020 发表于 2016-1-22 09:48
哎哟 没人知道咋回事么??

直接用工程里的485发送给上位机不正常吗?按那个按键就会发送0-19数据到远端了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-22 11:37:25 | 显示全部楼层
flyleaf 发表于 2016-1-22 10:28
直接用工程里的485发送给上位机不正常吗?按那个按键就会发送0-19数据到远端了

对啊  例程什么代码都不改  发给电脑都不对  按键 发送代电脑的数据就不正常  官方说 他们测试板子与板子之间 是正常的
回复 支持 反对

使用道具 举报

发表于 2016-1-22 13:47:10 | 显示全部楼层
zzp1020 发表于 2016-1-22 11:37
对啊  例程什么代码都不改  发给电脑都不对  按键 发送代电脑的数据就不正常  官方说 他们测试板子与板子 ...

可能跟你的usb转485工具有关吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-23 12:40:29 | 显示全部楼层
flyleaf 发表于 2016-1-22 13:47
可能跟你的usb转485工具有关吧

哎 算了  我想其他办法··USB转485是正常的  我在C51 上测试完全正常
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-1-11 11:51 , Processed in 0.037214 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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