OpenEdv-开源电子网

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

串口如何接收数据?

[复制链接]

29

主题

132

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2017-12-12
在线时间
26 小时
发表于 2018-9-26 15:01:05 | 显示全部楼层 |阅读模式
5金钱
我现在使用F1 单片机的串口1 连接一个模块,该模块自动给单片机发送一个 以 BB 开头的6个字节的数据帧 我单片机如何接受这个数据 并保存到自己申请的内存buf里面?

最佳答案

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

基本思想:每接收一个字节,都要触发一次串口中断,然后在中断服务函数中声明一个静态的计数器变量rxCnt=0; 每次串口接收到一个字节之后,进入串口中断服务函数,首先检查rxCnt==0?是的话,说明当前没有在接受任何数据,检查接收到的这个字节是否是0xBB,如果是的话,接收计数器rxCnt置5,同时将当前的0xbb拷贝到自己申请的buf[0];如果不是,那么就直接跳过,什么都不需要做。 如果进入串口中断服务函数的时候发现rxCnt!=0 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

756

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4163
金钱
4163
注册时间
2017-10-24
在线时间
251 小时
发表于 2018-9-26 15:01:06 | 显示全部楼层
基本思想:每接收一个字节,都要触发一次串口中断,然后在中断服务函数中声明一个静态的计数器变量rxCnt=0;

每次串口接收到一个字节之后,进入串口中断服务函数,首先检查rxCnt==0?是的话,说明当前没有在接受任何数据,检查接收到的这个字节是否是0xBB,如果是的话,接收计数器rxCnt置5,同时将当前的0xbb拷贝到自己申请的buf[0];如果不是,那么就直接跳过,什么都不需要做。

如果进入串口中断服务函数的时候发现rxCnt!=0那么就说明当前有正在接受数据,那么将当前串口上接收到的这个字节拷贝到buf[6-rxCnt],然后rxCnt--.

基本思想就是这样。
十六进制带我飞。
回复

使用道具 举报

29

主题

132

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2017-12-12
在线时间
26 小时
 楼主| 发表于 2018-9-26 15:03:22 | 显示全部楼层
是不是使用下面的函数?
/**
  * @brief  Returns the most recent received data by the USARTx peripheral.
  * @param  USARTx: Select the USART or the UART peripheral.
  *   This parameter can be one of the following values:
  *   USART1, USART2, USART3, UART4 or UART5.
  * @retval The received data.
  */
uint16_t USART_ReceiveData(USART_TypeDef* USARTx)
{
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  
  /* Receive Data */
  return (uint16_t)(USARTx->DR & (uint16_t)0x01FF);
}
回复

使用道具 举报

29

主题

132

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2017-12-12
在线时间
26 小时
 楼主| 发表于 2018-9-26 17:10:53 | 显示全部楼层
没人会吗?
回复

使用道具 举报

3

主题

259

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2317
金钱
2317
注册时间
2016-12-2
在线时间
354 小时
发表于 2018-9-26 17:18:08 | 显示全部楼层
写回圈调用USART_ReceiveData() 6次
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3772
金钱
3772
注册时间
2015-4-26
在线时间
765 小时
发表于 2018-9-26 18:32:11 | 显示全部楼层

有人会啊,但是你最好看原子的教程啊。这样很难回答的。接收要开中断的
我有故事,你有酒吗
回复

使用道具 举报

9

主题

165

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
251
金钱
251
注册时间
2018-4-6
在线时间
31 小时
发表于 2018-9-26 21:16:38 | 显示全部楼层
我觉得,用个标志,state1标志接受到BB数据,然后接下来的数据放入内存buf,并且i++,i==5后标记接受完成
回复

使用道具 举报

29

主题

132

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2017-12-12
在线时间
26 小时
 楼主| 发表于 2018-9-27 10:15:00 | 显示全部楼层
sammy902583 发表于 2018-9-26 17:18
写回圈调用USART_ReceiveData() 6次

具体怎么写?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-9-28 02:10:15 | 显示全部楼层
这个是最基础的问题了,自己想办法。
回复

使用道具 举报

7

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
137
金钱
137
注册时间
2018-8-29
在线时间
17 小时
发表于 2018-9-28 08:44:13 | 显示全部楼层
开串口中断,把接收到的数据存进一个buff里面就可以了
回复

使用道具 举报

17

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
451
金钱
451
注册时间
2017-2-1
在线时间
74 小时
发表于 2018-9-28 08:49:48 | 显示全部楼层
串口如果有难点,就在接收这一块。首先,模块给单片机发送数据时,是一个字节一个字节发的,单片机也是一个个收,单片机收完每个字节后,会有相应的标志位置位,单片机需要在接收下一个字节前,从数据寄存器中把数据提出来并保存到buff,否则就会造成数据丢失。串口接收最好使用中断,轮询是不实用的
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 05:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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