串口发送部分代码:

//通过信号量的方法发送数据
void usart1SendData(CPU_INT08U ch)
{
OS_ERR err;
CPU_INT08U isTheFirstCh; OSSemPend(&Usart1Sem, , OS_OPT_PEND_BLOCKING, NULL, &err);//阻塞型等待串口发送资源
OSSemPend(&Usart1TxBufSem, , OS_OPT_PEND_BLOCKING, NULL, &err);//阻塞型等待发送
isTheFirstCh = ;
if(pTxBufRead == pTxBufWrite){ //若读指针等于写指针,表明要写入缓冲区的为当前第一个数据
isTheFirstCh = ; //置位第一个数据标志
}
*pTxBufWrite = ch;//向当前写指针对应的地址写入数据
if((pTxBufWrite++) == &Usart1TxBuf[USART1_TX_BUFFER_LEN - ]){ //若当前写指针写到缓冲区最后一个地址,否则地址自增1
pTxBufWrite = Usart1TxBuf; //写指针更新为缓冲区第一个地址,环形队列
}
if(isTheFirstCh){ //写入的是第一个数据
USART_ITConfig(USART1, USART_IT_TXE, ENABLE);//开启缓冲区发送空中断,下一步将会进入中断处理数据
}
OSSemPost(&Usart1Sem, OS_OPT_POST_1, &err);
}

串口接收部分代码:

//串口1中断处理程序
void USART1_IRQHandler(void) //串口1中断服务程序
{
OS_ERR err;
OSIntEnter(); //通知UCOS进入中断
//发送缓冲区空中断
if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) {
USART_SendData(USART1, *pTxBufRead);//向串口发送缓冲区写入一个字节
if((pTxBufRead++) == &Usart1TxBuf[USART1_TX_BUFFER_LEN - ]){ //读到最后一个字节
pTxBufRead = Usart1TxBuf; //移动读指针到第首地址
}
if(pTxBufRead == pTxBufWrite){ //若读写指针相等,表明本次缓冲区数据已经读完
USART_ITConfig(USART1, USART_IT_TXE, DISABLE);//关闭中断
}
OSSemPost(&Usart1TxBufSem, OS_OPT_POST_1, &err); //释放缓冲区信号量
}
//串口接收到数据中断
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){
*pRxBufWrite = USART_ReceiveData(USART1); //读取一个字节到缓冲区
OSTaskQPost(&Usart1RxTaskTCB, pRxBufWrite, , OS_OPT_POST_FIFO, &err); //发送该字节所在缓冲区的地址到消息队列,等待任务处理
if((pRxBufWrite++) == &Usart1RxBuf[USART1_RX_BUFFER_LEN - ]){ //若当前写指针写到缓冲区最后一个地址
pRxBufWrite = Usart1RxBuf; //写指针更新为缓冲区第一个地址,环形队列
}
}
OSIntExit(); //通知UCOS退出中断
}

例程:

http://www.openedv.com/forum.php?mod=attachment&aid=Njg0MnxmMzFkMzdmN3wxNTQ1MDQ0NjE5fDB8MzM2MTE%3D

ucos-iii串口用信号量及环形队列中断发送,用内建消息队列中断接收的更多相关文章

  1. UCOSIII内建消息队列

    使能内建消息队列 将OS_CFG_TASK_Q_EN置1 API函数 #if OS_CFG_TASK_Q_EN > 0u //删除 OS_MSG_QTY OSTaskQFlush (OS_TCB ...

  2. XP局域网内专用消息队列

    网上能找到DELPHI消息队列的方法,在XP下试了总是不成功,后来在2003上试就行了,对比发现消息队列属性->安全 2003中多了个用户ANONYMOUS_LOGON. 然后在XP下消息队列属 ...

  3. skynet源代码学习 - 从全局队列中弹出/压入一个消息队列过程

    学习云风的skynet源代码,简单记录下. void skynet_globalmq_push(struct message_queue * queue) { struct global_queue ...

  4. 获取和设置消息队列的属性msgctl,删除消息队列

    消息队列的属性保存在系统维护的数据结构msqid_ds中,用户可以通过函数msgctl获取或设置消息队列的属性. int msgctl(int msqid, int cmd, struct msqid ...

  5. RabbitMQ消息队列入门(一)——RabbitMQ消息队列的安装(Windows环境下)

    一.RabbitMQ介绍1.RabbitMQ简介RabbitMQ是一个消息代理:它接受和转发消息.你可以把它想象成一个邮局:当你把你想要发布的邮件放在邮箱中时,你可以确定邮差先生最终将邮件发送给你的收 ...

  6. 【消息队列】windows下安装RabbitMQ消息队列服务器

    RabbitMQ是什么 ? RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. 1:安装RabbitMQ需要先安装Erla ...

  7. μC/OS-III---I笔记9---任务等待多个内核对象和任务内建信号量与消息队列

    在一个任务等待多个内核对象在之前,信号量和消息队列的发布过程中都有等待多个内核对象判断的函数,所谓任务等待多个内核对象顾名思义就是一任务同时等待多个内核对象而被挂起,在USOC-III中一个任务等待多 ...

  8. 1-关于单片机通信数据传输(中断发送,大小端,IEEE754浮点型格式,共用体,空闲中断,环形队列)

    补充: 程序优化 为避免普通发送和中断发送造成冲突(造成死机,复位重启),printf修改为中断发送 写这篇文章的目的呢,如题目所言,我承认自己是一个程序猿.....应该说很多很多学单片机的对于... ...

  9. 【LINUX/UNIX网络编程】之使用消息队列,信号量和命名管道实现的多进程服务器(多人群聊系统)

    RT,使用消息队列,信号量和命名管道实现的多人群聊系统. 本学期Linux.unix网络编程的第三个作业. 先上实验要求: 实验三  多进程服务器 [实验目的] 1.熟练掌握进程的创建与终止方法: 2 ...

随机推荐

  1. Spring Boot 揭秘与实战(二) 数据缓存篇 - Guava Cache

    文章目录 1. Guava Cache 集成 2. 个性化配置 3. 源代码 本文,讲解 Spring Boot 如何集成 Guava Cache,实现缓存. 在阅读「Spring Boot 揭秘与实 ...

  2. [转]SSH反向连接及Autossh

    http://www.cnblogs.com/eshizhan/archive/2012/07/16/2592902.html SSH反向连接及Autossh 0.接触Linux恐怕对SSH再熟悉不过 ...

  3. 2.23 js处理日历控件(修改readonly属性)

    2.23 js处理日历控件(修改readonly属性) 前言    日历控件是web网站上经常会遇到的一个场景,有些输入框是可以直接输入日期的,有些不能,以我们经常抢票的12306网站为例,详细讲解如 ...

  4. 第一篇 make与makefile介绍

    我们在Linux系统中学习C语言或者C++语言时,大多数时候只是用gcc命令或者g++命令在命令行进行简单的编译.链接即可得到最终的可执行文件,进一步即可验证所写C/C++语言的正确性.但是,在大型工 ...

  5. 了解Git的工作区和暂存区

    Git有工作区,暂存区之分. 1.工作区 我们电脑上的某个被Git管理的文件夹,就是一个工作区. 比如说我的GitWorkText文件夹,如图: 2.版本库(Repository) 在工作区有一个隐藏 ...

  6. 对于vs出现“This function or variable may be unsafe”

    1.项目上右击选择“属性” 2.选择C/C++ ->预处理器 ->预处理器定义 3.添加一行  _CRT_SECURE_NO_WARNINGS 4.点击确定,重新编译成功.

  7. Mysql的两种引擎

    Innodb引擎: 1.Innodb引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别 2.该引擎还提供了行级锁和外键约束,它的设计目标是处理大容量数据库系统,它本身其实就是基于 ...

  8. wireshark显示过滤器的几种用法(转自他人博客)

    本文章转自:http://blog.51cto.com/houm01/1872652 几种条件操作符 ==   eq    等于    ip.addr == 192.168.0.1   ip.addr ...

  9. 求两个数之间的质数 -----------基于for循环 算法思想

    前端代码: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.as ...

  10. jsp页面继承

    功能类似 django template 中的  extends 功能 使用 1.需要下载rapid-core-4.0.jar    导入到web-inf下lib中   下载地址   http://w ...