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); //如果没有这句,下面延时程序会产生一帧数所结束中断(但实际数据还没发出去)
//现在可以不要了,因为在外部中断服备程序中添加,主要是那个原因
}