OpenEdv-开源电子网

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

关于将串口接收到的数据原样发送的实现方法及疑问。

[复制链接]

2

主题

19

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2020-8-20
在线时间
12 小时
发表于 2020-12-16 23:08:25 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 couragemars 于 2020-12-16 23:22 编辑

首先原子哥教学视频,串口实验那集里可以通过末尾回车换行判断,将接收到的数据发回来。
然后今天我研究STM32固件库使用手册USART库函数时,偶然发现用几个固件库函数也能将收到的数据原样发回来,就是不知道这样的方法是不是有隐患。
1608129117(1).jpg
如图,首先是判断接收标志位,然后发送接收到的数据,最后是清除标志位(不知道发送数据算不算读取所以先加上清除函数)。中间有一行判断发送完成标志位的函数,如果加进去的话,就会有数据遗漏,应该是执行这个函数的时候会接收几个数值然后接着就被清除,所以屏蔽了这行函数。以下是串口助手的发送实验。
1608130358(1).jpg
一组乱写的数据凑满150字节,经过文本比较没有错误遗漏。
这应该不是什么新奇的发现,只是我这个新手比较好奇,这种方法有哪些隐患和局限性?已经把这个放进中断里,限制了循环次数,倒是可以收什么发什么,然后又回到主函数。

最佳答案

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

实现工程中不可能这样,通讯肯定有协议,你收到数据要解码,然后再发回去, 我教你个更好的回发,在中断中收到又发送回就行 void UART1_IRQ() { if(usart_isr&rxne) { UART1->DR = USART1->DR; } }
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

25

主题

683

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1351
金钱
1351
注册时间
2012-4-25
在线时间
195 小时
发表于 2020-12-16 23:08:26 | 显示全部楼层
实现工程中不可能这样,通讯肯定有协议,你收到数据要解码,然后再发回去,
我教你个更好的回发,在中断中收到又发送回就行
void UART1_IRQ()
{
   if(usart_isr&rxne)
{  UART1->DR = USART1->DR;
}
}

1-1
回复

使用道具 举报

11

主题

2154

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4951
金钱
4951
注册时间
2015-1-10
在线时间
620 小时
发表于 2020-12-17 13:42:37 | 显示全部楼层
但是你的发送会占用MCU,导致其他程序无法执行
回复

使用道具 举报

2

主题

19

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2020-8-20
在线时间
12 小时
 楼主| 发表于 2020-12-18 21:00:08 | 显示全部楼层
阿侑kevin 发表于 2020-12-17 13:42
但是你的发送会占用MCU,导致其他程序无法执行

可是接收中断后,基本上也不能执行其他程序了吧?
回复

使用道具 举报

2

主题

19

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2020-8-20
在线时间
12 小时
 楼主| 发表于 2020-12-18 21:51:45 | 显示全部楼层
mygod 发表于 2020-12-17 13:46
实现工程中不可能这样,通讯肯定有协议,你收到数据要解码,然后再发回去,
我教你个更好的回发,在中断中 ...

大神···这个好厉害,虽然没看懂,不过用起来比起我之前的省去好多步骤。
if里面的语句看意思是判断中断状态寄存器和接收标记,不知道为什么写进去后就报错未定义,查固件库手册发现是在stm32f10x_map.h里定义,不过工程文件里没有这个,无奈先改成查询接收标志位函数,效果应该是差不多把。下面的收到又发送步骤,不需要清除寄存器或者标志位吗?我对接收的数据存留问题还是有些没搞懂,是不是如果没定义数组保存,接收到的8位数值会一个接一个的覆盖替换?只留下最后一个8位数值,如果将其发送的话就等于读取自动清除,是不是就没必要特意去清除标志位了?
回复

使用道具 举报

2

主题

19

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2020-8-20
在线时间
12 小时
 楼主| 发表于 2020-12-18 21:55:27 | 显示全部楼层
mygod 发表于 2020-12-16 23:08
实现工程中不可能这样,通讯肯定有协议,你收到数据要解码,然后再发回去,
我教你个更好的回发,在中断中 ...

然后->这个符号大约是个啥意思,搜C语言->查到的内容没怎么看懂。。。。
回复

使用道具 举报

1

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2017-9-18
在线时间
20 小时
发表于 2020-12-22 13:52:44 | 显示全部楼层
couragemars 发表于 2020-12-18 21:55
然后->这个符号大约是个啥意思,搜C语言->查到的内容没怎么看懂。。。。

操作串口的数据寄存器
回复

使用道具 举报

1

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2017-9-18
在线时间
20 小时
发表于 2020-12-22 14:01:28 | 显示全部楼层
mygod 发表于 2020-12-16 23:08
实现工程中不可能这样,通讯肯定有协议,你收到数据要解码,然后再发回去,
我教你个更好的回发,在中断中 ...

你好~我想请教一下,现在我串口2接收到的数据会通过串口1发送作为显示频率为100HZ,现在我要通过上位机发送数据给串口1的接收再通过串口2将串口1接收到的数据发送出去。
在debug状态下可以将串口1存的数据通过串口2发送出去,但在实际运行中串口1收不到数据无法进入接收中断。
现在串口2的优先级高于1,试过其他优先级状态在debug串口2中都发不出去数据
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-24 04:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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