专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
(简单串口程序)debug无法进入while循环
2019-07-21 04:05
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
2959
18
1420
本帖最后由 1208 于 2019-3-18 15:22 编辑
单片机用stm32F103C8T6,代码很简单,传感器是主动上传的,1s一个数据,通过usart1读取,中断是这样写的。1.44寸屏幕可以直接读取到传感器浓度值(或者USB转TLL串口助手也行),但是debug的话怎么也进不了wihle循环(或者说USART_RX_STA这个值一直就是4000不是8000 ),新手一枚,想知道是哪里错了,求大神指教。
气体传感器.rar
(349.91 KB, 下载次数: 12)
2019-3-18 14:25 上传 点击文件名下载附件
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
坠灬辰
1楼-- · 2019-07-22 03:29
你这个太乱了,就算你接收到数据了,你也基本找不到你数据的位置,而且你还可能数据越界
加载中...
坠灬辰
2楼-- · 2019-07-22 09:18
你重新整理下逻辑,就可以了
加载中...
nabla
3楼-- · 2019-07-22 10:38
精彩回答 2 元偷偷看……
加载中...
坠灬辰
4楼-- · 2019-07-22 13:47
unsigned int flag = 0;
void USART1_IRQHandler(void) //′®¿ú1ÖD¶Ï·tÎñ3ìDò
{
u8 Res;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //½óêÕÖD¶Ï(½óêÕμ½μÄêy¾Y±ØDëêÇ0x0d 0x0a½áÎ2)
{
Res =USART_ReceiveData(USART1); //¶á衽óêÕμ½μÄêy¾Y
if((USART_RX_STA&0x8000)==0)//½óêÕÎ′íê3é
{
if(Res == 0xFF)
{
flag |= 0x4000;
}
if(Res == 0x86) //¿aê¼½óêÕêy¾Y
{
flag |= 0x1000;
}
if( (flag&0x4000) && (flag&0x1000) )
{//±£′æêy¾Y
USART_RX_BUF[USART_RX_STA&0x0fff]=Res;
USART_RX_STA ++;
if( (USART_RX_STA&0x0fff) > 6){
USART_RX_STA |= 0x8000;
flag = 0;
}
}
}
}
}
加载中...
坠灬辰
5楼-- · 2019-07-22 16:06
这样子应该能满足你的需求,但是最好做状态机
加载中...
nashui_sx
6楼-- · 2019-07-22 20:41
本帖最后由 nashui_sx 于 2019-3-19 16:31 编辑
USART_ITConfig(USART1, USART_IT_IDLE, ENABLE); //开启串口空闲IDEL中断
void USART1_IRQHandler(void) //串口1中断服务程序
{
u8 Res;
if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)//空闲中断
{
USART_RX_STA |= 0x8000;
USART_ReceiveData(USART1); // Clear IDLE interrupt flag bit
}
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
Res =USART_ReceiveData(USART1); //读取接收到的数据
if((USART_RX_STA&0x8000)==0)
USART_RX_BUF[USART_RX_STA++]=Res;
if(USART_RX_STA>100)USART_RX_STA |= 0x8000;
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
}
}
while(1)
{
if( USART_RX_STA&0x8000)
{
if(USART_RX_BUF[0]==0xff)
{
if(USART_RX_BUF[USART_RX_STA&0x3fff-1]==FucCheckSum(USART_RX_BUF,USART_RX_STA&0x3fff))//校验
{
if(USART_RX_BUF[1]==0x86)//处理命令
{
printf("nongdu=%d ",USART_RX_BUF[2]*256+USART_RX_BUF[3]);
}
//...
}
}
USART_RX_STA=0;
}
}
u8 FucCheckSum(unsigned char *i,u32 ln)
{
unsigned char j,tempq=0;
i+=1;
for(j=0;j<ln-2;j++)
{
tempq+=*i;
i++;
}
tempq=(~tempq)+1;
return tempq;
}
加载中...
上一页
1
2
3
下一页
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
STM32开发板免费用活动
7 个回答
stm32 处理 DHT11占用太多时间,大家程序是怎么设计的
8 个回答
分享一个STM32单片机做的离线编程器代码
9 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
void USART1_IRQHandler(void) //′®¿ú1ÖD¶Ï·tÎñ3ìDò
{
u8 Res;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //½óêÕÖD¶Ï(½óêÕμ½μÄêy¾Y±ØDëêÇ0x0d 0x0a½áÎ2)
{
Res =USART_ReceiveData(USART1); //¶á衽óêÕμ½μÄêy¾Y
if((USART_RX_STA&0x8000)==0)//½óêÕÎ′íê3é
{
if(Res == 0xFF)
{
flag |= 0x4000;
}
if(Res == 0x86) //¿aê¼½óêÕêy¾Y
{
flag |= 0x1000;
}
if( (flag&0x4000) && (flag&0x1000) )
{//±£′æêy¾Y
USART_RX_BUF[USART_RX_STA&0x0fff]=Res;
USART_RX_STA ++;
if( (USART_RX_STA&0x0fff) > 6){
USART_RX_STA |= 0x8000;
flag = 0;
}
}
}
}
}
USART_ITConfig(USART1, USART_IT_IDLE, ENABLE); //开启串口空闲IDEL中断
void USART1_IRQHandler(void) //串口1中断服务程序
{
u8 Res;
if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)//空闲中断
{
USART_RX_STA |= 0x8000;
USART_ReceiveData(USART1); // Clear IDLE interrupt flag bit
}
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
Res =USART_ReceiveData(USART1); //读取接收到的数据
if((USART_RX_STA&0x8000)==0)
USART_RX_BUF[USART_RX_STA++]=Res;
if(USART_RX_STA>100)USART_RX_STA |= 0x8000;
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
}
}
while(1)
{
if( USART_RX_STA&0x8000)
{
if(USART_RX_BUF[0]==0xff)
{
if(USART_RX_BUF[USART_RX_STA&0x3fff-1]==FucCheckSum(USART_RX_BUF,USART_RX_STA&0x3fff))//校验
{
if(USART_RX_BUF[1]==0x86)//处理命令
{
printf("nongdu=%d ",USART_RX_BUF[2]*256+USART_RX_BUF[3]);
}
//...
}
}
USART_RX_STA=0;
}
}
u8 FucCheckSum(unsigned char *i,u32 ln)
{
unsigned char j,tempq=0;
i+=1;
for(j=0;j<ln-2;j++)
{
tempq+=*i;
i++;
}
tempq=(~tempq)+1;
return tempq;
}
一周热门 更多>