调试485通信时掉进去的坑

最近灯光控制项目,通过485与墙板进行通信。此文记录调试这个485时掉过的坑

485端口初始化:

 

#define DEV_BUS_BAUD    1200
#define CTRL_LINKDIR            GPIO_TO_PIN(PORTB, PIN4)
/** ****************************************************************************
 * @brief        初始化串口
 * @param[in]    comm:串口号
 * @param[in]    baudrate:波特率
 ***************************************************************************** */
void UART_Init(BYTE uart_port, UINT baudrate, UINT rs485_flag, PCBRecv pFunc)
{
    UART_CONFIG uart_config;
    struct serial_rs485 config_of_485;
    LINUX_UART *UARTx;

    if (uart_port >= SYS_UART_DEV_NUM || pFunc == NULL)
    {
        PRINT_LOG("Uart initial para error.\n");

        return;
    }

    g_pFunc[uart_port] = pFunc;

    uart_config.Baud_rate = baudrate;
    uart_config.Databits  = UART_DATABIT_8;
    uart_config.Parity    = UART_PARITY_NONE;
    uart_config.Stopbits  = UART_STOPBIT_1;

    uart_config.PCBRecv_Priority = 0;

    UART_Config(uart_port, &uart_config);

    if(rs485_flag == RS485_ON)
    {
        UARTx = GetUartHandle(uart_port);
        config_of_485.flags = SER_RS485_ENABLED | SER_RS485_RTS_ON_SEND;
        config_of_485.delay_rts_before_send = 0;  //发送前延时0ms
        config_of_485.delay_rts_after_send = 20;  //发送后延时20ms
        ioctl(UARTx->fd, TIOCSRS485, (unsigned long)&config_of_485);
    }
}

void ExDev_Init(PCBExdevDataIn pfunc)
{

    UINT BusBaudRate;

    BusBaudRate = ExDev_Get_WallBorad_Baud(g_ConfigData.BusType);
    if(BusBaudRate == 0)
    {
        BusBaudRate = DEV_BUS_BAUD;
    }
    PRINT_LOG("BusType =%d,BusBaudRate=%d\n",g_ConfigData.BusType,BusBaudRate);
    UART_Init(DEV_BUS_PORT, BusBaudRate, RS485_ON, Exdev_Bus_RecvHandle);

    Drv_GPIOSet(CTRL_LINKDIR, CTRL_DMXRX); //墙板使能接收

    Sys_CreateTask(TASK_ID_VOD, Exdev_Bus_Thread, 0);  //接收的数据处理线程
}

通过485发送数据:

UINT ExDev_WallBorad_SendCode(USHORT keyvalue)
{
    BYTE BusCode[MAX_BUS_DATA_LEN];
    BYTE BusCodeLen;
    BYTE i;
    memset(BusCode,0,sizeof(BusCode));
    Drv_GPIOSet(CTRL_LINKDIR, CTRL_DMXTX);  
    BusCodeLen = Get_WallBorad_Code(BusCode,keyvalue);
    if(BusCodeLen>0)
    {
        RS485_Bus_SendBuff(BusCode,BusCodeLen);
        /********************/
        PRINT_LOG("ExDev_WallBorad_SendCode:");
        for(i=0;i<BusCodeLen;i++) 
        {
            PRINT_LOG("%02x ",BusCode[i]);
        }
        PRINT_LOG("\n");
        /********************/
    }
    else
    {
        PRINT_LOG("BusCode BusCodeLen =0  keyvalue = %d\n",keyvalue);
    }
//    DelayMs(20);
    Drv_GPIOSet(CTRL_LINKDIR, CTRL_DMXRX);  墙板使能接收
    return ERR_NULL;
}

遇到的坑:

1、调试过程中发现发送出去的数据总是不正确;摸索了很久,发现数据发送时,将要发送的数据传递给内核,然而内核还没有将数据发送完成,就立即将使能gpio置为接收状态,导致数据发送失败。发数据后延时20ms,在将gpio置为接收状态,发送数据就正常啦。

2、接收墙板发的数据是没问题,一切正常。但是接收串口助手发送的数据就不正常了,总是有丢数据:

调试把串口初始化时的485开关关闭就正常了

UART_Init(DEV_BUS_PORT, BusBaudRate, RS485_OFF, Exdev_Bus_RecvHandle);

 

 

 

 

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诺水城子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值