OpenEdv-开源电子网

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

[未解决]再不发帖没救了..关于串口接收字符串原子实在没说清,新手困扰!

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2014-3-1
在线时间
0 小时
发表于 2014-3-20 11:26:41 | 显示全部楼层 |阅读模式
先贴自己写的程序。(望大家帮忙修正!)
说明:我困惑的是如何在串口接收字符串后并进行判断执行相应操作,一个字节还行,假如字符串就不行了
这个程序对于新手来说很重要啊!要从串口助手控制东西也需要它啊!
资料也老实认真看了,论坛也翻了无果

如下程序是要操作:
1.接收数据然后放入BUFF.【接收到"["为开始持续放入数据到BUFF,当接收到"]"或者数组取完了加结尾标识结束】
2.判断buff中的数据是不是"abc"这个字符串
3.判断正确LED闪烁一次

#define Z 20
unsigned char GetDataBuff[Z];
unsigned char Data_Flag = 0;
unsigned char Full = 0;

void USART1_IRQHandler(void)                 //串口中断1服务函数
{
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收缓存器非空
{
if(GetDataBuff[Data_Flag]=='[')                                      //接收到文件头
Data_Flag = 0;                                                            
else if(!Full)//不是满的
{
GetDataBuff[Z] = USART_ReceiveData(USART1); //从串口1接收数据存入buff中
if(GetDataBuff[Data_Flag]==']'||Data_Flag++==(Z-1)) //如果接收到"]"或者20个数组中没有东西了
{
GetDataBuff[Data_Flag]='\0'; //在末尾加上结尾标识
Full = 1; //buff接收完成
}
 }
}
if(GetDataBuff[Data_Flag] == 'a'&&'b'&&'c') //判断buff中数据是不是"abc"三个字符
{
LED0 =! LED0;                                        //是的话LED闪烁一次
delay_ms(200);
}
if(GetDataBuff[Data_Flag] =='c'&&'d' )        //判断数据是不是"cd"
{
LED1 =! LED1;
delay_ms(200);
}
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-3-20 12:18:11 | 显示全部楼层
回复【楼主位】UltraFire:
---------------------------------
可以参考原子哥的USMART调试组件
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 0 反对 1

使用道具 举报

1

主题

15

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2013-10-15
在线时间
0 小时
发表于 2014-3-20 12:21:15 | 显示全部楼层
首先,建议楼主提问的时候注意一下排版,字儿太大的话就容易造成版面的混乱,要是程序长一点,估计别人都没有心情跟你看。
看了一下你的程序,按照我的理解,
if(GetDataBuff[Data_Flag] == 'a'&&'b'&&'c')
楼主这句话的意思是直接判断整个数组是否为abc了,这显然是错误的,GetDataBuff[Data_Flag]是指GetDataBuff里的某一个数据,不可能在等于a的同时又等于b
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2014-3-14
在线时间
0 小时
发表于 2014-3-20 14:02:11 | 显示全部楼层
你是要读取长度不一的数据是吧?可以加判断条件,比如10ms没收到数据就判断这一帧数据接收完成。接收第一个数据时开启定时器,然后每次进入接收中断时就把定时器counter清零,当最后一个数据接受完,10ms定时到了之后,进入定时器中断中把接收标志置位并关闭定时器就行。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-3-20 17:14:42 | 显示全部楼层
楼主的排版要改善。
另外,你说我的实在没说清楚,那你现在这个代码,可否介绍下你的思路呢?
最后,代码至少把中断函数的贴完吧。。。
否则不知道你后续干了什么事...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-13 09:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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