OpenEdv-开源电子网

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

很奇怪串口接收不到数据,所有的都设置了,也看了例程都一样啊,求大神帮忙

[复制链接]

6

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2017-10-13
在线时间
22 小时
发表于 2017-10-13 17:34:03 | 显示全部楼层 |阅读模式
10金钱
新人,没办法就这么多金钱。
用的是攀藤pm2.5传感器,下面是我的程序主程序:

int main(void)
{
       bspgpioinit();         //引脚配置(这边是连接到74hc595的4个引脚配置)

最佳答案

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

GPIO_initstructRX.GPIO_Pin=GPIO_Pin_10; GPIO_initstructRX.GPIO_Pin=GPIO_Mode_IN_FLOATING;
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7645
金钱
7645
注册时间
2016-11-30
在线时间
648 小时
发表于 2017-10-13 17:34:04 | 显示全部楼层
蛋白质khun 发表于 2017-10-14 16:53
我又试了一下发送,发现也无法发送,是我上面放入程序有哪边不对或者漏写什么了嘛。RXNE和txne都无法置1, ...

GPIO_initstructRX.GPIO_Pin=GPIO_Pin_10;
        GPIO_initstructRX.GPIO_Pin=GPIO_Mode_IN_FLOATING;
回复

使用道具 举报

6

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2017-10-13
在线时间
22 小时
 楼主| 发表于 2017-10-13 17:34:57 | 显示全部楼层
新人,没办法就这么多金钱。
用的是攀藤pm2.5传感器,下面是我的程序
主程序:
int main(void)
{
       bspgpioinit();         //引脚配置(这边是连接到74hc595的4个引脚配置)
        USART_Config();
        while(1)
        {
                        bsprecervebyte(USART1);  //接收数据显示到数码管
        }
}
引脚配置源文件:
void bspgpioinit(void)
{
        GPIO_InitTypeDef gpio_initoe,gpio_initser,gpio_initrck,gpio_initsck;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  gpio_initoe.GPIO_Pin=GPIO_Pin_11;
        gpio_initoe.GPIO_Mode=GPIO_Mode_Out_OD;
        gpio_initoe.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &gpio_initoe);
  gpio_initser.GPIO_Pin=GPIO_Pin_7;
        gpio_initser.GPIO_Mode=GPIO_Mode_Out_PP;
        gpio_initser.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &gpio_initser);
  gpio_initrck.GPIO_Pin=GPIO_Pin_10;
        gpio_initrck.GPIO_Mode=GPIO_Mode_Out_PP;
        gpio_initrck.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &gpio_initrck);
  gpio_initsck.GPIO_Pin=GPIO_Pin_1;
        gpio_initsck.GPIO_Mode=GPIO_Mode_Out_PP;
        gpio_initsck.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &gpio_initsck);
        GPIO_SetBits(GPIOB, GPIO_Pin_11);
        GPIO_SetBits(GPIOA, GPIO_Pin_7);
        GPIO_SetBits(GPIOB, GPIO_Pin_10);
        GPIO_SetBits(GPIOA, GPIO_Pin_1);
}
串口配置源文件:
         static u16 tep,buf0,buf1,buf2,Res;
void USART_Config(void)
{
        GPIO_InitTypeDef GPIO_initstructRX,GPIO_initstructTX;
        USART_InitTypeDef USART_initstruct;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
        GPIO_initstructRX.GPIO_Pin=GPIO_Pin_10;
        GPIO_initstructRX.GPIO_Pin=GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA, &GPIO_initstructRX);
        GPIO_initstructTX.GPIO_Pin=GPIO_Pin_9;
        GPIO_initstructTX.GPIO_Pin=GPIO_Mode_AF_PP;
  GPIO_initstructTX.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_initstructTX);
        USART_initstruct.USART_BaudRate=9600;
        USART_initstruct.USART_WordLength=USART_WordLength_8b;
        USART_initstruct.USART_StopBits=USART_StopBits_1;
        USART_initstruct.USART_HardwareFlowControl=USART_Mode_Rx | USART_Mode_Tx;
        USART_initstruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
        USART_initstruct.USART_Parity=USART_Parity_No;
        USART_Init(USART1, &USART_initstruct);
        USART_Cmd(USART1, ENABLE);
}

void bsprecervebyte(USART_TypeDef* pUSARTx)  //接收数据
{
         static char start=0;
         static uint16_t USART1_RX_STA;
         while(USART_GetFlagStatus(pUSARTx, USART_FLAG_RXNE)==RESET);
         
        Res =USART_ReceiveData(pUSARTx);     //读取接收到的数据  
        if(Res == 0x42)             //如果接收的第一位数据是0X42  
        {  
            USART1_RX_STA = 0;    //让数组索引值从0开始  
            start = 1;              //变量用于确定第二位是否接收到了0X4D  
        }  
        start = 1;
        if(start == 1)  
        {  
            switch (USART1_RX_STA)  
            {  
                case 1:  
                    buf0 = Res ;    break;      //接收0x4D  
                case 6:  
                    buf1 = Res ;    break;      //接收大气环境下PM2.5高8位  
                case 7:  
                    buf2 = Res ;    break;      //接收大气环境下PM2.5低8位  
                default:    break;  
            }  
            USART1_RX_STA++;  
            if(USART1_RX_STA >= 8 && (0x4d == buf0))  
            {   
                start  = 0;  
                USART1_RX_STA=0;                //对static类型赋初值  
                USART_ITConfig(USART1,USART_IT_RXNE,DISABLE);   //关闭接收终端,由定时器中断打开  
                tep = (buf1<<8) + buf2;  
               
                numdisplay(tep);     //把pm2.5值传给74hc595程序,整个程序没错,我验证过
            }  
        }                                               
}
这是所有程序,主要应该是卡在了等待接收到数据那边,不知道为什么。求大神啊
回复

使用道具 举报

15

主题

317

帖子

0

精华

高级会员

Rank: 4

积分
866
金钱
866
注册时间
2015-2-12
在线时间
355 小时
发表于 2017-10-13 17:53:15 | 显示全部楼层
没有仔细阅读楼主的程序,但提醒如下:
1、UART1 端口TXD RXD是重映射的,所以需要启用 RCC_APB2Periph_AFIO 即:RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO, ENABLE);
2、最好使能接收中断,用中断方式去接收串口消息。从程序看楼主用的查询方式。
3、由第二条引申的注意事项:
                               (1)若采用查询方式,务必不要将接收中断方式使能。
                               (2)若采用中断方式接收数据,务必使能接收中断,并在中断函数void USART1_IRQHandler(void)中,加入你的接收程序调用。
回复

使用道具 举报

6

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2017-10-13
在线时间
22 小时
 楼主| 发表于 2017-10-13 21:34:10 来自手机 | 显示全部楼层
csmjmcc 发表于 2017-10-13 17:53
没有仔细阅读楼主的程序,但提醒如下:
1、UART1 端口TXD RXD是重映射的,所以需要启用 RCC_APB2Periph_AF ...

我确实没有打开afio的时钟,可是pa9pa10的第二功能是usart1啊,不是重映射吧?这个也需要打开afio的时钟吗
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3772
金钱
3772
注册时间
2015-4-26
在线时间
765 小时
发表于 2017-10-13 21:37:22 | 显示全部楼层
软件没问题就看硬件
我有故事,你有酒吗
回复

使用道具 举报

6

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2017-10-13
在线时间
22 小时
 楼主| 发表于 2017-10-13 21:45:59 来自手机 | 显示全部楼层
来俩不甜的 发表于 2017-10-13 21:37
软件没问题就看硬件

好的,我明天看看传感器和和串口助手通信吧,看看传感器还行不行
回复

使用道具 举报

6

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2017-10-13
在线时间
22 小时
 楼主| 发表于 2017-10-14 09:03:44 | 显示全部楼层
自己顶啊,主要是我找了一天了,没找到问题,求大神啊
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7645
金钱
7645
注册时间
2016-11-30
在线时间
648 小时
发表于 2017-10-14 10:06:35 | 显示全部楼层
建议还是用串口中断来接收吧
回复

使用道具 举报

6

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2017-10-13
在线时间
22 小时
 楼主| 发表于 2017-10-14 10:23:08 | 显示全部楼层
lvkanger 发表于 2017-10-14 10:06
建议还是用串口中断来接收吧

试了一下中断还是不可以 我上面的程序有问题吗,好像就卡在了接收数据那里,难道我还有什么没打开吗
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7645
金钱
7645
注册时间
2016-11-30
在线时间
648 小时
发表于 2017-10-14 10:33:21 | 显示全部楼层
蛋白质khun 发表于 2017-10-14 10:23
试了一下中断还是不可以 我上面的程序有问题吗,好像就卡在了接收数据那里,难道我还有什么没打开吗

进中断了嘛?
回复

使用道具 举报

6

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2017-10-13
在线时间
22 小时
 楼主| 发表于 2017-10-14 10:40:51 | 显示全部楼层

没有,我怀疑是没接收到数据,我都打开了啊,难道攀藤传感器需要给他发送一个指令才传输?我看到规格书说上电自动传输啊
回复

使用道具 举报

6

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2017-10-13
在线时间
22 小时
 楼主| 发表于 2017-10-14 16:53:20 | 显示全部楼层
我又试了一下发送,发现也无法发送,是我上面放入程序有哪边不对或者漏写什么了嘛。RXNE和txne都无法置1,等于是,串口无法用,是什么问题啊
回复

使用道具 举报

6

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2017-10-13
在线时间
22 小时
 楼主| 发表于 2017-10-18 09:20:15 | 显示全部楼层
lvkanger 发表于 2017-10-17 20:34
GPIO_initstructRX.GPIO_Pin=GPIO_Pin_10;
        GPIO_initstructRX.GPIO_Pin=GPIO_Mode_IN_FLOATING ...

!!!啊呀!谢谢!!我好蠢啊,写错了,我检查的时候也没注意到,以为自己肯定写的是mode,都只看等号后面的!!谢谢了。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-22 06:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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