一:本贴内容:
使用定时器的计数功能,用作串口的超时判断,实现PC端与单片机的不定长数据接收与返回功能。
二:瑞萨RA4L1的中断标志位如下所示:
typedef enum e_sf_event
{
UART_EVENT_RX_COMPLETE = (1UL << 0), ///< Receive complete event
UART_EVENT_TX_COMPLETE = (1UL << 1), ///< Transmit complete event
UART_EVENT_RX_CHAR = (1UL << 2), ///< Character received
UART_EVENT_ERR_PARITY = (1UL << 3), ///< Parity error event
UART_EVENT_ERR_FRAMING = (1UL << 4), ///< Mode fault error event
UART_EVENT_ERR_OVERFLOW = (1UL << 5), ///< FIFO Overflow error event
UART_EVENT_BREAK_DETECT = (1UL << 6), ///< Break detect error event
UART_EVENT_TX_DATA_EMPTY = (1UL << 7), ///< Last byte is transmitting, ready for more data
} uart_event_t;
如上图所示:有关串口接收的状态位,是串口接收完成一帧标志位如下:只有接收固定长度的数据字符才可以触发:
UART_EVENT_RX_COMPLETE
上面的状态,在串口接收的一个字符时候就会触发,串口可以实时的接收数据。
为了接收不定长的数据,我这里使用定时器的超时判断一帧数据是否完成,从而实现数据的接收。
三:代码的实现:
3.1 定义一些变量:
uint8_t usart9_flag =0 ;
uint8_t usart9_pack = 0;
uint8_t usart9_Recpoint = 0 ;
uint8_t usart9_Reclength = 0 ;
uint8_t usart9_Recbuffer[30] ;
uint8_t usart9_OverTime = 0 ; //
uint8_t usart9_dealbuffer[30] ;
3.2 重新编写串口9的发送函数:
void Dwin_Send_Example(uint8_t ch)
{
fsp_err_t err = FSP_SUCCESS;
err = R_SCI_UART_Write(&g_uart9_ctrl, (uint8_t *)&ch, 1);
if(FSP_SUCCESS != err) __BKPT();
while(g_data_transmit_flag == false);
g_data_transmit_flag = false;
}
void SendTestData(uint8_t ID)
{
volatile int i = 0 ;
for(i= 0 ;i < ID; i++)
{
Dwin_Send_Example(usart9_dealbuffer[i]);
}
}
3.3 定时器超时判断部分:
void System_Tim_Driver(char Tim_Intev)
{
switch(Tim_Intev)
{
case 1: if(usart9_flag == 1)
{
usart9_OverTime-- ;
if(usart9_OverTime < 1)
{
usart9_OverTime = 0 ;
usart9_flag =0 ;
usart9_pack =1 ;
memcpy(&usart9_dealbuffer[0],&usart9_Recbuffer[0],usart9_Reclength) ;
}
}
break;
case 2: LED2_TOGGLE;
break;
case 10: LED3_TOGGLE;
if(usart9_pack==1)
{
usart9_pack = 0 ;
usart9_Recpoint = 0 ;
SendTestData(usart9_Reclength);
}
break ;
default:break;
}
}
代码编写思路:
每当串口接收硬件物理地收到一个字节(并通常将其存入接收数据寄存器后),就会产生一次接收中断。
在中断服务函数需要立刻读取这个字节并存入接收的缓冲区(buffer里面,这里注意一下接收的长度,当超过接收数组的最大buffer时候,需要做错误处理)。
想要判断要完整接收一帧数据,需要在软件代码中做一下处理,我这里做的是超时判断,大体思路是:在串口接收中断中,给某个变量赋初值,
比如说:然后再定时器的处理函数中,将该值减小。同时将接收到的数据存入接收缓冲区内,当串口接收计时的数据减小到0时候,意味着串口内不再接收到新的数据,软件判定一帧数据接收完成。最后将数据做回传处理,同时将接收的指针做清零处理。
四:实验图片;


全部评论