OpenEdv-开源电子网

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

stm32F4移植ucosiii使用串口2 接收字符串,出现第二个字符丢失

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2019-7-6
在线时间
12 小时
发表于 2019-8-18 19:36:24 | 显示全部楼层 |阅读模式
在对串口2接收程序进行在ucosiii上移植时,发现发送给该串口的第二个字符会丢失。
程序的目的是使用串口二接收一个485端口发送出来的数据,对485信号进行了转ttl电平然后串口2接收,将接受到的字符存在一个数组中并对接收到的字符进行判断,若接收到指定字符如“EEE”则将这次接收到的字符串存放到消息队列中,等待任务处理。对接收到的字符串通过串口1打印出来发现,接收到的数据总丢失第二个字符,比如通过484端口发送字符串为“BEGABCDEFGEEE”,接收到的字符为“BGABCDEFGEEE”。以为是因为对结束字符判断中是“EEE”的原因才出错的,然后改为发送“ABCDEFGEEE”,接收到的数据仍然少第二个字符,为“ACDEFGEEE”。
还麻烦大家帮忙看看,如果描述不清楚,还希望大家谅解下,有不太清楚我的表述的还望在下面留言。谢谢了。
  1. 串口二中断处理代码:
  2. void USART2_IRQHandler(void)
  3. {
  4.         OS_ERR err;
  5.         static u8 mallocFlag=0;
  6.         static u8* pbuf=NULL;

  7.         static u8 RS485_RX_CNT=0;  //接收到的数据长度
  8.         OSIntEnter();
  9.         if(mallocFlag==0)
  10.         {
  11.                 mallocFlag=1;
  12.                 pbuf=mymalloc(SRAMIN,20);        //申请64个字节
  13.         }
  14.         if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//接收到数据
  15.         {                
  16.                 pbuf[RS485_RX_CNT++]=USART_ReceiveData(USART2);//;读取接收到的数据USART2->DR
  17.                
  18.                 if((pbuf[RS485_RX_CNT-1]=='E') & (pbuf[RS485_RX_CNT-2]=='E') & (pbuf[RS485_RX_CNT-3]=='E'))
  19.                 {
  20.                         pbuf[RS485_RX_CNT]='\0';  //在字符串末尾加上一个结束符
  21.                        
  22.                         //发送消息
  23.                         OSQPost((OS_Q*                )&RS485_Q,               
  24.     (void*                )pbuf,
  25.     (OS_MSG_SIZE)(RS485_RX_CNT+1),
  26.     (OS_OPT                )OS_OPT_POST_FIFO,
  27.     (OS_ERR*        )&err);                       

  28.                         if(err != OS_ERR_NONE)
  29.                         {
  30.                                 myfree(SRAMIN,pbuf);        //释放内存
  31.                         }
  32.                         mallocFlag=0;
  33.                         RS485_RX_CNT=0;
  34.                 }else if(RS485_RX_CNT==19){
  35.                         pbuf[RS485_RX_CNT]='\0';  //在字符串末尾加上一个结束符
  36.                         //发送消息
  37.                         OSQPost((OS_Q*                )&RS485_Q,               
  38.     (void*                )pbuf,
  39.     (OS_MSG_SIZE)RS485_RX_CNT,
  40.     (OS_OPT                )OS_OPT_POST_FIFO,
  41.     (OS_ERR*        )&err);
  42.                                        
  43.                         if(err != OS_ERR_NONE)
  44.                         {
  45.                                 myfree(SRAMIN,pbuf);        //释放内存
  46.                         }
  47.                         mallocFlag=0;
  48.                         RS485_RX_CNT=0;       
  49.                 }               
  50.         }
  51.         OSIntExit();       
  52. }
复制代码
  1. 消息处理代码(局部):
  2.                 u8 re_char[]="ABC";  //需要处理的字符串
  3.                 //请求消息
  4.                 p=OSQPend((OS_Q*                        )&RS485_Q,   
  5.     (OS_TICK                )200,
  6.     (OS_OPT                        )OS_OPT_PEND_BLOCKING,
  7.     (OS_MSG_SIZE*        )&size,               
  8.     (CPU_TS*                )0,
  9.     (OS_ERR*                )&err);
  10.                 if(p != NULL)
  11.                 {
  12.     USAR1_Send_Data((u8*)p,size); //将接受到的字符串发送到PC
  13.                        
  14.                         if( ( time_add=(strstr((char*)p,(char*)re_char)) ) !=NULL)  
  15.                         {
  16.                                
  17.     printf("时间设置不成功!\r\n");
  18.                         }
  19.                        
  20.     printf("没有正确的时间字符串头\r\n");
  21.    myfree(SRAMIN,p);        //释放内存
  22.    return ;
  23.                 }
复制代码
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10576
金钱
10576
注册时间
2017-2-18
在线时间
1915 小时
发表于 2019-8-19 18:55:48 | 显示全部楼层
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-13 18:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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