OpenEdv-开源电子网

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

跪求大神帮忙谢谢!STM32,串口接收数据,

[复制链接]

4

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
210
金钱
210
注册时间
2016-8-11
在线时间
65 小时
发表于 2016-8-24 10:09:09 | 显示全部楼层 |阅读模式
5金钱
#include "UsartHDev3.h"
#include "stm32f10x.h"
#include "UsartD.h"


//====================================================================
struct _UsartHDev3 UsartHDev3;

//RST·½Ïò2ù×÷
static void __RST_U3(unsigned char Flag)
{
        if(Flag)U3_RST_RXEN();      
        else U3_RST_TXEN();
}


struct _RcvLen const _HDev3_RcvLen = {
        12,                     //报头长度
        1,                      //命令长度
        1                        //CRC校验长度
};

//--------------------设备起始回调--------------------------
static signed char _HDev3_cbRcvdStart(struct _UsartD * const pUsartD)
{
        if(UsartHDev3.Flag & HDEV3_RCV_READY)return -6;//帧间隔太短,进制接收
        switch(pUsartD->RcvLen)
        {
                case 0:
                       
//                if((pUsartD->pRcvBuf[0] != 0xF0) && (pUsartD->pRcvBuf[0] != 0xD5))return -1;   //Ö¡í·′íÎó
//                if(pUsartD->pRcvBuf[0] == 0xD5)pUsartD->Flag |= MESSAGE_NEW;
                if(pUsartD->pRcvBuf[0] != 0x08) return -1;                   //èç1û2»êÇ08£¬·μ»Ø-1
//                if(pUsartD->pRcvBuf[0] == 0x08)pUsartD->Flag |= MESSAGE_NEW ;   //èç1ûêÇ08£¬½óêÕDÂμı¨ÎÄòÔ0x08¿aí·
//                else pUsartD->Flag &= ~MESSAGE_NEW;
                        break;
                case 1:
                        if(pUsartD->pRcvBuf[7] != 0x00)  return -2;
                        break;
                default:return -3;
        }
        return 0;
}

之前我知道一个帧头怎么修改的,但是现在我想把08 07 06 05 01 00 00 02 00 00 00 01这12个字节当成包头,然后接收并且判断一下前边5个字节,现在我不知道怎么写接收这12个字节,并且我还想在这里边做一个更新,和初始化长度,求大神指点,还有原子哥,我前几天刚买了咱们家的开发板,求帮忙谢谢!


最佳答案

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

开启串口接收中断,再设置一个数组存放接收到的数据,每进接收中断判断是否 为0x08,如果是则说明是包头,然后就开始接收数据放到数组里面去bool flag =false; char RecBuff[20]; char count=0; if(txData = =0x08) flag=true; if(flag) RecBuff[count++] = txData; if(count==12 && txData ==0x01) flag = false;
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

121

帖子

0

精华

高级会员

Rank: 4

积分
621
金钱
621
注册时间
2016-1-26
在线时间
150 小时
发表于 2016-8-24 10:09:10 | 显示全部楼层
本帖最后由 无休 于 2016-8-24 10:53 编辑

开启串口接收中断,再设置一个数组存放接收到的数据,每进接收中断判断是否 为0x08,如果是则说明是包头,然后就开始接收数据放到数组里面去bool  flag =false;
char RecBuff[20];
char count=0;

if(txData = =0x08)
  flag=true;
if(flag)
RecBuff[count++] = txData;
if(count==12 && txData ==0x01)
    flag = false;
回复

使用道具 举报

8

主题

99

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1136
金钱
1136
注册时间
2016-7-27
在线时间
84 小时
发表于 2016-8-24 10:25:26 | 显示全部楼层
帮顶。
回复

使用道具 举报

4

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
210
金钱
210
注册时间
2016-8-11
在线时间
65 小时
 楼主| 发表于 2016-8-24 10:28:30 | 显示全部楼层

谢谢,朋友,真的搞不明白,
回复

使用道具 举报

0

主题

21

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
345
金钱
345
注册时间
2016-8-16
在线时间
32 小时
发表于 2016-8-24 10:32:14 | 显示全部楼层
搞个接收中断,然后定义一个数组,每次中断都把接收到的数据丢数组里保存,
再弄一个判断,如果接收完成,数组从0开始记录
回复

使用道具 举报

4

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
210
金钱
210
注册时间
2016-8-11
在线时间
65 小时
 楼主| 发表于 2016-8-24 10:43:59 | 显示全部楼层
PPlucky 发表于 2016-8-24 10:32
搞个接收中断,然后定义一个数组,每次中断都把接收到的数据丢数组里保存,
再弄一个判断,如果接收完成, ...

朋友,恕我愚钝,能举个例子吗?谢谢你
回复

使用道具 举报

4

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
210
金钱
210
注册时间
2016-8-11
在线时间
65 小时
 楼主| 发表于 2016-8-24 10:53:15 | 显示全部楼层
无休 发表于 2016-8-24 10:49
开启串口接收中断,再设置一个数组存放接收到的数据,每进接收中断判断是否 为0x08,如果是则说明是包头, ...

我要判断0x08,0x07,0x06,0x05,0x01这5个字节,现在我就是我清楚接收的指令是什么。
回复

使用道具 举报

5

主题

121

帖子

0

精华

高级会员

Rank: 4

积分
621
金钱
621
注册时间
2016-1-26
在线时间
150 小时
发表于 2016-8-24 10:54:44 | 显示全部楼层
先判断是否获取到了包头,再判断包头是否正确就可以了!不过你这个包头太长了!
回复

使用道具 举报

4

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
210
金钱
210
注册时间
2016-8-11
在线时间
65 小时
 楼主| 发表于 2016-8-24 10:58:15 | 显示全部楼层
无休 发表于 2016-8-24 10:54
先判断是否获取到了包头,再判断包头是否正确就可以了!不过你这个包头太长了!

嗯嗯,就是您说的这样,但是我想问如果不先接收,怎么能判断是否获取到呢?不知道我说的对不对。
回复

使用道具 举报

5

主题

121

帖子

0

精华

高级会员

Rank: 4

积分
621
金钱
621
注册时间
2016-1-26
在线时间
150 小时
发表于 2016-8-24 11:02:55 | 显示全部楼层
串口每接收到一个字节,便会产生一个中断,在中断中接收这个字节(我给你的示例中的txData),并判断这个字节(txData)是否为你包头的首字节,如果是就接收包头剩余字节,看我给你的示例应该能懂
回复

使用道具 举报

4

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
210
金钱
210
注册时间
2016-8-11
在线时间
65 小时
 楼主| 发表于 2016-8-24 11:06:50 | 显示全部楼层
无休 发表于 2016-8-24 11:02
串口每接收到一个字节,便会产生一个中断,在中断中接收这个字节(我给你的示例中的txData),并判断这个字节 ...

示例呢?大神
回复

使用道具 举报

5

主题

121

帖子

0

精华

高级会员

Rank: 4

积分
621
金钱
621
注册时间
2016-1-26
在线时间
150 小时
发表于 2016-8-24 11:10:48 | 显示全部楼层
6楼写给你了啊
回复

使用道具 举报

4

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
210
金钱
210
注册时间
2016-8-11
在线时间
65 小时
 楼主| 发表于 2016-8-24 11:20:58 | 显示全部楼层

sorry,没看到,应该跟新慢了,谢谢朋友
回复

使用道具 举报

4

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
210
金钱
210
注册时间
2016-8-11
在线时间
65 小时
 楼主| 发表于 2016-8-24 14:40:50 | 显示全部楼层
无休 发表于 2016-8-24 10:49
开启串口接收中断,再设置一个数组存放接收到的数据,每进接收中断判断是否 为0x08,如果是则说明是包头, ...

能说一下这个txData是什么吗?是个数组?还是字节?我可以把txData怎么定义啊?谢谢
回复

使用道具 举报

5

主题

121

帖子

0

精华

高级会员

Rank: 4

积分
621
金钱
621
注册时间
2016-1-26
在线时间
150 小时
发表于 2016-8-24 15:13:35 | 显示全部楼层
遗失的伙伴 发表于 2016-8-24 14:40
能说一下这个txData是什么吗?是个数组?还是字节?我可以把txData怎么定义啊?谢谢

是字节啊!用于存放从串口中断中接受的字节!
unsigned char txData;
txData =USART_ReceiveData(USART1);
USART1为你的串口
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-1 10:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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