OpenEdv-开源电子网

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

USART_ReceiveData接收到的多个数据怎么保存起来

[复制链接]

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
发表于 2020-7-15 23:55:46 | 显示全部楼层 |阅读模式
3金钱
如题:我想要实现的效果是发送十六进制的0X25 0X35 0X26 0X28给串口,串口接受到后,单片机再执行其他的命令。可是实际上我的灯亮了,说明串口只接收到了第一个数据0x25。问题如下1、怎样才能将0X25 0X35 0X26 0X28都发送给串口,是一次只能发一个字节的数据,当第二个字节的数据发送过来就将第一个替换掉,还是只能有第一个字节的数据保留?
2、串口接收到的数据怎样才能定义为一个数组。
/**************************************代码如下************************************************************/
void USART1_IRQHandler(void)                        //串口1中断服务程序
{
        u8 Res;
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断
                {
                Res =USART_ReceiveData(USART1);        //读取接收到的数据
                        if (Res==0X25)                          //LED1亮了,说明接受到的数据是0X25,那么后面的0X35 0X26 0X28是没有接收到吗
                        {
                                 LED1=0;            
                       
                        }

/**********************************************************************************************************/
串口发送数据.jpg

最佳答案

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

typedef struct{ uint8_t Rx_Buff[64]; uint8_t Rx_Count; uint16_t Rx_TimeOutCount; uint8_t Rx_State; }RxData_typedef; 每次进中断,将数据写到Rx_Buff[Rx_Count++]中,并且超时TimeOut清零,注意缓存溢出。定时器做超时累加和判断。如果超时多少ms就任务接收好了,State置1,主循环判断state状态
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

459

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4500
金钱
4500
注册时间
2018-5-14
在线时间
962 小时
发表于 2020-7-15 23:55:47 | 显示全部楼层
王大爷爱吃鱼 发表于 2020-7-16 15:23
因为我发送的数据比较简单,所以就不用环形缓冲区。现在我电脑给单片机发送的是{0X25 0X35 0X26 0X28}的 ...

typedef struct{
   uint8_t Rx_Buff[64];
   uint8_t Rx_Count;
   uint16_t Rx_TimeOutCount;
   uint8_t Rx_State;
}RxData_typedef;
每次进中断,将数据写到Rx_Buff[Rx_Count++]中,并且超时TimeOut清零,注意缓存溢出。定时器做超时累加和判断。如果超时多少ms就任务接收好了,State置1,主循环判断state状态
回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-7-16 14:36:45 | 显示全部楼层
帮顶,顶上去~
回复

使用道具 举报

2

主题

459

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4500
金钱
4500
注册时间
2018-5-14
在线时间
962 小时
发表于 2020-7-16 14:40:28 | 显示全部楼层
做个串口接收缓存,每次串口进入将数据写缓存,在主循环中判断缓存数据内容
回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-7-16 15:23:00 | 显示全部楼层
姚先起 发表于 2020-7-16 14:40
做个串口接收缓存,每次串口进入将数据写缓存,在主循环中判断缓存数据内容

因为我发送的数据比较简单,所以就不用环形缓冲区。现在我电脑给单片机发送的是{0X25 0X35 0X26 0X28}的数据,请问我应该怎么做一个判断,假如我单片机接收到了这个数据,那么我就让LED0亮,否则我就让LED0灭。判断的这个地方,是我没想通的,不知有何见解~
回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-7-16 16:53:40 | 显示全部楼层
姚先起 发表于 2020-7-16 15:33
typedef struct{
   uint8_t Rx_Buff[64];
   uint8_t Rx_Count;

感觉还是不太对。假如这样做我怎么保证我接收到的是{0X25 0X35 0X26 0X28}呢,假如我接收到的是{0X11 0X12 0X13 0X14}怎么判断。用缓冲区这种方法只能保证接受的数据先进先出,不会丢失吧。而且接受到的数据也是以字节的格式保存吧,并不是数组的格式保存对不对。可能还是我没理解清楚。而且对于你的这个结构体我也没完全看懂~
回复

使用道具 举报

2

主题

459

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4500
金钱
4500
注册时间
2018-5-14
在线时间
962 小时
发表于 2020-7-17 08:54:09 | 显示全部楼层
王大爷爱吃鱼 发表于 2020-7-16 16:53
感觉还是不太对。假如这样做我怎么保证我接收到的是{0X25 0X35 0X26 0X28}呢,假如我接收到的是{0X11 0X1 ...

自己理解吧,你连基本的收取数据都没做到,还谈判断?
回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3888
金钱
3888
注册时间
2017-3-7
在线时间
1694 小时
发表于 2020-7-17 10:18:48 | 显示全部楼层
判断就把你接受到的数据挨个比较呗,是你要的就做对应动作,不是的话就扔了就行了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 10:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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