stm32 串口通信数据移位寄存器_STM32串口接RS485丢码问题已解决*_*

static void Rs4851Send(unsigned char *p,unsigned char length)

{

///TIM_SetCounter(TIM(RS4851_TIM_NO),0X01);          //如果没有这句,下面延时程序会产生一帧数所结束中断(但实际数据还没发出去)

//现在可以不要了,因为在外部中断服备程序中添加,主要是那个原因

EnableRs4851Tx();        //20140903                                                        //使能485发送

DelayMs(2);

///TIM_SetCounter(TIM(RS4851_TIM_NO),0X01);          //如果没有这句,下面延时程序会产生一帧数所结束中断(但实际数据还没发出去)

//现在可以不要了,因为在外部中断服备程序中添加,主要是那个原因

Rs4851Mac.mRs485TxCount = length;

//Rs4851Mac.mPRs485Send = p;

ptmp = p;

USART_SendData(USART(RS4851_TX_PIN), *ptmp++);//*(Rs4851Mac.mPRs485Send)++);

USART_ITConfig(USART(RS4851_TX_PIN), USART_IT_TXE, ENABLE);                          //开始为发送中断

}

static void Rs4851SendIsr(void)

{

if(USART_GetITStatus(USART(RS4851_TX_PIN), USART_IT_TXE) != RESET)

{

Rs4851Mac.mRs485TxCount--;

if(Rs4851Mac.mRs485TxCount>0)                 //如果大于0,则数据没发送完,

{

USART_SendData(USART(RS4851_RX_PIN), *ptmp++);//*(Rs4851Mac.mPRs485Send)++);

}

if(Rs4851Mac.mRs485TxCount==1)                 //如果是最后一个数据

{

USART_ITConfig(USART(RS4851_RX_PIN), USART_IT_TXE, DISABLE);         //禁止发送中断

USART_ITConfig(USART(RS4851_TX_PIN), USART_IT_TC, ENABLE);                 //开启发送完成中断

}

}

if(USART_GetITStatus(USART(RS4851_TX_PIN), USART_IT_TC) != RESET)                          //如果是发送完成中断,

{

USART_ITConfig(USART(RS4851_RX_PIN), USART_IT_TC, DISABLE);                                //说明是最后一个数据,

delay_us(10);                                                                           //因为是等待发送完成,所以可以延时的时间短些

DisableRs4851Tx();                                                                //禁止485发送

}

TIM_SetCounter(TIM(RS4851_TIM_NO),0X01);          //如果没有这句,下面延时程序会产生一帧数所结束中断(但实际数据还没发出去)

//现在可以不要了,因为在外部中断服备程序中添加,主要是那个原因

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值