OpenEdv-开源电子网

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

freemodbus 485通讯会通不上 232正常

[复制链接]

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2017-8-30
在线时间
36 小时
发表于 2020-5-18 17:38:10 | 显示全部楼层 |阅读模式
25金钱
在线提问  freemodbus 485通讯开机的时候也能通上 但是过一段时间就不行了 使能脚也已经加上,要是485断开就都通不上,重新开机又能通上 但是过段时间不行,232正常
/* ----------------------- Start implementation -----------------------------*/
/**
  * @brief  控制接收和发送状态
  * @param  xRxEnable 接收使能、
  *         xTxEnable 发送使能
  * @retval None
  */
void
vMBPortSerialEnable( BOOL xRxEnable, BOOL xTxEnable )
{
    /* If xRXEnable enable serial receive interrupts. If xTxENable enable启用串口接收中断。如果xTxENable启用
     * transmitter empty interrupts.发送机空中断
     */      
        if(xRxEnable)
  {
                __HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE);   //使能接收和接收中断
                HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);      
                #if EN_USART1_RX==1                                                                         //MAX485操作 低电平为接收模式
                UART1_RX_MODE();
                #endif
//   printf("xRxEnable\n");
        }
  else
  {
                __HAL_UART_DISABLE_IT(&huart2,UART_IT_RXNE);
                HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);      
                #if EN_USART1_RX==1                                                                     //MAX485操作 高电平为发送模式
                UART1_TX_MODE();
                #endif
//  printf("xRxEEEE\n");
        }
  if(xTxEnable)
  {   
                __HAL_UART_ENABLE_IT(&huart2,UART_IT_TXE);  //使能发送完成中断      
        }
  else
  {   
          __HAL_UART_DISABLE_IT(&huart2,UART_IT_TXE);     //禁止发送完成中断
  }
}

/**
  * @brief  串口初始化
  * @param  ucPORT      串口号
  *         ulBaudRate  波特率
  *         ucDataBits  数据位
  *         eParity     校验位
  * @retval None
  */
BOOL
xMBPortSerialInit( UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, eMBParity eParity )
{  
        static  uint32_t  ePar_ity;      
        (void)ucPORT;     //不修改串口
  (void)ucDataBits; //不修改数据位长度
        if (eParity ==MB_PAR_NONE)                                          //校验格式
        {
                ePar_ity= UART_PARITY_NONE;
        }else if (eParity ==MB_PAR_ODD)                                                
  {
                ePar_ity= UART_PARITY_ODD;
        }else if (eParity ==MB_PAR_EVEN)      
        {
          ePar_ity=UART_PARITY_EVEN;                       
  }                                                
        MX_USART2_UART_Init((uint32_t) ulBaudRate,ePar_ity);
  return TRUE;
}
/**
  * @brief  通过串口发送数据
  * @param  None
  * @retval None
  */
BOOL
xMBPortSerialPutByte( CHAR ucByte )
{
  /* Put a byte in the UARTs transmit buffer. This function is called在UARTs传输缓冲区中放置一个字节。这个函数被调用
   * by the protocol stack if pxMBFrameCBTransmitterEmpty( ) has been按照协议栈,如果pxMBFrameCBTransmitterEmpty( )已经发送数据
   * called. */

        #if EN_USART1_RX==1
        UART1_TX_MODE();
        #endif
        if(HAL_UART_Transmit(&huart2,(uint8_t*)&ucByte,1,0x05)!=HAL_OK)  //发送数据
  return FALSE;
  else
  return TRUE;
}
/**
  * @brief  从串口获得数据
  * @param  None
  * @retval None
  */
BOOL
xMBPortSerialGetByte( CHAR * pucByte )
{
  /* Return the byte in the UARTs receive buffer. This function is called将字节返回到UARTs receive接收缓冲区
   * by the protocol stack after pxMBFrameCBByteReceived( ) has been called.
   */      
        /**pucByte = USART_ReceiveData(USART1); */

        #if EN_USART1_RX==1
        UART1_RX_MODE();
        #endif         
        if(HAL_UART_Receive(&huart2,(uint8_t*)pucByte,1,0x05)!=HAL_OK)  //接收数据
  return FALSE;
  else
        return TRUE;
}
/* Create an interrupt handler for the transmit buffer empty interrupt
* (or an equivalent) for your target processor. This function should then
* call pxMBFrameCBTransmitterEmpty( ) which tells the protocol stack that
* a new character can be sent. The protocol stack will then call
* xMBPortSerialPutByte( ) to send the character.
*/
void prvvUARTTxReadyISR( void )
{      
  //pxMBFrameCBTransmitterEmpty = xMBRTUTransmitFSM //mb.c eMBInit函数中
  pxMBFrameCBTransmitterEmpty();  //发送状态机
}
/* Create an interrupt handler for the receive interrupt for your target
* processor. This function should then call pxMBFrameCBByteReceived( ). The
* protocol stack will then call xMBPortSerialGetByte( ) to retrieve the
* character.
*/
void prvvUARTRxISR( void )
{
  //pxMBFrameCBByteReceived = xMBRTUReceiveFSM        //mb.c eMBInit函数中
  pxMBFrameCBByteReceived();  //接收状态机
}


/**
  * @brief  USART1中断服务函数
  * @param  None
  * @retval None
*/

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

使用道具 举报

0

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2018-12-27
在线时间
0 小时
发表于 2020-5-18 17:38:13 | 显示全部楼层
回复

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2017-8-30
在线时间
36 小时
 楼主| 发表于 2020-5-18 19:03:04 来自手机 | 显示全部楼层
顶顶,有知道的大神回复下
回复

使用道具 举报

4

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2020-5-14
在线时间
18 小时
发表于 2020-5-18 21:14:43 | 显示全部楼层
帮顶
!!!!!!!
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2020-5-18 22:44:53 来自手机 | 显示全部楼层
多半使能脚没控制好,不受控制了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2020-5-19 01:12:49 | 显示全部楼层
帮顶
回复

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2017-8-30
在线时间
36 小时
 楼主| 发表于 2020-5-19 20:04:43 来自手机 | 显示全部楼层
顶顶顶顶顶
回复

使用道具 举报

31

主题

158

帖子

0

精华

高级会员

Rank: 4

积分
738
金钱
738
注册时间
2020-4-30
在线时间
111 小时
发表于 2020-6-20 18:04:15 | 显示全部楼层
111111111111111111111111111111
回复

使用道具 举报

11

主题

2149

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4930
金钱
4930
注册时间
2015-1-10
在线时间
618 小时
发表于 2020-6-22 16:41:00 | 显示全部楼层
要不花点钱用自动收发切换的485片子吧
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-16 17:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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