OpenEdv-开源电子网

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

RS485发送和接收的问题。。谢

[复制链接]

21

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2012-8-28
在线时间
2 小时
发表于 2013-8-19 16:05:42 | 显示全部楼层 |阅读模式
请教下,两个STM32(STM32-RX和STM32-TX) 用RS485连接,其中一个STM32-RX
RS485 初始化为RX模式,接收另一个STM32-TX发来的数据,
STM32-RXmain函数大致如下,为什么在STM32-RX段发数据到STM32-TX正常,但是
在接收STM32-TX段发过来的数据时就会丢数据(我是按22个BYTE 一包发送的。),
当我在STM32-RX段里把TX部分mark掉后就能正常接收数据,
我想这是RS485半双工的问题,但是怎么解决呢。??
求大侠指教。。谢谢先。

PS:原子哥,弄个插入代码的嘛。。。
while(1)
{
        ...
        Class_Poll();
        Hc_Handle1();
        Hc_Handle2();

        m_poll();

        RS485_TX;                   //设为发送模式,
        uart_poll();                   //TX 部分
        uart_poll2();                    //TX部分

        MApi_Uart2Handler();
        RS485_RX;
        MApi_Uart2Via485RecHandler();//接收数据
        //RS485_TX;
  
        。。。。。
}



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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-19 17:28:01 | 显示全部楼层
回复【楼主位】lhchen922:
---------------------------------
TX,RX模式设置后,加一点点延时试试。
另外,你这种: MApi_Uart2Via485RecHandler,里面是死循环等待么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

21

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2012-8-28
在线时间
2 小时
 楼主| 发表于 2013-8-19 17:31:14 | 显示全部楼层
加延时了也不行。。
函数如下

/*****************************************************************************
 rototype : MApi_Uart2Via485RecHandler
 Description: uart2 via rs485 receive tx board rs232 data .
 Input     : void
 Output    : None
 Return Value: void
 Calls     :
 Called By :

  History     :
  1.Date      : 2013/8/10
    Author    : Corey.Chen
    Modification: Created function

*****************************************************************************/
void MApi_Uart2Via485RecHandler(void)
{
    byte rec_buf;
    byte i, j;
    while(1)
    {
        /* See if any byte in the fifo, if have, get the first byte, else
        return */
        //DIS_INT;
        //DIS_USART1_RX_INT();
        if (uart_rx_fifo.cnt == 0)
        {
            //EN_INT;
            //EN_USART1_RX_INT();
            break;
        }
        rec_buf = uart_rx_fifo.buf[uart_rx_fifo.out_pos];
        //PRINT_DATA("rec_buf is 0x%x..", rec_buf);
        EN_INT();
#if 0
USART_SendData(USART2, rec_buf);
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
USART_ClearFlag(USART2, USART_FLAG_TXE);
#endif
        uart_rx_fifo.out_pos++;
        uart_rx_fifo.out_pos = uart_rx_fifo.out_pos % UART1_FIFO_SIZE;
        uart_rx_fifo.cnt--;
/// EN_INT;

        /* Have data received, do something */
        switch (uart_poll_state)
        {
        case US_P_IDLE:

            if (rec_buf == U2_PAK_HEAD_1)
                uart_poll_state =  US_P_GET_HD1;
            break;

        case US_P_GET_HD1:
            if (rec_buf == U2_PAK_HEAD_2)
            {
                uart_poll_state = US_P_REC;
                buf_i = 0;
g_revComp = 0;
            }
            else
                uart_poll_state = US_P_IDLE;
            break;

        case US_P_REC:
            uart_rx_buf[buf_i++] = rec_buf;
#if 0
            USART_SendData(USART2, rec_buf);
            while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
            USART_ClearFlag(USART2, USART_FLAG_TXE);
#endif
            if (buf_i >= UART1_FIFO_DATA_SIZE)
                uart_poll_state = US_P_WAIT_END;
            break;
        case US_P_WAIT_END:
            if (rec_buf == U2_PAK_END)
            {
                /* get a good end byte of packet, a complete pkt is
                received , we can do something with this packet */
                do_uart_pkt();
                g_revComp = 1;
                //EN_USART1_RX_INT();
#if 0
                USART_SendData(USART2, rec_buf);
                while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
                USART_ClearFlag(USART2, USART_FLAG_TXE);
#endif

                uart_poll_state = US_P_IDLE;
                GPIO_CPLBits(GPIOB, GPIO_Pin_1);
            }
            else
            {
                /* get a bad end byte of packet, this packe is illegal, so
                we need find out that if there is another packet header in
                the buffer received, if have ,do another received process
                with the data follow the header in the uart_rx_buf[], which has
                received in last packet */
                for (i = 0; i < UART1_FIFO_DATA_SIZE - 1; i++)
                {
                    if ( (uart_rx_buf == U2_PAK_HEAD_1) &&
                            (uart_rx_buf[i + 1] == U2_PAK_HEAD_2) )
                    {
                        /* get another pkt header in the buf */
                        i = i + 2;
                        for (j = 0; j < (UART1_FIFO_DATA_SIZE - i); j++)
                            uart_rx_buf[j] = uart_rx_buf[i++];
                        uart_poll_state = US_P_REC;
                        buf_i = j;
                        break;
                    }
                }

                /* have found the pkt header */
                if (uart_poll_state == US_P_REC) break;

                /* if the last bit in the buf is U_PAK_HEAD_1 */
                if (uart_rx_buf[UART1_FIFO_DATA_SIZE - 1] == U2_PAK_HEAD_1)
                    uart_poll_state = US_P_GET_HD1;
                else uart_poll_state = US_P_IDLE;
            }
            break;

        default:
            uart_poll_state = US_P_IDLE;
        }
    }
}
回复 支持 反对

使用道具 举报

21

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2012-8-28
在线时间
2 小时
 楼主| 发表于 2013-8-19 17:32:40 | 显示全部楼层
回复【3楼】lhchen922:

加延时了也不行。。
在这个函数里因为我使用了状态机,所以是个while 1循环,
函数如下
/*****************************************************************************
 rototype : MApi_Uart2Via485RecHandler
 Description: uart2 via rs485 receive tx board rs232 data .
 Input     : void
 Output    : None
 Return Value: void
 Calls     :
 Called By :
  History     :
  1.Date      : 2013/8/10
    Author    : Corey.Chen
    Modification:
......
---------------------------------
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-20 00:10:04 | 显示全部楼层
哦,那建议你还是单独代码实现最底层的数据通信先。
别加其他东西。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-14 22:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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