OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2084|回复: 6

UCOS iii 串口

[复制链接]

1

主题

4

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-1-18
在线时间
1 小时
发表于 2019-1-18 17:26:52 | 显示全部楼层 |阅读模式
void macUSART_INT_FUN(void)
{
OS_ERR   err;
char *   p_mem_blk;

OSIntEnter();                                    
p_mem_blk = OSMemGet((OS_MEM      *)&mem,       (OS_ERR      *)&err);
if ( USART_GetITStatus ( macUSARTx, USART_IT_RXNE ) != RESET )
{
  * p_mem_blk = USART_ReceiveData ( macUSARTx );     
  
  OSTaskQPost ((OS_TCB      *)&AppTaskTestTCB,     
         (void        *)p_mem_blk,            
         (OS_MSG_SIZE  )1,                    
         (OS_OPT       )OS_OPT_POST_FIFO,      
         (OS_ERR      *)&err);               
  
}
  OSIntExit();                                       
}

这是我的串口接收程序  ,每次接收一个直接就发信号出去。我该如何处理 收到一帧数据在发出去呢。我的裸机程序如下:
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
  USART1RxBuff[USART1RxBuffTrail]=(u8)(USART_ReceiveData(USART1));
  USART1RxBuffTrail++;
  USART1RxBuffTrail=USART1RxBuffTrail%MAX_BUSCOM_RX_BUFF;
}
}

void USART1_CheckRx(void)
{
u8 DataTemp;
if(USART1RxBuffHead^USART1RxBuffTrail)
{
  DataTemp=USART1RxBuff[USART1RxBuffHead];
  if (USART1FrameRxIndex == 0)
  {
      if (DataTemp == USART1_FRAME_HEAD)
   {
    USART1FrameRxBuff[USART1FrameRxIndex]=DataTemp;
    USART1FrameRxIndex++;
   }
  }
  else if(USART1FrameRxIndex == 1)
  {
   if(DataTemp<=MAX_BUSCOM_FRAME_RX_LEN)
   {
    USART1FrameRxBuff[USART1FrameRxIndex]=DataTemp;   
    USART1FrameRxIndex++;
   }
   else
   {
    USART1FrameRxIndex=0;
   }
  }
  else
  {
   if(USART1FrameRxIndex == (USART1FrameRxBuff[1]+1))
   {
    if(DataTemp==BusCom_GetCrc(&USART1FrameRxBuff[0],USART1FrameRxBuff[1]+1))
    {  
     USART1CountKey = USART1FrameRxBuff[2];
          USART_KEY_CTRL();
    }
    USART1FrameRxIndex=0;
   }
   else
   {
    USART1FrameRxBuff[USART1FrameRxIndex]=DataTemp;   
    USART1FrameRxIndex++;
   }
  }  
  USART1RxBuffHead++;
  USART1RxBuffHead=USART1RxBuffHead%MAX_BUSCOM_RX_BUFF;
}
}
  现在问题来了, 要是在UCOS 中断里面处理这段程序的话,时间太长, 肯定不行,如果每次都调用的话我又觉得不是是个很好的方案, 请问下有那位可以帮我向各解决方案吗~! 我对UCOS 不是很熟悉,谢谢


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4307
金钱
4307
注册时间
2018-6-30
在线时间
808 小时
发表于 2019-1-18 18:59:39 | 显示全部楼层
写成一个任务处理试下看看
业精于勤荒于嬉;行成于思毁于随!
回复 支持 反对

使用道具 举报

头像被屏蔽

18

主题

184

帖子

0

精华

禁止发言

积分
258
金钱
258
注册时间
2019-1-10
在线时间
10 小时
发表于 2019-1-19 16:35:56 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-1-18
在线时间
1 小时
 楼主| 发表于 2019-1-21 08:27:18 | 显示全部楼层
1208 发表于 2019-1-18 18:59
写成一个任务处理试下看看

写成任务也是一个字节一个 字节来  处理啊
回复 支持 反对

使用道具 举报

2

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
366
金钱
366
注册时间
2019-1-16
在线时间
101 小时
发表于 2019-1-21 08:45:37 来自手机 | 显示全部楼层
做个状态机
回复 支持 反对

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2019-1-21 09:34:20 | 显示全部楼层
使用USART+DMA啊
一分耕耘一分收获。
回复 支持 反对

使用道具 举报

5

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2015-3-2
在线时间
36 小时
发表于 2019-1-21 14:30:35 | 显示全部楼层
USART Idel中断+DMA啊
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-23 04:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表