野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13322|回复: 8

通过串口和传感器连接,接收不到传感器传回的数据

[复制链接]
发表于 2017-4-23 19:36:01 | 显示全部楼层 |阅读模式
本帖最后由 hld0711 于 2017-4-23 20:17 编辑

我尝试用stm32通过串口连接传感器,然后将传感器数据回传给stm32。USART1的A9、A10是用来给stm32与pc机通信的,USART2的A2、A3是用来给传感器和stm32通信的。传感器的RX TX和A2 A3已经交叉相连。测试时,我在pc上发送数据给stm32,能够返回数据,但是一旦切换到usart2上,数据传输完毕之后,就接收不到传感器传回的数据。我刚入门,有一些地方还不是太懂,请问是哪边出了问题呢?
下面是我的代码:
  1. //main.c
  2. #include "STM32F1.h"
  3. #include "bsp_led.h"

  4. void Delay(__IO uint32_t nCount)     //简单的延时函数
  5. {
  6.     for(; nCount != 0; nCount--);
  7. }

  8. int main(void)
  9. {
  10.     uint16_t DB[5]={0x01,0x02,0x03,0x04,0x05};//发送给传感器命令,接收到后可回传相应数据
  11.     uint8_t i;
  12.     delay_init();                                                                             //延时函数初始化      
  13.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  14.     uart_init(38400);            
  15.     LED_GPIO_Config();   
  16.     LEDG( ON );            // 亮
  17.     Delay(0x0FFFFF);
  18.     LEDG( OFF);          // 灭            
  19.      USART_ClearFlag(USART2,USART_FLAG_TC);
  20.     for(i=0;i<5;i++)
  21.     {
  22.         USART_SendData(USART2,DB[i]);
  23.         while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET);
  24.     }
  25.         LEDB(ON);
  26.         Delay(0x0FFFFF);
  27.         LEDB(OFF);
  28.   while(1)
  29.     {  LEDR( ON );              // 亮
  30.         LEDG( ON );              // 亮
  31.         LEDB( ON );        
  32.         Delay(0x0FFFFF);
  33.         LEDR( OFF);          // 灭
  34.         LEDG( OFF );          // 灭
  35.         LEDB( OFF );          // 灭   
  36.         Delay(0x0FFFFF);
  37.     }
  38. }

复制代码
  1. usart.c
  2. #include "sys.h"
  3. #include "usart.h"      
  4. //////////////////////////////////////////////////////////////////////////////////      
  5. //如果使用ucos,则包括下面的头文件即可.
  6. #if SYSTEM_SUPPORT_OS
  7. #include "includes.h"                    //ucos 使用      
  8. #endif

  9. #if EN_USART1_RX   //如果使能了接收
  10. //串口1中断服务程序
  11. //注意,读取USARTx->SR能避免莫名其妙的错误      
  12. u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
  13. //接收状态
  14. //bit15,    接收完成标志
  15. //bit14,    接收到0x0d
  16. //bit13~0,    接收到的有效字节数目
  17. u16 USART_RX_STA=0;       //接收状态标记      
  18.   
  19. void uart_init(u32 bound)
  20. {
  21.   //GPIO端口设置
  22.   GPIO_InitTypeDef GPIO_InitStructure;
  23.     USART_InitTypeDef USART_InitStructure;
  24.     NVIC_InitTypeDef NVIC_InitStructure;
  25.      
  26.     //usart1
  27.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);    //使能USART1,GPIOA时钟
  28.   
  29.     //USART1_TX   GPIOA.9
  30.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
  31.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  32.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出
  33.   GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
  34.    
  35.   //USART1_RX      GPIOA.10初始化
  36.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
  37.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  38.   GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  

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

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

  53.   USART_Init(USART1, &USART_InitStructure); //初始化串口1
  54.   USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
  55.   USART_Cmd(USART1, ENABLE);                    //使能串口1

  56. //usart2
  57.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);   //使能USART2,
  58.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   //使能GPIOA时钟

  59.     //USART2_TX   GPIOA.2
  60.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2
  61.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  62.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   //复用推挽输出
  63.   GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9

  64.   //USART2_RX     GPIOA.3初始化
  65.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA.3
  66.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  67.   GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA  

  68.   //Usart2 NVIC 配置
  69.   NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
  70.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
  71.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;      //子优先级3
  72.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //IRQ通道使能
  73.     NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器

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

  80.   USART_Init(USART2, &USART_InitStructure); //初始化串口2
  81.   USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接受中断
  82.   USART_Cmd(USART2, ENABLE);                    //使能串口2
  83. }

  84. void USART2_IRQHandler(void)                    //串口2中断服务程序
  85.     {
  86.     u8 Res;
  87.     static char i=0, start=0;
  88.     if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  //接收中断
  89.         {
  90.             Res =USART_ReceiveData(USART2); //读取接收到的数据
  91.         }
  92.   }

  93. void USART1_IRQHandler(void)                    //串口1中断服务程序
  94. {
  95.     u8 Res;
  96.     #if SYSTEM_SUPPORT_OS         //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
  97.         OSIntEnter();   
  98.     #endif
  99.     if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
  100.     {
  101.         Res =USART_ReceiveData(USART1);    //读取接收到的数据
  102.     }
  103.     #if SYSTEM_SUPPORT_OS     //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
  104.     OSIntExit();                                               
  105.     #endif
  106. }
  107. #endif  
复制代码


回复

使用道具 举报

发表于 2017-4-23 21:41:11 | 显示全部楼层
串口的波特率与传感器的波特率一致吗?还有不懂你是没贴代码还是啥,你只有在串口中断里用Res接收单个字节,并没有把接收到的字节存储起来,那这样前面的数据就全丢了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-23 22:40:38 | 显示全部楼层
qq735217445 发表于 2017-4-23 21:41
串口的波特率与传感器的波特率一致吗?还有不懂你是没贴代码还是啥,你只有在串口中断里用Res接收单个字节 ...

波特率我设置成一样的了。存储数据的语句我的确没有写,现在只是想能够回显到pc的串口调试助手上。
回复 支持 反对

使用道具 举报

发表于 2017-4-24 08:59:48 | 显示全部楼层
hld0711 发表于 2017-4-23 22:40
波特率我设置成一样的了。存储数据的语句我的确没有写,现在只是想能够回显到pc的串口调试助手上。

没看到你的回显代码在哪啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-24 09:45:50 | 显示全部楼层
qq735217445 发表于 2017-4-24 08:59
没看到你的回显代码在哪啊

哦,那请问该如何添加呢?
回复 支持 反对

使用道具 举报

发表于 2017-4-24 11:05:06 | 显示全部楼层
hld0711 发表于 2017-4-24 09:45
哦,那请问该如何添加呢?

如果你想知道传感器传回的数据,有一个比较简单的做法,把传感器的TX同时接到单片机的RX和PC的RX,这样两边都可以收到,PC上就可以直接看到他传回了什么
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-24 13:44:21 | 显示全部楼层
qq735217445 发表于 2017-4-24 11:05
如果你想知道传感器传回的数据,有一个比较简单的做法,把传感器的TX同时接到单片机的RX和PC的RX,这样两 ...

好谢谢,我去试试,我想问一下我发送16进制数据的代码有问题吗?如何调试时看是否传输数据了,看DR吗,还是看USART1_RX_BUF?
回复 支持 反对

使用道具 举报

发表于 2017-4-24 14:22:39 | 显示全部楼层
hld0711 发表于 2017-4-24 13:44
好谢谢,我去试试,我想问一下我发送16进制数据的代码有问题吗?如何调试时看是否传输数据了,看DR吗,还 ...

和PC连,在串口调试助手上可以看到
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-25 22:11:47 | 显示全部楼层

RE: 通过串口和传感器连接,接收不到传感器传回的数据

qq735217445 发表于 2017-4-24 14:22
和PC连,在串口调试助手上可以看到

代码我改了下,传输16进制数据部分没问题了。但是传感器依旧无法接收到数据(接收到后应该会闪灯,没有),难道是初始化usart2部分有问题吗?我想能否可以把命令从stm32通过usart2直接传输给传感器?

  1. for(i=0;i<5;i++)
  2.     {
  3.         USART_SendData(USART2,DB[i]);
  4.         while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET);
  5.     }
复制代码
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-1-15 21:52 , Processed in 0.028877 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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