IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 【MCU】一种基于RTOS的无应答重发机制 -> 正文阅读

[Java知识库]【MCU】一种基于RTOS的无应答重发机制

一、背景描述

? 在微控制器之间进行数据通信时,大多需要添加无应答重发机制,以增强数据交互和通信的稳定性。

在使用UART通信的双方设备,当一次数据传输发起后,数据传输方需要再次接收到数据接收方反馈的数据(可以称之为应答数据)后,再停止发送重复的数据。这就相当于通信双方的一个监听“心跳”,维持着通信的稳定和健壮性,当然,通信的稳定性受多方面的影响,本文不考虑过多的因素。那么,在基于RTOS的嵌入式微控制器软件的设计过程中,如何来实现UART通信双方无应答重发机制呢。本文就这个话题,分享两种基于RTOS的无应答重发机制。

? 文本以rt-thread操作系统作为RTOS基建,其他RTOS类似,本文的代码实现主要依赖于操作系统下的一些线程同步、或者定时器机制。

二、结构框图

请添加图片描述

三、基于RTOS的信号量的实现

(3-1)思路描述

? 通过定义一个无应答重发信号量,在发送线程函数中执行无应答重发操作,并接收无应答重发信号量,当没有接收到无应答重发信号量,则重新发起数据重发操作;在接收线程中接收应答码,如果接收到应答码,则发送信号量,如果接收线程接收到了信号量,则结束无应答重发操作。

(3-2)步骤
(3-2-1)定义无应答重发信号量
 /* 定义无应答重发信号量 */
static struct rt_semaphore no_Ask_resend_sem ;      
(3-2-2)定义发送线程入口
static void sendThreadEntry(void *parameter)
{
    while(1)
    {
        if(/* 是否接收到数据 */)
        {
            /* 无应答重发 */
            while(1)
            {
                /* 发送数据 */
               rt_device_write(/* 省略 */));
               
               if(rt_sem_take(&no_Ask_resend_sem, 1000) == RT_OK)
               {
                   break;/* 跳出循环 ,结束数据发送 */
               } 
                
               rt_thread_mdelay(1);
            }
            
        }
        rt_thread_mdelay(1);
    }    
}
(3-2-3)定义接收线程入口
static void recvThreadEntry(void *parameter)
{
    while(1)
    {
		......
        if(/* 解析到应答码 */)
        {
            /* 释放信号量 */
            rt_sem_release(&no_Ask_resend_sem);
        } 
   	    .......
            
        rt_thread_mdelay(1);
    }
}

四、基于定时器的实现

(4-1)思路描述

? 创建一个无应答重发定时器。在发送线程中,当执行数据发送后,随后启动无应答重发定时器(在定时器超时处理函数中执行数据发送操作)。在接收线程中,解析是否接收到了的应答码,如果接收到了应答码,则停止无应答重发定时器。

(4-2)步骤
(4-2-1)创建定时器
/* 创建定时器 */
 rt_timer_init(&no_Ask_resend_timer,"no_Ask_send_timer", /* 定义同时期超时处理函数为no_ask_handler */
           no_ask_handler, RT_NULL, NO_ASK_TIME_OUT_PERIOD, RT_TIMER_FLAG_HARD_TIMER);

(4-2-2)定义定时器超时处理函数
/* 定时器超时处理函数 */
static void no_ask_handler(void *parameter)
{
    static rt_uint8_t times = 0;

    times ++;

    if(times > 5)
    {
        times = 0;
    }

    /* 重复发送 */
    com_send_Data(control_code);
}
(4-2-3)定义发送线程入口
/* 发送线程中启动定时器 ,执行超时(时间长短可配置)重发操作,*/
static void rs232_tx_thread_entry()
{
    while (1)
    {
        if (/* 数据 */)
        {
            /* 发送数据 */
            rt_device_write(serial,0,buf,4);

            /* 开始无应答重发操作 */
            rt_timer_start(&no_Ask_resend_timer);
        }

        rt_thread_mdelay(1);
    }
}

(4-2-4)定义接收线程入口
/* 接收线程解析应答码 */
static void rs232_rx_thread_entry()
{
    while (1)
    {
		......
        if(/* 解析到应答码 */)
        {
            /* 停止无应答重发操作 */
             rt_timer_stop(&no_Ask_resend_timer);
        }
        ......
    }
}

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-12-14 15:48:10  更:2021-12-14 15:50:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:27:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码