新手上路
- 积分
- 48
- 金钱
- 48
- 注册时间
- 2019-7-6
- 在线时间
- 12 小时
|
在对串口2接收程序进行在ucosiii上移植时,发现发送给该串口的第二个字符会丢失。
程序的目的是使用串口二接收一个485端口发送出来的数据,对485信号进行了转ttl电平然后串口2接收,将接受到的字符存在一个数组中并对接收到的字符进行判断,若接收到指定字符如“EEE”则将这次接收到的字符串存放到消息队列中,等待任务处理。对接收到的字符串通过串口1打印出来发现,接收到的数据总丢失第二个字符,比如通过484端口发送字符串为“BEGABCDEFGEEE”,接收到的字符为“BGABCDEFGEEE”。以为是因为对结束字符判断中是“EEE”的原因才出错的,然后改为发送“ABCDEFGEEE”,接收到的数据仍然少第二个字符,为“ACDEFGEEE”。
还麻烦大家帮忙看看,如果描述不清楚,还希望大家谅解下,有不太清楚我的表述的还望在下面留言。谢谢了。
- 串口二中断处理代码:
- void USART2_IRQHandler(void)
- {
- OS_ERR err;
- static u8 mallocFlag=0;
- static u8* pbuf=NULL;
- static u8 RS485_RX_CNT=0; //接收到的数据长度
- OSIntEnter();
- if(mallocFlag==0)
- {
- mallocFlag=1;
- pbuf=mymalloc(SRAMIN,20); //申请64个字节
- }
- if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//接收到数据
- {
- pbuf[RS485_RX_CNT++]=USART_ReceiveData(USART2);//;读取接收到的数据USART2->DR
-
- if((pbuf[RS485_RX_CNT-1]=='E') & (pbuf[RS485_RX_CNT-2]=='E') & (pbuf[RS485_RX_CNT-3]=='E'))
- {
- pbuf[RS485_RX_CNT]='\0'; //在字符串末尾加上一个结束符
-
- //发送消息
- OSQPost((OS_Q* )&RS485_Q,
- (void* )pbuf,
- (OS_MSG_SIZE)(RS485_RX_CNT+1),
- (OS_OPT )OS_OPT_POST_FIFO,
- (OS_ERR* )&err);
- if(err != OS_ERR_NONE)
- {
- myfree(SRAMIN,pbuf); //释放内存
- }
- mallocFlag=0;
- RS485_RX_CNT=0;
- }else if(RS485_RX_CNT==19){
- pbuf[RS485_RX_CNT]='\0'; //在字符串末尾加上一个结束符
- //发送消息
- OSQPost((OS_Q* )&RS485_Q,
- (void* )pbuf,
- (OS_MSG_SIZE)RS485_RX_CNT,
- (OS_OPT )OS_OPT_POST_FIFO,
- (OS_ERR* )&err);
-
- if(err != OS_ERR_NONE)
- {
- myfree(SRAMIN,pbuf); //释放内存
- }
- mallocFlag=0;
- RS485_RX_CNT=0;
- }
- }
- OSIntExit();
- }
复制代码- 消息处理代码(局部):
- u8 re_char[]="ABC"; //需要处理的字符串
- //请求消息
- p=OSQPend((OS_Q* )&RS485_Q,
- (OS_TICK )200,
- (OS_OPT )OS_OPT_PEND_BLOCKING,
- (OS_MSG_SIZE* )&size,
- (CPU_TS* )0,
- (OS_ERR* )&err);
- if(p != NULL)
- {
- USAR1_Send_Data((u8*)p,size); //将接受到的字符串发送到PC
-
- if( ( time_add=(strstr((char*)p,(char*)re_char)) ) !=NULL)
- {
-
- printf("时间设置不成功!\r\n");
- }
-
- printf("没有正确的时间字符串头\r\n");
- myfree(SRAMIN,p); //释放内存
- return ;
- }
复制代码 |
|