串口发送部分代码:

//通过信号量的方法发送数据
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. DG备库,实时应用如何判断,MR进程,及MRP应用归档,三种情况的查询及验证

    本篇文档学习,DG备库,实时应用如何判断,MR进程,及MRP应用归档,三种情况的查询及验证 1.取消MRP进程 备库查询进程状态select process,client_process,sequen ...

  2. Windows在当前目录打开cmd

    /********************************************************************** * Windows在当前目录打开cmd * 说明: * ...

  3. Angular 手动解析表达式

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  4. Unity3d mesh合并,网格合并具体用法教程

    Unity开发Mesh合并网格 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分 ...

  5. CSS使用方法

    CSS行内样式: 在开始标签内添加style样式属性 如:<p style="color:red;">内容</p> CSS内部样式: 内部样式(嵌入样式), ...

  6. 20155219 2016-2017-2 《Java程序设计》第4周学习总结

    20155219 2016-2017-2 <Java程序设计>第4周学习总结 教材学习内容总结 抽象方法与抽象类 如果某方法区块中没有任何程序代码操作,可以使用abstract在class ...

  7. 2018牛客27---D---愤怒: (有关子序列的dp问题)

    链接:https://www.nowcoder.com/acm/contest/188/D来源:牛客网 题目描述 小w很生气 小w有一个长为n的括号序列 愤怒小w想把这个括号序列分为两个括号序列 小w ...

  8. php-fpm的pool池子、php慢日志记录、open_basedir、php-fpm进程管理

    1.php-fpm的poo池子:目的:可以让不同的网站,对于不同的php解析,可以把不同的网站解析区分开.编辑:vim /usr/local/php5-fpm/etc/php-fpm.conf加入: ...

  9. Python学习之---Python中的内置函数(方法)(更新中。。。)

    add(item)   #将item添加到s中,如果item已经在s中,则无任何效果 break        #退出循环,不会再运行循环中余下的代码 bool()     #将参数转换为布尔型 by ...

  10. EnableAutoConfiguration注解的工作原理(org.springframework.boot.autoconfigure.EnableAutoConfiguration=core.bean.MyConfig)

    EnableAutoConfiguration注解的工作原理(org.springframework.boot.autoconfigure.EnableAutoConfiguration=core.b ...