专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
很奇怪串口接收不到数据,所有的都设置了,也看了例程都一样啊,求大神帮忙
2019-08-13 18:53
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
15219
13
1403
新人,没办法就这么多金钱。
用的是攀藤pm2.5传感器,下面是我的程序主程序:
int main(void)
{
bspgpioinit(); //引脚配置(这边是连接到74hc595的4个引脚配置)
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
13条回答
蛋白质khun
2019-08-14 00:02
新人,没办法就这么多金钱。
用的是攀藤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程序,整个程序没错,我验证过
}
}
}
这是所有程序,主要应该是卡在了等待接收到数据那边,不知道为什么。求大神啊
加载中...
查看其它13个回答
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
用的是攀藤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程序,整个程序没错,我验证过
}
}
}
这是所有程序,主要应该是卡在了等待接收到数据那边,不知道为什么。求大神啊
一周热门 更多>