OpenEdv-开源电子网

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

stm32f407给NB模块写at指令

[复制链接]

3

主题

11

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-8-1
在线时间
5 小时
发表于 2018-8-2 10:47:07 | 显示全部楼层 |阅读模式
1金钱
利用串口向nb模块写at指令,stm32开发板用串口线usart3和NB模块相连,不知道为什么总是得到不回复,谁做过stm32和nb模块调试,以下是我的代码:
uint8_t* aes="AT+CIMI\r\n";//at指令
    uart_sendat(USART3,aes);//在usart3上发送指令给nb模块
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
{
     uart3_buffer[rx_count++]==USART_ReceiveData(USART3);//接收NB模块返回的值
      uart_sendat(USART1,uart3_buffer);//利用usart1串口在串口工具中显示
  
}
void uart_sendat(USART_TypeDef* USARTx,uint8_t* cp)
{
    while((*cp)!='\0')
    {
        Usart_Send_isr(USARTx,*cp);
        cp++;
    }
}
void Usart_Send_isr(USART_TypeDef* USARTx,uint8_t ch)
{
     while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );
   USART_SendData(USARTx, (uint8_t)ch);
}


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

使用道具 举报

3

主题

11

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-8-1
在线时间
5 小时
 楼主| 发表于 2018-8-2 10:50:05 | 显示全部楼层
经过单步调试发现,USART_ReceiveData(USART3)收到的是空的,不知道为什么
回复

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
发表于 2018-8-2 11:13:32 | 显示全部楼层
用串口监控tx rx上面的数据
回复

使用道具 举报

3

主题

11

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-8-1
在线时间
5 小时
 楼主| 发表于 2018-8-2 15:43:52 | 显示全部楼层
ssssssssssss 发表于 2018-8-2 11:13
用串口监控tx rx上面的数据

usart1是和pc端连接,用来显示打印,usart3连接NB模块,用来发送at指令,用串口监控tx,rx数据,怎么弄啊 ,小弟不才
回复

使用道具 举报

3

主题

11

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-8-1
在线时间
5 小时
 楼主| 发表于 2018-8-2 15:45:43 | 显示全部楼层
ssssssssssss 发表于 2018-8-2 11:13
用串口监控tx rx上面的数据

usart3_send发送at指令给模块后,会通过usart3返回数据,然后我保存返回的数据,利用usart1在pc上显示,这样可行吗?哪里是不是有错误
回复

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
发表于 2018-8-2 16:05:37 | 显示全部楼层
太祖 发表于 2018-8-2 15:45
usart3_send发送at指令给模块后,会通过usart3返回数据,然后我保存返回的数据,利用usart1在pc上显示, ...

串口3和模块之间的rx tx可以直接用电脑监控,把你的usb转串口的rx接到模块的tx上,然后共地
回复

使用道具 举报

3

主题

11

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-8-1
在线时间
5 小时
 楼主| 发表于 2018-8-2 16:23:03 | 显示全部楼层
ssssssssssss 发表于 2018-8-2 16:05
串口3和模块之间的rx tx可以直接用电脑监控,把你的usb转串口的rx接到模块的tx上,然后共地

我用usb转串口直接接nb模块,tx和rx交叉连接,然后再写at指令,nb模块有返回结果,并在pc上有回显
回复

使用道具 举报

3

主题

11

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-8-1
在线时间
5 小时
 楼主| 发表于 2018-8-2 16:27:12 | 显示全部楼层
ssssssssssss 发表于 2018-8-2 16:05
串口3和模块之间的rx tx可以直接用电脑监控,把你的usb转串口的rx接到模块的tx上,然后共地

我单步调试,发现uart3_buffer总是空,没有收到数据,会不会是这条语句出错,uart3_buffer[rx_count]==USART_ReceiveData(USART3);
回复

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
发表于 2018-8-2 16:32:07 | 显示全部楼层
太祖 发表于 2018-8-2 16:27
我单步调试,发现uart3_buffer总是空,没有收到数据,会不会是这条语句出错,uart3_buffer[rx_count]==US ...

在中断里接收吧,仿真或者串口打印都行
回复

使用道具 举报

3

主题

11

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-8-1
在线时间
5 小时
 楼主| 发表于 2018-8-3 16:38:42 | 显示全部楼层
ssssssssssss 发表于 2018-8-2 16:32
在中断里接收吧,仿真或者串口打印都行

在中断里接收usart3的数据,然后用usart1发给pc的串口显示,但是每次显示的都不对,是不是接收有问题?以下事我代码:
        USART_ClearITPendingBit(USART3, USART_IT_RXNE);
                                USART3_RX_BUF[USART3_RX_STA++]=USART_ReceiveData(USART3);        //usart3½ÓÊÕÊý¾Ý£»
               
                                USART3_RX_STA=0;
                                //if(USART3_RX_BUF[USART3_RX_STA-2]==0x0d&&USART3_RX_BUF[USART3_RX_STA-1]==0x0a)
                                //        aes=USART_ReceiveData(USART3);
                                uarttt_sendat(USART3_RX_BUF);
void uarttt_sendat(uint8_t* cp)
{
    while((*cp)!='\0')
    {
        Usart3_Send_isr(*cp);
        cp++;
    }

}
void Usart3_Send_isr(uint8_t ch){
     USART_SendData(USART1, (uint8_t)ch);
     while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET );

}
回复

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
发表于 2018-8-3 16:42:33 | 显示全部楼层
本帖最后由 ssssssssssss 于 2018-8-3 16:44 编辑
太祖 发表于 2018-8-3 16:38
在中断里接收usart3的数据,然后用usart1发给pc的串口显示,但是每次显示的都不对,是不是接收有问题?以 ...

中断里面发送数据本身就是一个bug,最好不要占用时间
回复

使用道具 举报

3

主题

11

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-8-1
在线时间
5 小时
 楼主| 发表于 2018-8-6 09:29:16 | 显示全部楼层
ssssssssssss 发表于 2018-8-3 16:42
中断里面发送数据本身就是一个bug,最好不要占用时间

多谢提醒,我一直在中断里面发送数据,我再修改一下
回复

使用道具 举报

3

主题

11

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-8-1
在线时间
5 小时
 楼主| 发表于 2018-8-6 10:38:08 | 显示全部楼层
ssssssssssss 发表于 2018-8-3 16:42
中断里面发送数据本身就是一个bug,最好不要占用时间

我在main()下send数据,不知道为什么一直没有数据发送,以下是我中断里面的函数:void USART3_IRQHandler(void)
{
//char aes;
        uint8_t i;
        if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)//ÖжϲúÉú£¬½ÓÊÕµ½Êý¾Ý
  {
                       
                //        while(USART_GetFlagStatus(USART3, USART_FLAG_RXNE) != RESET)
                //        {
                                USART_ClearITPendingBit(USART3, USART_IT_RXNE);
                                USART3_RX_BUF[USART3_RX_STA++]=USART_ReceiveData(USART3);        //usart3½ÓÊÕÊý¾Ý£»
                                for(i=0; i< USART3_RX_STA; i++) TxBuffer1 = USART3_RX_BUF;
                                TxCounter1=USART3_RX_STA;
                                USART3_RX_STA=0;
                    //uarttt_sendat(USART3_RX_BUF);//&frac12;&Oacute;&Ecirc;&Otilde;&micro;&frac12;&micro;&Auml;&Ecirc;&yacute;&frac34;&Yacute;&Ocirc;&Uacute;pc&micro;&Auml;&acute;&reg;&iquest;&Uacute;&Ouml;ú&Ecirc;&Ouml;&Eacute;&Iuml;&Iuml;&Ocirc;&Ecirc;&frac34;
   

                        //        }

                                //        aes=USART_ReceiveData(USART3);                               
                               
                                //while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET );
                                //while (!(USART1->SR & USART_FLAG_TXE));
                                //if(++USART3_RX_STA>=USART3_MAX_RECV_LEN) USART3_RX_STA=0;
                                //USART_ClearITPendingBit(USART3, USART_IT_RXNE);
                        //}
                        //USART_ClearITPendingBit(USART3, USART_IT_RXNE);
        }
       
        if(USART_GetITStatus(USART3, USART_IT_TC) != RESET)
  {
                        //mcui_oncomm_send(3);
                        USART_ClearITPendingBit(USART3, USART_IT_TC);
        }
}

这个是main里的for(i=0;i<TxCounter1;i++)
    {
         Usart3_Send(TxBuffer1);
     }
大神,帮我看看
回复

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
发表于 2018-8-6 10:48:29 | 显示全部楼层
太祖 发表于 2018-8-6 10:38
我在main()下send数据,不知道为什么一直没有数据发送,以下是我中断里面的函数:void USART3_IRQHandler ...

可以调试的方式很多,你这种方式不直观,你用仿真看你接收到数组里的数据更好点吧
回复

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
发表于 2018-8-6 11:34:14 | 显示全部楼层
太祖 发表于 2018-8-6 10:38
我在main()下send数据,不知道为什么一直没有数据发送,以下是我中断里面的函数:void USART3_IRQHandler ...

或者你把模块直接接串口上用电脑先调试一下
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2020-3-30
在线时间
0 小时
发表于 2020-3-30 15:27:57 | 显示全部楼层
楼主,你的问题解决了吗,救救我
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-3 04:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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