ucossii队列_ucos-iii串口用信号量及环形队列中断发送,用内建消息队列中断接收例程...

本文介绍了如何在UCOS-III操作系统中,利用信号量和环形队列实现串口的中断发送与接收。发送部分通过阻塞型等待串口资源和发送信号量,实现数据入缓冲区并开启中断;接收部分在中断服务程序中,使用消息队列将接收到的数据发送到任务处理。文中还给出了具体的C代码实现,并提供了一个测试用例:发送HEX数据使LED0亮2S。
摘要由CSDN通过智能技术生成

串口发送部分代码:

[mw_shl_code=c,true]//通过信号量的方法发送数据

void usart1SendData(CPU_INT08U ch)

{

OS_ERR err;

CPU_INT08U isTheFirstCh;

OSSemPend(&Usart1Sem, 0, OS_OPT_PEND_BLOCKING, NULL, &err);//阻塞型等待串口发送资源

OSSemPend(&Usart1TxBufSem, 0, OS_OPT_PEND_BLOCKING, NULL, &err);//阻塞型等待发送

isTheFirstCh = 0;

if(pTxBufRead == pTxBufWrite){ //若读指针等于写指针,表明要写入缓冲区的为当前第一个数据

isTheFirstCh = 1; //置位第一个数据标志

}

*pTxBufWrite = ch;//向当前写指针对应的地址写入数据

if((pTxBufWrite++) == &Usart1TxBuf[USART1_TX_BUFFER_LEN - 1]){ //若当前写指针写到缓冲区最后一个地址,否则地址自增1

pTxBufWrite = Usart1TxBuf; //写指针更新为缓冲区第一个地址,环形队列

}

if(isTheFirstCh){ //写入的是第一个数据

USART_ITConfig(USART1, USART_IT_TXE, ENABLE);//开启缓冲区发送空中断,下一步将会进入中断处理数据

}

OSSemPost(&Usart1Sem, OS_OPT_POST_1, &err);

}[/mw_shl_code]

串口接收部分代码:

[mw_shl_code=c,true]//串口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 - 1]){ //读到最后一个字节

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, 1, OS_OPT_POST_FIFO, &err); //发送该字节所在缓冲区的地址到消息队列,等待任务处理

if((pRxBufWrite++) == &Usart1RxBuf[USART1_RX_BUFFER_LEN - 1]){ //若当前写指针写到缓冲区最后一个地址

pRxBufWrite = Usart1RxBuf; //写指针更新为缓冲区第一个地址,环形队列

}

}

OSIntExit(); //通知UCOS退出中断

}[/mw_shl_code]

例程为ucos-iii的,用mdk4.7创建,测试板为旗舰板,串口发送HEX:5A A5 06 83 60 00 01 00 01可以让LED0亮2S作为测试。有错漏麻烦大家跟帖指正,谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值