OpenEdv-开源电子网

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

STM323F103C8T6串口1接收数据包,怎么解析出单个字节

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2021-1-11
在线时间
4 小时
发表于 2021-1-27 17:10:31 | 显示全部楼层 |阅读模式
1金钱
串口一中断服务函数如下:
void USART1_IRQHandler(void)                        //串口1中断服务程序
        {
        u16 Res;
  u8 lencnt=0;       
  u8 Datacount=2;       
  u8 Sum=0;       
               
#if SYSTEM_SUPPORT_OS                 //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
        OSIntEnter();   
#endif
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断
                {
                  USART_RX_BUF[0] = USART_ReceiveData(USART1);        //读取接收到的数据
                        USART_SendData(USART1,USART_RX_BUF[0]);
                   
     }
#if SYSTEM_SUPPORT_OS         //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
        OSIntExit();                                                                                           
#endif
}
#endif         
接收到一串数据:    FF 01 07 01 00 DA 00 00 00 E2   ,怎么讲第5、6个字节提取出来      
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

87

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
250
金钱
250
注册时间
2019-5-11
在线时间
39 小时
发表于 2021-1-27 17:10:32 | 显示全部楼层
本帖最后由 ma3264175 于 2021-1-29 15:28 编辑
  1. 串口一中断服务函数如下:
  2. void USART1_IRQHandler(void)                        //串口1中断服务程序
  3.         {
  4.        u16 Res;
  5.   u8 lencnt=0;      
  6. u8 Datacount=2;      
  7.   u8 Sum=0;      
  8.                
  9. #if SYSTEM_SUPPORT_OS                 //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
  10.         OSIntEnter();   
  11. #endif
  12.         if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断
  13.                 {
  14.                   USART_RX_BUF[0] = USART_ReceiveData(USART1);        //读取接收到的数据
  15.                         USART_SendData(USART1,USART_RX_BUF[0]);
  16.                   
  17.      }
  18. #if SYSTEM_SUPPORT_OS         //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
  19.         OSIntExit();                                                                                          
  20. #endif
  21. }
  22. #endif         
  23. 接收到一串数据:    FF 01 07 01 00 DA 00 00 00 E2   ,怎么讲第5、6个字节提取出来   
  24. --------------------------------------
  25. 思路:
  26. 加入全局变量 len
  27. 将你的接受缓冲器改为USART_RX_BUF[len++]
  28. 这样你得到的 数据就是
  29. USART_RX_BUF[0]=0xFF;
  30. USART_RX_BUF[1]=0x01;



  31. USART_RX_BUF[9]=0x0e2;

  32. 你按照你需要的取就好了
  33. ---------------------------------------
  34. 改写:

  35. u8 USART_RX_BUF[10];
  36. u8 deal_buf[10];
  37. u8 deal_flag=0;
  38. u8 len=0;

  39. void USART1_IRQHandler(void)                        //串口1中断服务程序
  40.         {
  41. //        u16 Res;
  42. //  u8 lencnt=0;      
  43. //  u8 Datacount=2;      
  44. //  u8 Sum=0;      
  45.                
  46. #if SYSTEM_SUPPORT_OS                 //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
  47.         OSIntEnter();   
  48. #endif
  49.         if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断
  50.                 {
  51.                   USART_RX_BUF[len++] = USART_ReceiveData(USART1);        //读取接收到的数据
  52.                       //  USART_SendData(USART1,USART_RX_BUF[0]);
  53.                   if(len>9){
  54.                         len=0;
  55.                         memcpy(&deal_buf,&USART_RX_BUF,10);
  56.                         memset(USART_RX_BUF,0,10);
  57.                         deal_flag=1;
  58.                    }
  59.                    else
  60.                USART_SendData(USART1,USART_RX_BUF[len-1]);
  61. #if SYSTEM_SUPPORT_OS         //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
  62.         OSIntExit();                                                                                          
  63. #endif
  64. }
  65. #endif   

  66. void deal(void)
  67. {
  68. if(!deal_flag)retrun;
  69.   deal_flag=0;
  70. // 加入你的处理程序

  71. }
  72. 程序拿txt写的,我没调试但是思路是这样,要是有语法报错你改改就行了!     
复制代码
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2021-1-28 01:40:21 | 显示全部楼层
自己想办法
回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3888
金钱
3888
注册时间
2017-3-7
在线时间
1694 小时
发表于 2021-1-28 08:46:38 | 显示全部楼层
基本思路:
有个数组保存每个数据,定义一个数据代表接收结束或者定时一段时间没接收到数据为接收结束,置为接收完成,主程序或者某个线程判断接收完成标志位,然后取数组的中你想要的数据。
回复

使用道具 举报

12

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
581
金钱
581
注册时间
2019-8-6
在线时间
132 小时
发表于 2021-1-28 09:43:08 | 显示全部楼层
思路:手动定义结构体,规定每个元素数组长度,接收到数据以后拷贝到这个结构体里,判断帧头帧尾(校验和),如果满足,你要的五六位就能提取出来了
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2021-1-11
在线时间
4 小时
 楼主| 发表于 2021-1-28 10:06:07 | 显示全部楼层
a5820736 发表于 2021-1-28 08:46
基本思路:
有个数组保存每个数据,定义一个数据代表接收结束或者定时一段时间没接收到数据为接收结束,置 ...

你好,我这个是一个传感器发来的数据包,不能分开来存入数组,直接全部数据都存入数组的0元素里面。有什么办法能把其中的数据位提取出来
回复

使用道具 举报

12

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
581
金钱
581
注册时间
2019-8-6
在线时间
132 小时
发表于 2021-1-28 10:33:05 | 显示全部楼层
haka 发表于 2021-1-28 10:06
你好,我这个是一个传感器发来的数据包,不能分开来存入数组,直接全部数据都存入数组的0元素里面。有什 ...

怎么就不能分开存入数组了呢?你照这个思路好好研究一下 自己定义个结构体
memcpy(&结构体,&串口缓存数据,10)
回复

使用道具 举报

5

主题

39

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
370
金钱
370
注册时间
2020-7-9
在线时间
70 小时
发表于 2021-1-28 10:48:53 | 显示全部楼层
参考原子的 485例程,数据在数组  ,你这样单独的收  数字  不行  如果需要  我可以  给你看我写的  带协议的
回复

使用道具 举报

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2020-6-16
在线时间
12 小时
发表于 2021-1-29 11:09:03 | 显示全部楼层
haka 发表于 2021-1-28 10:06
你好,我这个是一个传感器发来的数据包,不能分开来存入数组,直接全部数据都存入数组的0元素里面。有什 ...

可以的,uart传输数据是一个byte一个byte传输的,你FF存放数组a[0],01存放a[1],以此类推不就好了
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2021-1-11
在线时间
4 小时
 楼主| 发表于 2021-2-1 10:02:33 | 显示全部楼层
回复

使用道具 举报

2

主题

3

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2020-10-1
在线时间
8 小时
发表于 2021-2-10 12:14:35 | 显示全部楼层
楼主解决了吗,我遇到同样问题
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-29 12:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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