芯查查logo
  • 物料选型
  • 数据服务
    1. 新产品
    2. 查替代
    3. 丝印反查
    4. 查品牌
    5. PCN/PDN
    6. 查方案
    7. 查代理
    8. 数据合作
  • SaaS/方案
      SaaS产品
    1. 供应链波动监测预警
    2. 半导体产业链地图
    3. 智能BOM管家
    4. 解决方案
    5. 汽车电子
    6. 政府机构
    7. 数据API
  • 商城
  • 行业资讯
    1. 资讯
    2. 直播
  • 论坛社区
    1. 论坛
    2. 学习
    3. 测评中心
    4. 活动中心
    5. 积分商城
  • 查一下
RA4L1-SENSOR+07:调试串口的不定长数据回传功能
原创 发布时间:09:26
版块:
瑞萨电子
简介:实现串口的不定长数据接收功能,并实现数据回传

一:本贴内容:

使用定时器的计数功能,用作串口的超时判断,实现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时候,意味着串口内不再接收到新的数据,软件判定一帧数据接收完成。最后将数据做回传处理,同时将接收的指针做清零处理。

四:实验图片;

开源社区
09:26
  • 举报
😁😂😃😄😅😆😉😊😋😌😍😏😒😓😔😖😘😚😜😝😞😠😡😢😣😤😥😨😩😪😫😭😰😱😲😳😵😷😸😹😺😻😼😽😾😿🙀🙅🙆🙇🙈🙉🙊🙋🙌🙍🙎🙏✂✅✈✉✊✋✌✏✒✔✖✨✳✴❄❇❌❎❓❔❕❗❤➕➖➗➡➰🚀🚃🚄🚅🚇🚉🚌🚏🚑🚒🚓🚕🚗🚙🚚🚢🚤🚥🚧🚨🚩🚪🚫🚬🚭🚲🚶🚹🚺🚻🚼🚽🚾🛀Ⓜ🅰🅱🅾🅿🆎🆑🆒🆓🆔🆕
@好友

全部评论

加载中
游客登录通知
已选择 0 人
自定义圈子
移动
发布帖子
发布动态
发布问答
发布者
聪聪哥哥
最新帖子
高压电机直接启动的危害及解决方案:软启动柜选型与应用指南RA4L1-SENSOR+07:调试串口的不定长数据回传功能RA4L1-SENSOR+06:串口的数据回传功能RA4L1-SENSOR+05:调试串口输出功能线性和半线性方案,解决小功率交流转5V的成本,性能,体积痛点
热门版块
查看更多
问型号
问技术
问行情
硬件资源下载区
汽车电子工程师论坛
工业电子专区
新手入门指南
专家问答
单片机/MCU论坛
PCB设计

点赞

收藏

分享

微信扫码
分享给好友

评论