OpenEdv-开源电子网

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

串口接收缓存器USART_RES_BUF里面接受完数据为什么寄存器里面看不到0X0D,只能看到0X0A?

[复制链接]

5

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2016-7-14
在线时间
30 小时
发表于 2016-8-30 09:20:08 | 显示全部楼层 |阅读模式
5金钱
调试GPRS模块时发送        if (sim800L_send_cmd("AT+CIPSEND",">",500))这条语句时。程序一直判断为假,然后打开寄存器在窗口查看,发现数据接收完成的标示0X0D,0X0A只出现了0X0A.恳请原子哥与各路大神帮忙。
QQ截图20160829185152.jpg

最佳答案

查看完整内容[请看2#楼]

这里跟串口实验不一样的。。。[mw_shl_code=c,true]u8* sim900a_check_cmd(u8 *str) { char *strx=0; if(USART3_RX_STA&0X8000) //接收到一次数据了 { USART3_RX_BUF=0;//添加结束符 strx=strstr((const char*)USART3_RX_BUF,(const char*)str); } return (u8*)strx; } u8 sim900a_send_cmd(u8 *cmd,u8 *ack,u16 waittime) { u8 res=0; USART3_RX_STA=0; if((u32)cmdSR&0X40)==0);//等待上一次数据 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

355

主题

1476

帖子

12

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
8105
金钱
8105
注册时间
2015-10-15
在线时间
2922 小时
发表于 2016-8-30 09:20:09 | 显示全部楼层
这里跟串口实验不一样的。。。[mw_shl_code=c,true]u8* sim900a_check_cmd(u8 *str)
{
        char *strx=0;
        if(USART3_RX_STA&0X8000)                //接收到一次数据了
        {
                USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加结束符
                strx=strstr((const char*)USART3_RX_BUF,(const char*)str);
        }
        return (u8*)strx;
}
u8 sim900a_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
        u8 res=0;
        USART3_RX_STA=0;
        if((u32)cmd<=0XFF)
        {
                while((USART3->SR&0X40)==0);//等待上一次数据发送完成  
                USART3->DR=(u32)cmd;
        }else u3_printf("%s\r\n",cmd);//发送命令
        if(ack&&waittime)                //需要等待应答
        {
                while(--waittime)        //等待倒计时
                {
                        delay_ms(10);
                        if(USART3_RX_STA&0X8000)//接收到期待的应答结果
                        {
                                if(sim900a_check_cmd(ack))break;//得到有效数据
                                USART3_RX_STA=0;
                        }
                }
                if(waittime==0)res=1;
        }
        return res;
} [/mw_shl_code]


串口3的中断服务函数:
[mw_shl_code=c,true]void USART3_IRQHandler(void)
{
        u8 res;             
        if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)//接收到数据
        {         
                res =USART_ReceiveData(USART3);                 
                if((USART3_RX_STA&(1<<15))==0)//接收完的一批数据,还没有被处理,则不再接收其他数据
                {
                        if(USART3_RX_STA<USART3_MAX_RECV_LEN)        //还可以接收数据
                        {
                                TIM_SetCounter(TIM7,0);//计数器清空                                          //计数器清空
                                if(USART3_RX_STA==0)                                 //使能定时器7的中断
                                {
                                        TIM_Cmd(TIM7,ENABLE);//使能定时器7
                                }
                                USART3_RX_BUF[USART3_RX_STA++]=res;        //记录接收到的值         
                        }else
                        {
                                USART3_RX_STA|=1<<15;                                //强制标记接收完成
                        }
                }
        }                                                                                                                            
}   [/mw_shl_code]

这里的判断方法是:
发送一串数据出去,发送完成后,等待一段时间(开启定时器,定时器10ms中断一次)来接受数据,10ms之后,强制把接收完成标志设置为1,因为数据接收都用不了10ms。。。

这是通过定时器中断来实现的:
[mw_shl_code=c,true]void TIM7_IRQHandler(void)
{        
        if (TIM_GetITStatus(TIM7, TIM_IT_Update) != RESET)//是更新中断
        {                                   
                USART3_RX_STA|=1<<15;        //标记接收完成
                TIM_ClearITPendingBit(TIM7, TIM_IT_Update  );  //清除TIM7更新中断标志   
                TIM_Cmd(TIM7, DISABLE);  //关闭TIM7
        }            
}[/mw_shl_code]

所以,并不是通过判断回车换行来实现判断接收完成。。。

接收完成之后,调用sim900a_check_cmd函数,来比较接收到的数据中是否包含sim900a_send_cmd函数传入的ack。。。比如“OK”。。。



我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2016-7-14
在线时间
30 小时
 楼主| 发表于 2016-9-1 10:13:09 | 显示全部楼层
openedvadmin 发表于 2016-8-30 09:20
这里跟串口实验不一样的。。。[mw_shl_code=c,true]u8* sim900a_check_cmd(u8 *str)
{
        char *strx=0;

谢谢你 的指导,可是当向GSM模块发送指令AT+CIPSEND的时候模块返回的只是 >  而这个返回来的数据并不是以0x0d 0x0a 结束的,这时候怎么判断呢。
回复

使用道具 举报

5

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2016-7-14
在线时间
30 小时
 楼主| 发表于 2016-9-1 10:17:46 | 显示全部楼层
可是当向模块发送AT+CIPSEND的时候模块返回过来的只是 “”> “这时候再调用u8* sim900a_check_cmd(u8 *str)怎么就进入不到循环啊
回复

使用道具 举报

5

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2016-7-14
在线时间
30 小时
 楼主| 发表于 2016-9-1 10:18:34 | 显示全部楼层
还是把程序附上吧,求高人指导。
回复

使用道具 举报

5

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2016-7-14
在线时间
30 小时
 楼主| 发表于 2016-9-1 10:20:49 | 显示全部楼层
[mw_shl_code=applescript,true]/*****************************************************************
问题:
发现利用现有的串口判断程序是以STM原子 视频教程里面公布的以判断接收数据接收到的0X0A 0X0D结束的,而当发送AT+CIPSEND返回的是   " > " 这个符号并不是以0X0A 0X0D 结尾的,这样就导致判断不通过,进而一直死循环!
调试思路及方法:
修改串口接收数据结束标志的通信协议。暂定调试协议以判断数据长度为结束标志。
*********************************************************************************/
#include "stm32f10x.h"
#include "usart.h"
#include "string.h"
#include "SIM800L.h"
#include "delay.h"
u8 type[10]={"TCP"};
/***********************************************************************
函数功能: 向云端服务器发送数据,并获取数据,原始未解析的数据报文
入口参数: buf:向云端发送的数据,input_len:发送的数据长度,output_buf :云端返回的数据
出口参数: > 0:发送成功,收到的字节数,0:失败
***********************************************************************/
/*u16 SendDataToSeverAndGetData(u8 *buf , u16 input_len , u8* output_buf )
{
  
}*/
/********************************************************************
函数功能:
入口参数:
出口参数:
*********************************************************************/
void sim_at_response(u8 mode)
{
        if(USART_RX_STA&0X8000)                //接收到一次数据了
        {
                USART_RX_BUF[USART_RX_STA&0X7FFF]=0;//添加结束符
                printf("%s",USART_RX_BUF);        //发送到串口
                if(mode)USART_RX_STA=0;
        }
}


/***********************************************************************
函数功能:查找字符串在字符串的首次位置
入口参数:
出口参数:start:开始出现的位置,
***********************************************************************/
/*u8 StringSerach(u8 *string , u8 *serach ,u8 *start)
{
        u16 len = strlen(string);
        u16 lens = strlen(serach);
        u16 i = 0 , st = 0 , j = 0;
       
        for(i = 0 ; i < len - lens ; i ++)
        {
                if(serach[0] == string)
                {
                        for(j = 0 ; j < lens ; j++)
                        {
                                if(serach[j] != string[i + j])
                                {
                                        i += j;
                                        break;
                                }
                        }
                       
                        if(j == lens)
                        {
                                *start = i;
                                return 1;
                        }
                }
        }
       
        return 0;
}
********************************
当收到返回的数据时判断返回中的数据是否包含期望数据如果包含则返回为出现的位置

************************************/
/***********************************************************************
函数功能:检查模块返回应答是否是期望应答
入口参数:模块返回应答ack的地址
出口参数:期望返回应答所在的地址
**********************************************************************/
u8* sim800L_check_cmd(u8 *str)       //指针函数,函数返回值是一个指针,这个函数的作用其实就是指向返回值(的地址)
{
        u8 len;
        char *strx=0;
        if(USART_RX_STA&0X8000)         //接收到一次数据了
        {
                USART_RX_BUF[USART_RX_STA&0X7FFF]=0;//添加结束符
                len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
                strx=strstr((const char*)USART_RX_BUF,(const char*)str);
                USART_RX_STA=0;
}
        return (u8*)strx;                         //strx是一个指针变量,里面存放的是期待返回命令值存放的地址
        }
/**********************************************************************
函数功能:向sim800L模块发送指令
入口参数:cmd:发送的命令字符串(不需要添加回车),当cmd<0XFF的时候发送数字(比如发送0X1A),大于的时候发送字符串,
                  ack:期待的应答结果,如果为空则表示的不需要等待应答
          waittime:等待时间(单位为10ms)
出库参数:1,发送成功(得到期待的应答结果)
                  0, 发送失败
**********************************************************************/
u8 sim800L_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
                USART_RX_STA=0;                                        //接收状态清零
                if((u32)cmd<=0XFF)                                        //当cmd<0XFF的时候发送1A(启动发送数据的命令)其1A<0XFF
                {
                while(DMA1_Channel7->CNDTR!=0);//等待通道7传输完成
                                   USART1->DR=(u32)cmd;
                }
                else printf("%s\r\n",cmd);//当cmd>0XFF的时候发送字符串命令如:(AT+CIPSEND其十六进制为41542B43495053454E44 >0XFF)
                if(ack&&waittime)                //需要等待应答
                {
                       
                        for(waittime;waittime>0;waittime--)
                                {
                                        delay_ms(10);
                                        if(USART_RX_STA&0X8000)        //接收到应答结果
                                                {
                                                        if(sim800L_check_cmd(ack)) break;        //得到有效数据   //break语句提前跳出循环   break语句不能用于循环语句和switch语句外的起的语句中
                                             USART_RX_STA=0;                        //清零如果不清零可能导致这个状态标致寄存器里面的值混乱,不利于下次接收数据
                                                }
                       
                                }
                                        if(waittime==0) return 0;                                //等待时间内一直没有收到期待的响应(ack)结果则返回值为0表示发送失败
                }       
                return 1;       
}
/***************************************************************************
函数功能:
入口参数:type:连接方式为TCP,ipaddr:入网ip地址,port:入网网络端口
出口参数:
****************************************************************************/
u8 sim800L_GPRS(u8 *type,u8* ipaddr,u8* port)
{
        int t=0;
        u8 tcp_lianjie[50];
        u8 *out_buf;
        u8 in_buf[]={"GET http://smart.cloud.uoko.com/smar ... 00059c6310b00000000 HTTP/1.1\r\nHOST:smart.cloud.uoko.com\r\n\r\n"};
        USART_RX_STA=0;        //将串口数据接收状态寄存器清零为了不耽误下次命令接收
                                sprintf(tcp_lianjie,"AT+CIPSTART=\"%s\",\"%s\",\"%s\"",type,ipaddr,port);//将[ AT+CIPSTART="TCP”."smart.cloud.uoko.com".80 ]传送给无符号指针tcp_lianjie
                               
                                        if(sim800L_send_cmd(tcp_lianjie,"OK",1000))                                                //发起连接
                                        {                       
                                                for(t=0;t<500;t++);
//                                                printf("AT+CIPSEND/r/n");
//                                                delay_ms(500);
                                                if(sim800L_send_cmd("AT+CIPSEND","0",0))                //发送数据指令
                                                                        {
                                                                        delay_ms(1000);
                                                                        printf("%s\r\n",in_buf);                                                        //通过USART2将数据传输给模块
                                                                        delay_ms(1000);
                                                                        USART_RX_STA=0;
                                                printf("%s\r\n",in_buf);
                                                delay_ms(500);
                                                sim800L_send_cmd((u8*)0X1A,"SEND OK",1000);                                                                                //启动数据传输                                                                 
                                                                        delay_ms(1000);
                                                                        if(USART_RX_STA&0X8000)                //接收到了数据
                                                                                {
                                                                                USART_RX_BUF[USART_RX_STA&0X7FFF]=0;        //添加结束符
                                                                                out_buf=USART_RX_BUF;                                //数据发送成功(?????)
                                                                                return 1;        //返回值为1表示成功访问网页并获取数据
                                                                                }
                                                                       
//                                                                        }
//                                                                 if(sim800L_send_cmd("AT+CIPSEND","ERROR",500))
//                                                                {
//                                                                delay_ms(500);
//                                                                sim800L_init();
//                                                                }       
//                                        }
//                                         if(sim800L_send_cmd(tcp_lianjie,"ALREADY CONNECT",2000))
//                                        {
//                                                delay_ms(100);
//                                                if (sim800L_send_cmd("AT+CIPSEND",">",500))
//                                                {
//                                                delay_ms(1000);
//                                                sim800L_send_cmd((u8*)0X1A,"SEND OK",1000);
//                                                                                        delay_ms(1000);
//                                                                                if(USART_RX_STA&0X8000)                //接收到了数据
//                                                                                {
//                                                                                USART_RX_BUF[USART_RX_STA&0X7FFF]=0;        //添加结束符
//                                                                                //out_buf=USART_RX_BUF;                                //数据发送成功(?????)
//                                                                                }                                                               
//                                                }
//                                        return 2;        //返回值为2:访问成功
//                                        }
//        return 8;       

                                        }return 0;
        }
/******************************************************************
函数功能:SIM800l模块初始化
入口参数:
出口参数:返回值1:设置GPRS移动台类别为B,支持包交换和数据交换
                  返回值2:设置PDP上下文,互联网接协议,接入点等信息
                  返回值3:附着GPRS业务
                  返回值4:设置为GPRS连接模式
*******************************************************************/
u8 sim800L_init(void)
{
        const u8 *port="80";        //端口固定为80
        u8 ipbuf[30]={"smart.cloud.uoko.com"};
        if(sim800L_send_cmd("AT","OK",1000))
        {
        delay_ms(200);
        sim800L_send_cmd("AT+CIPCLOSE","CLOSE OK",500);
        sim800L_send_cmd("AT+CIPSHUT","SHUT OK",500);                //关闭移动场景        
        if(sim800L_send_cmd("AT+CGCLASS=\"B\"","OK",1000)==0)return 1;                                //设置GPRS移动台类别为B,支持包交换和数据交换
        if(sim800L_send_cmd("AT+CGDCONT=1,\"IP\",\"CMNET\"","OK",1000)==0)return 2;//设置PDP上下文,互联网接协议,接入点等信息
        if(sim800L_send_cmd("AT+CGATT=1","OK",500)==0)return 3;                                        //附着GPRS业务
        if(sim800L_send_cmd("AT+CIPCSGP=1,\"CMNET\"","OK",500)==0)return 4;                 //设置为GPRS连接模式
                while(1)
                {   
                        sim800L_GPRS(type,ipbuf,(u8*)port);       
                        sim_at_response(1);//检查GSM模块发送过来的数据,及时上传给电脑
                }
               
        }
        return 0;
}
[/mw_shl_code]
回复

使用道具 举报

5

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2016-7-14
在线时间
30 小时
 楼主| 发表于 2016-9-1 10:23:11 | 显示全部楼层
[mw_shl_code=applescript,true]#include "sys.h"
#include "usart.h"       
#include "delay.h"
#include "stm32f10x.h"
#include "delay.h"
#include "stdarg.h"                  
#include "stdio.h"                  
#include "string.h"       
//////////////////////////////////////////////////////////////////////////////////          
//如果使用ucos,则包括下面的头文件即可.
#if SYSTEM_SUPPORT_OS
#include "includes.h"                                        //ucos 使用          
#endif
//////////////////////////////////////////////////////////////////////////////////         
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK STM32开发板
//串口1初始化                  
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2012/8/18
//版本:V1.5
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved
//********************************************************************************
//V1.3修改说明
//支持适应不同频率下的串口波特率设置.
//加入了对printf的支持
//增加了串口接收命令功能.
//修正了printf第一个字符丢失的bug
//V1.4修改说明
//1,修改串口初始化IO的bug
//2,修改了USART_RX_STA,使得串口最大接收字节数为2的14次方
//3,增加了USART_REC_LEN,用于定义串口最大允许接收的字节数(不大于2的14次方)
//4,修改了EN_USART1_RX的使能方式
//V1.5修改说明
//1,增加了对UCOSII的支持
//////////////////////////////////////////////////////////////////////////////////           


//////////////////////////////////////////////////////////////////
//加入以下代码,支持printf函数,而不需要选择use MicroLIB          
#if 1
#pragma import(__use_no_semihosting)            
//标准库需要的支持函数                 
struct __FILE
{
        int handle;

};

FILE __stdout;      
//定义_sys_exit()以避免使用半主机模式   
_sys_exit(int x)
{
        x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{      
        while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
    USART1->DR = (u8) ch;      
        return ch;
}
#endif
#define USART1_MAX_RECV_LEN                1024                                //最大接收缓存字节数
#define USART1_MAX_SEND_LEN                1024                                //最大发送缓存字节数

#if EN_USART1_RX   //如果使能了接收
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误          
u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.

//接收状态
//bit15,        接收完成标志
//bit14,        接收到0x0d
//bit13~0,        接收到的有效字节数目
u16 USART_RX_STA=0;       //接收状态标记          
  
void uart_init(u32 bound){
  //GPIO端口设置
  GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
         
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);        //使能USART1,GPIOA时钟
  
        //USART1_TX   GPIOA.9
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
   
  //USART1_RX          GPIOA.10初始化
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  

  //Usart1 NVIC 配置
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                //子优先级3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
        NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器
  
   //USART 初始化设置

        USART_InitStructure.USART_BaudRate = bound;//串口波特率
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
        USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
        USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //收发模式

  USART_Init(USART1, &USART_InitStructure); //初始化串口1
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
  USART_Cmd(USART1, ENABLE);                    //使能串口1
#ifdef USART1_RX_EN                          //如果使能了接收
        //使能接收中断
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断   
       
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                //子优先级3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
        NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器
        TIM4_Init(99,7199);                //10ms中断
        USART1_RX_STA=0;                //清零
        TIM4_Set(0);                        //关闭定时器4
#endif                
}
///
//定时器4中断服务程序                    
void TIM4_IRQHandler(void)
{        
        if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)//是更新中断
        {                                   
                USART_RX_STA|=1<<15;        //标记接收完成
                TIM_ClearITPendingBit(TIM4, TIM_IT_Update  );  //清除TIMx更新中断标志   
                TIM4_Set(0);                        //关闭TIM4  
        }   
}
//设置TIM4的开关
//sta:0,关闭;1,开启;
void TIM4_Set(u8 sta)
{
        if(sta)
        {
      
                TIM_SetCounter(TIM4,0);//计数器清空
                TIM_Cmd(TIM4, ENABLE);  //使能TIMx       
        }else TIM_Cmd(TIM4, DISABLE);//关闭定时器4
}
//通用定时器中断初始化
//这里始终选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数                 
void TIM4_Init(u16 arr,u16 psc)
{        NVIC_InitTypeDef NVIC_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //时钟使能//TIM4时钟使能   
       
        //定时器TIM3初始化
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值       
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位

        TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); //使能指定的TIM4中断,允许更新中断

                   
        NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//抢占优先级3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;                //子优先级3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
        NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器
       
}
void USART1_IRQHandler(void)                        //串口1中断服务程序
        {
        u8 Res;
#if SYSTEM_SUPPORT_OS                 //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
        OSIntEnter();   
#endif
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
                {
                Res =USART_ReceiveData(USART1);        //读取接收到的数据
                        if((USART_RX_STA&0x8000)==0)//接收未完成
                        {
                        if(USART_RX_STA&0x4000)//接收到了0x0d
                                {
                                if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
                                else USART_RX_STA|=0x8000;        //接收完成了
                                }
                        else //还没收到0X0D
                                {        if(Res==0x0d){USART_RX_STA|=0x4000;}
//                                else
//                                        {
//                                        if(Res==0x3e)
//                                                {
//                                                        USART_RX_BUF[USART_RX_STA&0X3FFF]=Res;
//                                                        USART_RX_STA|=1<<15;       
//                                                }
                                    else
                                                {
                                        USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
                                        USART_RX_STA++;
                                                if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收          
                                                }                 
                                        }
                                        }
                                }
                        ////
//                else if(USART_RX_STA<USART_REC_LEN)                //还可以接收数据
//                {
//                  TIM_SetCounter(TIM4,0);//计数器清空      
//                        if(USART_RX_STA==0)TIM4_Set(1);                 //使能定时器4的中断
//                        USART_RX_BUF[USART_RX_STA++]=Res;                //记录接收到的值         
//                }else
//                {
//                        USART_RX_STA|=1<<15;                                        //强制标记接收完成
//                }
                //////////
       
                       
   
#if SYSTEM_SUPPORT_OS         //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
        OSIntExit();                                                                                           
#endif
}
#endif       
[/mw_shl_code]下面这是我的串口接收程序
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2778
金钱
2778
注册时间
2015-6-1
在线时间
394 小时
发表于 2016-9-1 16:13:51 | 显示全部楼层
我在搞sim900A.
有点儿没明白你的问题,确定串口应该收到比如:0x0D 0x0A 0x79 0x75 0x0D 0x0A这样的一串是吗?然后你只收到了0x0D 0x0A 0x79 0x75 0x0A?这种我没遇到过。
跟二楼说的一样,在向模块发送一条数据后,我也是等待一段时间然后去读串口收到的所有数据,反正它会存在一个缓存区里(这个缓存区大小可以调,我用的框架中默认是64字节),然后用check函数来判断一下这一串数据里有没有>或者是SEND OK,如果有就认为数据发送成功。不用管它以什么符号结束。

请问你在使用时有没有遇到过明明可以读到OK,并且用串口打印都明明白白的看到了OK,但是check函数就是无法返回1,非要认为缓存区里没OK存在。
我遇到了,感觉好怪异,要是知道原因请帮我解答一下。
自在随心
回复

使用道具 举报

5

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2016-7-14
在线时间
30 小时
 楼主| 发表于 2016-9-2 11:07:39 | 显示全部楼层
yuzeyuan1 发表于 2016-9-1 16:13
我在搞sim900A.
有点儿没明白你的问题,确定串口应该收到比如:0x0D 0x0A 0x79 0x75 0x0D 0x0A这样的一串 ...

你调试指令的时候有没有注意到当向模块发送AT+CIPSEND的时候,模块返回过来的是 >并且这个指令后面不是以0X0D 0X0A结束的,所以利用串口里面如果判断0X0D,0X0A结束的话就没有办法判断有没有接收到 >这个返回。这样进入到check函数里面判断的就是假。
加qq604782809细聊
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2778
金钱
2778
注册时间
2015-6-1
在线时间
394 小时
发表于 2016-9-2 13:10:33 | 显示全部楼层
本帖最后由 yuzeyuan1 于 2016-9-2 13:12 编辑
追破风的小石头 发表于 2016-9-2 11:07
你调试指令的时候有没有注意到当向模块发送AT+CIPSEND的时候,模块返回过来的是 >并且这个指令后面不是以 ...

加您了。额,我没有看过原子例程是咋写的,你用strstr,可以在一长串字符中寻找>,如果有,返回值是1就行。不用非得判断最后几位
自在随心
回复

使用道具 举报

5

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2016-7-14
在线时间
30 小时
 楼主| 发表于 2016-9-2 15:18:09 | 显示全部楼层
yuzeyuan1 发表于 2016-9-2 13:10
加您了。额,我没有看过原子例程是咋写的,你用strstr,可以在一长串字符中寻找>,如果有,返回值是1就行 ...

嗯 我就是用strstr函数寻找字符串 >的不过如果串口没有接收到这个字符串无论怎样判断都是没有用的吧
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2778
金钱
2778
注册时间
2015-6-1
在线时间
394 小时
发表于 2016-9-2 15:46:03 | 显示全部楼层
追破风的小石头 发表于 2016-9-2 15:18
嗯 我就是用strstr函数寻找字符串 >的不过如果串口没有接收到这个字符串无论怎样判断都是没有用的吧

http://www.openedv.com/forum.php?mod=viewthread&tid=82938
和这兄弟是一个问题
自在随心
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-30 01:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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