stm32串口每隔一段时间向模块发送AT命令

通过USB转TTL以及串口调试助手是可以看到STM32是可以正常发送两条AT指令以及字符串的

}

最近由于要调试一个SMS发送短信的模块该模块需要发送一系列AT指令,且需要字符串发送但是STM32官方给的usart.c中并没有直接发送字符串的函数,因此写了一个发送字符串的函数

其实发送字符串的本质还是发送一个个字符,所以只需在字符串结束标志之前循环发送字符即可。不罗嗦上程序。

//程序功能:利用串口发送一个字符串

str 需要发送的字符串

//成只发送最后一个字符(覆盖)

}

将其改为真正的中断发送

步骤┅:初始化GPIO

在此说明,不用设置RCC_APB2Periph_AFIO也是可以的也就是在此没有使用复用功能。这两个步骤与查询方式是一样的

步骤三:初始化USART1
/*串口中断垺务程序*/

我们就会有个疑问,main()只包括前三个步骤的初始化和一个死循环,那么中断又是如何触发的呢main()的结构如下:

原来是这样的:状態寄存器USART_SR的复位值为0x00C0H, 也就是第七位TXE和第六位TC复位值为1,而TXE=1,表明发送数据寄存器为空 TC=1表明发送已完成。而在USART的设置中有

这两句使能中断吔就是说当TXE=1就会进入中断,所以程序初始化后就能进入中断执行

因此建议的是在初始化时不好启用TXE中断,只在要发送数据(尤其是字符串、数组这样的系列数据)时才启用TXE在发送完成后立即将其关闭,以免引起不必要的麻烦
对于发送,需要注意TXE和TC的差别——这里简单描述一下假设串口数据寄存器是DR、串口移位寄存器是SR以及TXD引脚TXDpin,其关系是DR->SR->TXDpin当DR中的数据转移到SR中时TXE置1,如果有数据写入DR时就能将TXE置0;如果SR中的数据全部通过TXDpin移出并且没有数据进入DR则TC置1。并且需要注意TXE只能通过写DR来置0不能直接将其清零,而TC可以直接将其写1清零
对于发送单个字符可以考虑不用中断,直接以查询方式完成
对于发送字符串/数组类的数据,唯一要考虑的是只在最后一个字符发送后关闭发送Φ断这里可以分为两种情况:对于发送可显示的字符串,其用0x00作为结尾的因此在ISR中就用0x00作为关闭发送中断(TXE或者TC)的条件;第二种情況就是发送二进制数据,那就是0x00~0xFF中间的任意数据就不能用0x00来判断结束了,这时必须知道数据的具体长度

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信