大家好,我在调试串口的时候听到一个大牛说利用串口中断的方式发送数据会大大节省CPU时间,但是,我感觉在某些场合这个方法不是很好用,请大神们赐教
先说一下我的思路,我使用单片机STM32F051R8T6,为串口发送数据分配50字节的缓冲区Buffer[50],定义了三个指针分别为RR->start指向帧头,RR->stop指向帧尾,RR->point始终指向Buffer[0];根据FIFO原则,
发送函数:
void SendData(uint8_t byte)
{
*RR->stop=byte; //存入缓冲区
RR->stop++; //当前指针+1
if (RR->stop>=(RR->point+50)) //已经存到Buffer[49],重新存到Buffer[0],环形嘛。。。
{
RR->stop=RR->point; //循环
}
USART_ITConfig (USART2,USART_IT_TXE,ENABLE); //开中断
}
中断发送函数
void USART2_IRQHandler (void)
{
if(USART_GetITStatus(USART2, USART_IT_TXE) != RESET) //标志位
{
if (RR->start!=RR->stop) //缓冲区内没发送完
{
USART2->TDR=*RR->start; //从帧头开始发送,先出
RR->start++; //帧头指针+1
if (RR->start>=(RR->point+50)) //循环
{
RR->start=RR->point;
}
}
else
{
USART_ITConfig (USART2,USART_IT_TXE,DISABLE); //关中断
}
}
}
但是这样的话,会遇到一个问题,调用SenData()的时候会一直向缓冲区内写数据(写数据几乎瞬间完成),如果来不及发送的话,缓冲区内的数据可能会被覆盖,我在9600波特率试了一下,发送一个字节差不多1ms,这样的话,如果发送50个字节在50ms内再发送别的字节,数据就可能丢了,在不能确定下次发送时间的情况,大神们有什么好的方法吗?
小弟初来咋到,分数不多,请大神们不吝赐教。
|