串口发送部分代码:

//通过信号量的方法发送数据
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. centos 安装thrift

    Thrift介绍 Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erl ...

  2. Python学习笔记第六周

    目录 一.基础概念 面向对象编程 1.面向对象的几个核心特点 1.class类 2.object对象 3.encapsulation封装 4.inheritance继承 5.polymorphism多 ...

  3. JAVA基础部分复习(六、常用关键字说明)

    /** * JAVA中常用关键字复习 * final * finalize * finally * * @author dyq * */ public class KeyWordReview exte ...

  4. [LeetCode&Python] Problem 541. Reverse String II

    Given a string and an integer k, you need to reverse the first k characters for every 2k characters ...

  5. Unity跳转场景进度条制作教程(异步加载)

    Unity跳转场景进度条制作 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享 ...

  6. arcgis server备份还原过程

    一.备份过程 1.找到已经安装的arcgis server安装目录,并找到备份工具: 2.快捷键win + R启动cmd,将备份工具文件拖入cmd窗口,enter 3. 通过backup.py脚本进行 ...

  7. centos7 启动mysql

    密码无法登录问题: 在my.cnf  中加一句   skip-grant-tables : 重启mysql服务: mysql -uroot -p: USE mysql ; 进入后,修改密码 .UPDA ...

  8. 【杭电OJ3938】【离线+并查集】

    http://acm.hdu.edu.cn/showproblem.php?pid=3938 Portal Time Limit: 2000/1000 MS (Java/Others)    Memo ...

  9. PureComponent的作用及一些使用陷阱

    默认渲染行为的问题 在React Component的生命周期中,有一个shouldComponentUpdate方法.这个方法默认返回值是true. 这意味着就算没有改变组件的props或者stat ...

  10. Java基础四(switch、数组、)

    1.流程控制语句switch2.数组3.随机点名器案例 ###01switch语句解构 * A:switch语句解构 * a:switch只能针对某个表达式的值作出判断,从而决定程序执行哪一段代码. ...