OpenEdv-开源电子网

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

ARM串口诡异 发送出的AT指令无法被GSM模块识别

[复制链接]

19

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2014-8-20
在线时间
0 小时
发表于 2014-8-20 16:40:39 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true][/mw_shl_code]
[mw_shl_code=c,true]#include "stm32f10x_lib.h" /* 自定义同义关键字 --------------------------------------------------*/ /* 自定义参数宏 -------------------------------------------------------*/ /* 自定义函数宏 --------------------------------------------------*/ /* 自定义变量 --------------------------------------------------*/ /* 自定义函数声明 --------------------------------------------------*/ void RccInitialisation(void); void GpioInitialisation(void); void SystickInitialisation(void); void USART_Printf(USART_TypeDef* USARTx,char *pch) ; void USART_Configuration(void); void Delay_Second(void); /************************************************************************** * 函数名 : main * 函数描述 : main 函数 * 输入参数 : 无 * 输出结果 : 无 * 返回值 : 无 **************************************************************************/ int main(void) { vu16 i; /* 设置系统时钟 */ RccInitialisation(); /* 设置GPIO端口 */ GpioInitialisation(); /* 设置Systick定时器 */ SystickInitialisation(); USART_Configuration(); /*PA10置低,给M35一个脉冲,持续2秒*/ GPIO_WriteBit(GPIOA , GPIO_Pin_10,Bit_RESET); GPIO_WriteBit(GPIOA , GPIO_Pin_0,Bit_SET); Delay_Second(); Delay_Second(); Delay_Second(); /*PA10置高,需要关机了,再拉低PA10*/ GPIO_WriteBit(GPIOA , GPIO_Pin_10,Bit_SET); Delay_Second(); Delay_Second(); Delay_Second(); // USART_Printf(USART3,"at+ipr=9600&w \r\n"); USART_Printf(UART5,"2014年8月12日首次调试!预祝成功\n\r"); Delay_Second(); USART_Printf(UART5,"第一秒\n\r"); Delay_Second(); USART_Printf(UART5,"这第二秒\n\r"); Delay_Second(); Delay_Second(); Delay_Second(); USART_Printf(UART5,"这第五秒\r"); Delay_Second(); Delay_Second(); Delay_Second(); Delay_Second(); Delay_Second(); USART_Printf(UART5,"这第二十秒"); Delay_Second(); Delay_Second(); Delay_Second(); Delay_Second(); Delay_Second(); Delay_Second(); Delay_Second(); Delay_Second(); Delay_Second(); Delay_Second(); USART_Printf(USART3,"AT\r\n"); Delay_Second(); Delay_Second(); Delay_Second(); Delay_Second(); Delay_Second(); Delay_Second(); USART_Printf(USART3,"ATD18577332035;\r\n"); } /************************************************************************** * 函数名 : RccInitialisation * 函数描述 : 设置系统各部分时钟 * 输入参数 : 无 * 输出结果 : 无 * 返回值 : 无 **************************************************************************/ void RccInitialisation(void) { /* 定义枚举类型变量 HSEStartUpStatus */ ErrorStatus HSEStartUpStatus; /* 复位系统时钟设置*/ RCC_DeInit(); /* 开启HSE*/ RCC_HSEConfig(RCC_HSE_ON); /* 等待HSE起振并稳定*/ HSEStartUpStatus = RCC_WaitForHSEStartUp(); /* 判断HSE起是否振成功,是则进入if()内部 */ if(HSEStartUpStatus == SUCCESS) { /* 选择HCLK(AHB)时钟源为SYSCLK 1分频 */ RCC_HCLKConfig(RCC_SYSCLK_Div1); /* 选择PCLK2时钟源为 HCLK(AHB) 1分频 */ RCC_PCLK2Config(RCC_HCLK_Div1); /* 选择PCLK1时钟源为 HCLK(AHB) 2分频 */ RCC_PCLK1Config(RCC_HCLK_Div2); /* 设置FLASH延时周期数为2 */ FLASH_SetLatency(FLASH_Latency_2); /* 使能FLASH预取缓存 */ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /* 选择锁相环(PLL)时钟源为HSE 1分频,倍频数为9,则PLL输出频率为 8MHz * 9 = 72MHz */ RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /* 使能PLL */ RCC_PLLCmd(ENABLE); /* 等待PLL输出稳定 */ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); /* 选择SYSCLK时钟源为PLL */ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* 等待PLL成为SYSCLK时钟源 */ while(RCC_GetSYSCLKSource() != 0x08); } RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3|RCC_APB1Periph_UART5,ENABLE); } /************************************************************************** * 函数名 : GpioInitialisation * 函数描述 : 设置各GPIO端口功能 * 输入参数 : 无 * 输出结果 : 无 * 返回值 : 无 **************************************************************************/ void GpioInitialisation(void) { /* 定义GPIO初始化结构体 GPIO_InitStructure*/ GPIO_InitTypeDef GPIO_InitStructure; /* 设置PA10,最大翻转频率为50MHz*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA , &GPIO_InitStructure); /* 设置USART3的Tx脚(PB.10)为第二功能推挽输出模式 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB , &GPIO_InitStructure); /* 设置USART3的Rx脚(PB.11)为浮空输入脚 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB , &GPIO_InitStructure); /* 设置UART5的Tx脚(PC.12)为第二功能推挽输出模式 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC , &GPIO_InitStructure); /* 设置UART5的Rx脚(PD.2)为浮空输入脚 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOD , &GPIO_InitStructure); /* 设置 GPIOA.4 为推挽输出,最大翻转频率为50MHz*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); } /************************************************************************** * 函数名 : SystickInitialisation * 函数描述 : 设置Systick定时器,重装载时间为20ms * 输入参数 : 无 * 输出结果 : 无 * 返回值 : 无 **************************************************************************/ void SystickInitialisation(void) { /* 失能Systick定时器 */ SysTick_CounterCmd(SysTick_Counter_Disable); /* 选择HCLK为Systick时钟源 */ SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); /* 清除Systick计数器 */ SysTick_CounterCmd(SysTick_Counter_Clear); /* 主频为72MHz,配置计数值为72000 * 20可以得到20ms定时间隔*/ SysTick_SetReload(9000*1000); /* 启动Systick定时器 */ SysTick_CounterCmd(SysTick_Counter_Enable); } void Delay_Second(void) { /* 启动Systick计数 */ SysTick_CounterCmd(SysTick_Counter_Enable); /* 等待Systick计数至0 */ while(SysTick_GetFlagStatus(SysTick_FLAG_COUNT) == 0); /* 失能Systick定时器 */ SysTick_CounterCmd(SysTick_Counter_Disable); /* 清除Systick计数器 */ SysTick_CounterCmd(SysTick_Counter_Clear); } void USART_Configuration(void) { /* 定义USART初始化结构体 USART_InitStructure */ USART_InitTypeDef USART_InitStructure; /* * 波特率为9600bps * 8位数据长度 * 1个停止位,无校验 * 禁用硬件流控制 * 禁止USART时钟 * 时钟极性低 * 在第2个边沿捕获数据 * 最后一位数据的时钟脉冲不从 SCLK 输出 */ USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; 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(USART3 , &USART_InitStructure); USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; 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(UART5 , &USART_InitStructure); /* 使能USART3 */ USART_Cmd(USART3 , ENABLE); USART_Cmd(UART5 , ENABLE); } void USART_Printf(USART_TypeDef* USARTx,char *pch) { /* 这里是判断'\0'是否到了字符串的行尾,这个字符是看不到的,字符串的结束符就是'\0' * 如果具体还有不懂的请看C语言,这里通过while()循环,逐个字符逐个字符的传输和显示 */ while(*pch != '\0') /* 我们这里用指针表示,*pch就是一个字符,pch就是该字符的地址 */ { USART_SendData(USARTx,*pch); /* 在这里我们将这个要显示的字符地址传输给另外一个函数 */ /* 当发送完一个字节后,检测一下“TDR(串口的数据传输寄存器)”是否为空了,因为有可能在一些 * 其他某些模式,缓冲寄存器可能会有很多数据,需要一点时间才能清空,其实增加了这句代码之后 * 会让我们的串口驱动更加健壮,在各种情况下都能正常稳定的工作 */ while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET); /* 以下是我们查看《STM32F103中文手册》获得494页24.6.1节 状态寄存器(USART_SR)章节 这里说的就是我们程序代码里的USART_FLAG_TXE这个标志位,发送完毕后,再进行标志清空,进行下一次传输 TXE:发送数据寄存器空 当TDR寄存器中的数据被硬件转移到移位寄存器的时候,该位被硬件置位。 0:数据还没有被转移到移位寄存器; 1:数据已经被转移到移位寄存器。 注意:单缓冲器传输中使用该位。*/ USART_ClearFlag(USARTx, USART_FLAG_TXE); pch++; /* 此时pch地址加1,指向下一个字符 */ } } [/mw_shl_code]


这是一个ARM多串口可以使用USART_Printf,我用这个串口发送数据,收到的数据都是正常的,但是发送AT指令的时候,GSM模块能够收到相应的指令,但是就是不执行,同样,我用电脑端发送同样的AT指令数据,GSM模块就会执行。
以前我用单片机,用同样的语句
printf(“at\r\n”);  它就执行对应的AT指令
但是现在,我用ARM发送
USART_Printf(USART1,“at\r\n”); 它能收到,但是就是不执行,数据格式一样!。。收到的也是61  74  0d  0a   !

所以有点疑惑了。。。


上面是我的原函数。。。。原子哥分析下,哪里的问题。。

最佳答案

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

谢谢各位大神指点,问题已经找到,电平不匹配问题。。。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

19

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2014-8-20
在线时间
0 小时
 楼主| 发表于 2014-8-20 16:40:40 | 显示全部楼层
谢谢各位大神指点,问题已经找到,电平不匹配问题。。。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-8-20 20:32:07 | 显示全部楼层
不应该哦.
你直接将发送出去的数据,用电脑串口助手接收看看.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

19

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2014-8-20
在线时间
0 小时
 楼主| 发表于 2014-8-21 08:14:45 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
电脑助手收到的是正确的字符,但是我昨天发现一个问题,字符是对的,但是ascii有时候不对,我转成字符显示,又对了。。。换了几个串口软件,结果一样。。。
回复

使用道具 举报

19

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2014-8-20
在线时间
0 小时
 楼主| 发表于 2014-8-21 09:33:50 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
换了个串口软件,发送出去的和接收到的都是正确的字符和ascii,我用单片机给GSM模块发送指令是正确的,就是用ARM发送有问题。。。用电脑端串口软件发送也是对的。。。完全搞不明白了。。。。
回复

使用道具 举报

4

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2012-12-19
在线时间
0 小时
发表于 2014-8-21 09:48:49 | 显示全部楼层
猜想可能的原因和你程序有关系,如果程序中有太多的定时中断之类的会影响字符发送。GSM模块对字符间超时比较严格,会认为发送失败。
目前在玩STM32,BBB,RPi
回复

使用道具 举报

19

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2014-8-20
在线时间
0 小时
 楼主| 发表于 2014-8-21 10:12:21 | 显示全部楼层
回复【5楼】w0rmis20:
---------------------------------
我用了定时器,我刚把原程序贴了。。。。
回复

使用道具 举报

4

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2012-12-19
在线时间
0 小时
发表于 2014-8-21 11:08:30 | 显示全部楼层
回复【6楼】fly0000:
---------------------------------
把定时器关掉试试
目前在玩STM32,BBB,RPi
回复

使用道具 举报

19

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2014-8-20
在线时间
0 小时
 楼主| 发表于 2014-8-21 11:34:52 | 显示全部楼层
回复【7楼】w0rmis20:
---------------------------------
我另外写了一段函数,不用定时器,也不行。。。
回复

使用道具 举报

4

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2012-12-19
在线时间
0 小时
发表于 2014-8-21 14:22:11 | 显示全部楼层
波特率对吗?
目前在玩STM32,BBB,RPi
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 12:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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