OpenEdv-开源电子网

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

STM32F103VET6的芯片发送数据过去,接收中断接收不到数据,怎么解决?

[复制链接]

4

主题

18

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2019-12-31
在线时间
13 小时
发表于 2020-3-19 17:43:23 | 显示全部楼层 |阅读模式
15金钱
串口1初始化如下:
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
}
串口1接收中断代码如下:
void USART1_IRQHandler(void)
{
    if(USART_GetITStatus(USART1, USART_IT_RXNE)==SET)
    {
     
     lte_receive_process_event(USART_ReceiveData(USART1));
        USART_ClearITPendingBit(USART1,USART_IT_RXNE);
    }
    if(USART_GetFlagStatus(USART1,USART_FLAG_ORE)==SET)
    {
     lte_receive_process_event(USART_ReceiveData(USART1));  //读DR
     USART_ClearFlag(USART1,USART_FLAG_ORE);                //读SR
  }
}

存放到BUFF区代码如下:
char lte_receive_process_event(unsigned char ch )
{
    if(buf_uart1.index >= BUFLEN)
    {
        buf_uart1.index = 0 ;
    }
    else
    {
        buf_uart1.buf[buf_uart1.index++] = ch;
    }
  return ch;
}
发送函数就是使用STM32库函数,无改动,发送的是AT指令,通信模块接收到AT指令会自动返回OK,但是就是接收不到OK,硬件检查过了,没问题!求大神指点!

最佳答案

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

已经解决了,接收函数有问题,下面是我改过的接收函数,可以正常收发了,以后有人遇到我这个问题,也可以来问问我解决这个问题的思路。现在结帖了! void USART1_IRQHandler(void) //串口1中断服务程序 { if(USART_GetITStatus(USART1, USART_IT_RXNE)!=RESET) { RxBuffer[RxCounter++] =USART_ReceiveData(USART1);//接收模块的数据 USART_ClearITPendingBit(USART1,USART_IT_RXNE) ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

18

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2019-12-31
在线时间
13 小时
 楼主| 发表于 2020-3-19 17:43:24 | 显示全部楼层
GK6OA(_6NQDK[8S{DWG0WYF.jpg
已经解决了,接收函数有问题,下面是我改过的接收函数,可以正常收发了,以后有人遇到我这个问题,也可以来问问我解决这个问题的思路。现在结帖了!
void USART1_IRQHandler(void)                 //串口1中断服务程序
{
     if(USART_GetITStatus(USART1, USART_IT_RXNE)!=RESET)
  {
        RxBuffer[RxCounter++] =USART_ReceiveData(USART1);//接收模块的数据
     USART_ClearITPendingBit(USART1,USART_IT_RXNE);
    }
}

回复

使用道具 举报

4

主题

18

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2019-12-31
在线时间
13 小时
 楼主| 发表于 2020-3-19 17:56:06 | 显示全部楼层
硬件我把RX,TX飞线拉出来了,然后用USB转TTL工具接到电脑上的串口工具试过了,正常的返回;所以排除了硬件的问题,发送时用库函数发送,所以发送应该也是没问题,问题大概率是发生在接收的地方,但是我找不出哪里处问题了,求大神指点!我持续关注!
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2020-3-19 20:41:44 | 显示全部楼层
看来要凉凉
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2020-3-20 00:47:07 | 显示全部楼层
仿真找下问题
回复

使用道具 举报

4

主题

18

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2019-12-31
在线时间
13 小时
 楼主| 发表于 2020-3-20 11:29:06 | 显示全部楼层

很绝望
回复

使用道具 举报

4

主题

18

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2019-12-31
在线时间
13 小时
 楼主| 发表于 2020-3-20 11:30:47 | 显示全部楼层

仿真调试过了,怎么触发不了接收中断,RX收到反馈不是自动触发接收中断吗?求原子哥解救!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2020-3-21 01:25:21 | 显示全部楼层
教而不善 发表于 2020-3-20 11:30
仿真调试过了,怎么触发不了接收中断,RX收到反馈不是自动触发接收中断吗?求原子哥解救!

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

使用道具 举报

4

主题

18

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2019-12-31
在线时间
13 小时
 楼主| 发表于 2020-3-23 09:01:52 | 显示全部楼层
正点原子 发表于 2020-3-21 01:25
你是发送数据, 你确定有人发数据给你么?

我是要发送AT指令给4G模块,模块收到AT指令就返回OK。
回复

使用道具 举报

4

主题

18

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2019-12-31
在线时间
13 小时
 楼主| 发表于 2020-3-23 09:13:52 | 显示全部楼层
14c80b53e7f33f914e160569207b753.png f6bb27f634f1aab98e4b8bd04088616.jpg 这个是我拉出来的飞线,然后用USB转TTL接到电脑上,然后用Sscom工具发送AT指令,每一条指令都能正常返回,且能连接远程服务端,唯独模块和STM32芯片连接就不能正常接收(STM32和模块连接我用另外一块板子,不是把拉飞线的板子焊接回去的!),希望大佬帮我看看!
回复

使用道具 举报

4

主题

18

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2019-12-31
在线时间
13 小时
 楼主| 发表于 2020-3-23 09:28:18 | 显示全部楼层
发送函数我也贴出来吧!
static void S_SIMCARD_CMD()
{
    char *pp = NULL;
    PUT(buf_uart1.buf);
    pp = strstr((const char*)buf_uart1.buf,"OK");   //反馈卡状态OK
    if(pp)
    {
        PUT("SIMCARD OK \r\n");
        clear_buf_uart1();
        current_status = CREG ;
        send_string_uart1(CREG_CMD);
    }
    else
    {
        PUT("SIMCARD .. \r\n");
        clear_buf_uart1();
        current_status = SIMCARD ;
        send_string_uart1(SIMCARD_CMD);
    }
}
串口发送函数:
void send_string_uart1(char * S)
{
    while(*S)
    {
        send_data_uart1(*S++);
    }
}
串口发送函数:


void send_data_uart1(unsigned char Data)
{
    while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
    USART_SendData(USART1, Data);
}

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2020-3-24 00:56:42 | 显示全部楼层
教而不善 发表于 2020-3-23 09:28
发送函数我也贴出来吧!
static void S_SIMCARD_CMD()
{

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

使用道具 举报

28

主题

294

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1790
金钱
1790
注册时间
2018-3-26
在线时间
294 小时
发表于 2020-3-24 09:27:48 | 显示全部楼层
你先下载相同芯片型号的例程进去,看看能不能进串口中断。

能进再对比例程修改自己程序。
不能就检查自己硬件。
茵茵猪头
回复

使用道具 举报

4

主题

18

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2019-12-31
在线时间
13 小时
 楼主| 发表于 2020-3-26 19:47:04 | 显示全部楼层
我通过STM32的TX发送了重启的AT指令给4G模块,发现模块正常重启了,证明TX发送是没有问题的,发送函数如下:

static void S_GSM_INIT0()
{
     Clear_Buf_Uart1();
/*****************发送AT指令*********************************/
         memset(sim_str,0x00,50);
        sprintf(sim_str,"AT+CFUN=1,1\r\n ");
         Send_String_Uart1(sim_str);                  
/************************************************************/
         delay_ms(500);
     current_status=TEST_AT;                          //将状态设置为下一个                        
}
回复

使用道具 举报

4

主题

18

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2019-12-31
在线时间
13 小时
 楼主| 发表于 2020-3-26 19:48:13 | 显示全部楼层
正点原子 发表于 2020-3-24 00:56
监控下RX脚的数据吧

原子哥,我接收到的数据为什么一直都是\r\r的????
回复

使用道具 举报

4

主题

18

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2019-12-31
在线时间
13 小时
 楼主| 发表于 2020-3-26 19:49:09 | 显示全部楼层
htao 发表于 2020-3-24 09:27
你先下载相同芯片型号的例程进去,看看能不能进串口中断。

能进再对比例程修改自己程序。

已经这样操作过很多次了,但是还是没解决,但是我一步步排除,最终定位到接收函数,不知道接收函数有什么地方出错了。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2020-3-27 00:57:20 | 显示全部楼层
教而不善 发表于 2020-3-26 19:48
原子哥,我接收到的数据为什么一直都是\r\r的????

你用的是USB转串口直接通过串口调试助手看的数据吧?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

18

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2019-12-31
在线时间
13 小时
 楼主| 发表于 2020-3-27 09:02:56 | 显示全部楼层
正点原子 发表于 2020-3-27 00:57
你用的是USB转串口直接通过串口调试助手看的数据吧?

我是用J-LINK进入调试模式,再看接收的buffer,看到没有产生数据,我看了发送的数据,正常,而且发送到模块,模块也按照我的意思做了相应的动作,所以发送端是没有问题的。就是接收出了问题,可能接收的方式不对或者接收的格式不对!
接收函数如下:
void USART1_IRQHandler(void)                        //串口1中断服务程序
        {

     if(USART_GetITStatus(USART1, USART_IT_RXNE)!=RESET)
                {
        RxBuffer[RxCounter++] =USART_ReceiveData(USART1);//接收模块的数据
                          USART_ClearITPendingBit(USART1,USART_IT_RXNE);
    }
                    if(USART_GetFlagStatus(USART1,USART_FLAG_ORE)==SET)
    {
        RxBuffer[RxCounter++] =USART_ReceiveData(USART1);//接收模块的数据
        USART_ClearFlag(USART1,USART_FLAG_ORE);                       
    }
}
回复

使用道具 举报

4

主题

18

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2019-12-31
在线时间
13 小时
 楼主| 发表于 2020-3-27 09:09:49 | 显示全部楼层
我用的是J-LINK调试工具看的数据,之前我以为因为我用J-LINK这个工具看数据,是看不到,所以没接收到数据,然后我用以前开发的2G板子看了一下,也是J-LINK工具看数据,发现正常接收,可以看到模块返回的数据,如下图: Z7HSZR0VV54SCDALL8DTAFF.jpg

回复

使用道具 举报

28

主题

294

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1790
金钱
1790
注册时间
2018-3-26
在线时间
294 小时
发表于 2020-3-27 09:17:55 | 显示全部楼层
教而不善 发表于 2020-3-27 09:02
我是用J-LINK进入调试模式,再看接收的buffer,看到没有产生数据,我看了发送的数据,正常,而且发送到模 ...

有没有进接收中断
进了一般就是有数据过来(要排除干扰情况),
有数据就要对应的数据格式去解析,可以接收到数据了先不处理,全部转存,然后
再打印出来,看看数据是不是正常的、
茵茵猪头
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-24 06:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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