OpenEdv-开源电子网

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

请教一下关于单片机数组发送到串口的问题

[复制链接]

85

主题

249

帖子

0

精华

高级会员

Rank: 4

积分
674
金钱
674
注册时间
2020-12-5
在线时间
202 小时
发表于 2021-6-25 15:20:44 | 显示全部楼层 |阅读模式
1金钱
基础比较差,想问一下各位大佬我单片机将AD采集到的电压信号通过DMA存放在一个内存数组中,按理论来说一秒种可以采到有三百组数据,目前是使用DMA中断判断数组是否采集完成,数组每次采满以后就将数组所有数据打印到串口,那么我发送到串口的数据也应该一秒有三百组,但是最后串口得到的数组只有一秒七组左右,这个差距也太大了。1.我想问一下是什么原因造成的?是我打印的方式不对所以才导致上位机接受到的数据量变少?

2.是将这个数组的所有数据穿成一个字符串一起发更快吗?或者请教一下有没有更高速的方式将一组数据发送给串口?
下面是我的配置;
DMA配置:

DMA配置

DMA配置

DMA中断服务函数:

DMA中断服务函数

DMA中断服务函数

主函数循环判断FLAG是否为1,为1说明数组存满将数组打印到串口

主函数打印数组数据到串口

主函数打印数组数据到串口

最佳答案

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

粗略一算,1个printf约发4字节,一包256个数据则为1024字节, 115200波率率发一字节需要0.1ms时间,一包则需要102.4ms时间, 1秒大约能发送10个包。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

3389

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8643
金钱
8643
注册时间
2020-5-11
在线时间
4098 小时
发表于 2021-6-25 15:20:45 | 显示全部楼层
车嘉炜 发表于 2021-6-25 15:33
您好,目前手边没有示波器,我是用串口助手传输了10秒的数据量折算到1秒大概单片机只发送出来7组数据

粗略一算,1个printf约发4字节,一包256个数据则为1024字节,
115200波率率发一字节需要0.1ms时间,一包则需要102.4ms时间,
1秒大约能发送10个包。
专治疑难杂症
回复

使用道具 举报

12

主题

3389

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8643
金钱
8643
注册时间
2020-5-11
在线时间
4098 小时
发表于 2021-6-25 15:24:28 | 显示全部楼层
波特率多少?
专治疑难杂症
回复

使用道具 举报

85

主题

249

帖子

0

精华

高级会员

Rank: 4

积分
674
金钱
674
注册时间
2020-12-5
在线时间
202 小时
 楼主| 发表于 2021-6-25 15:26:28 | 显示全部楼层

115200
回复

使用道具 举报

12

主题

3389

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8643
金钱
8643
注册时间
2020-5-11
在线时间
4098 小时
发表于 2021-6-25 15:30:46 | 显示全部楼层
本帖最后由 LcwSwust 于 2021-6-25 15:34 编辑

用示波器测TXD脚,看一秒到底发了多少包。
粗略一算,1个printf约发4字节,一包256个数据则为1024字节,
115200波率率发一字节需要0.1ms时间,一包则需要102.4ms时间,
1秒大约能发送10个包。
专治疑难杂症
回复

使用道具 举报

85

主题

249

帖子

0

精华

高级会员

Rank: 4

积分
674
金钱
674
注册时间
2020-12-5
在线时间
202 小时
 楼主| 发表于 2021-6-25 15:33:54 | 显示全部楼层
LcwSwust 发表于 2021-6-25 15:30
用示波器测TXD脚,看一秒到底发了多少包。

您好,目前手边没有示波器,我是用串口助手传输了10秒的数据量折算到1秒大概单片机只发送出来7组数据
回复

使用道具 举报

12

主题

3389

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8643
金钱
8643
注册时间
2020-5-11
在线时间
4098 小时
发表于 2021-6-25 15:38:09 | 显示全部楼层
板子有LED吧?发完一组(或N组)让LED取反,就能大概知道一秒发了多少组。
专治疑难杂症
回复

使用道具 举报

85

主题

249

帖子

0

精华

高级会员

Rank: 4

积分
674
金钱
674
注册时间
2020-12-5
在线时间
202 小时
 楼主| 发表于 2021-6-25 15:39:26 | 显示全部楼层
LcwSwust 发表于 2021-6-25 15:35
粗略一算,1个printf约发4字节,一包256个数据则为1024字节,
115200波率率发一字节需要0.1ms时间,一包 ...

感谢您的回复,想请教您一下有没有办法提高我发送数据的速度啊,因为我目前需要的数据量是比较大的,一秒三百包,结果现在只能不到10个包就差距很大
回复

使用道具 举报

12

主题

3389

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8643
金钱
8643
注册时间
2020-5-11
在线时间
4098 小时
发表于 2021-6-25 15:44:36 | 显示全部楼层
车嘉炜 发表于 2021-6-25 15:39
感谢您的回复,想请教您一下有没有办法提高我发送数据的速度啊,因为我目前需要的数据量是比较大的,一秒 ...

1.ADC数据就两字节,直接发这两字节就是,不要用printf。
2.提高波特率到2M。
专治疑难杂症
回复

使用道具 举报

85

主题

249

帖子

0

精华

高级会员

Rank: 4

积分
674
金钱
674
注册时间
2020-12-5
在线时间
202 小时
 楼主| 发表于 2021-6-25 15:48:24 | 显示全部楼层
LcwSwust 发表于 2021-6-25 15:44
1.ADC数据就两字节,直接发这两字节就是,不要用printf。
2.提高波特率到2M。

请问直接发ADC这两个字节是什么意思?串口通信的那个senddata函数吗?目前不知道除了printf以外怎么向串口发送数据
回复

使用道具 举报

12

主题

3389

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8643
金钱
8643
注册时间
2020-5-11
在线时间
4098 小时
发表于 2021-6-25 15:53:58 | 显示全部楼层
车嘉炜 发表于 2021-6-25 15:48
请问直接发ADC这两个字节是什么意思?串口通信的那个senddata函数吗?目前不知道除了printf以外怎么向串 ...
  1. //--------------------------------------------------
  2. //        串口发送字节
  3. //--------------------------------------------------
  4. void UART_SendByte(USART_TypeDef* USARTx, U8 Data)
  5. {
  6.         while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE)==RESET);        //等待"发送寄存器空"
  7.         USART_SendData(USARTx, Data);
  8. }
  9. int x;
  10. UART_SendByte(USART1,x>>8);//发送高字节
  11. UART_SendByte(USART1,x);//发送低字节
复制代码
专治疑难杂症
回复

使用道具 举报

85

主题

249

帖子

0

精华

高级会员

Rank: 4

积分
674
金钱
674
注册时间
2020-12-5
在线时间
202 小时
 楼主| 发表于 2021-6-25 15:57:41 | 显示全部楼层
回复

使用道具 举报

15

主题

1061

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
3625
金钱
3625
注册时间
2019-8-14
在线时间
1054 小时
发表于 2021-6-25 15:57:54 | 显示全部楼层
参考下这个:【战舰V3_关于ADC和DMA,串口+DMA的结合使用(串口空闲中断+DMA/六路ADC+DMA/12路ADC+DMA)】 http://www.openedv.com/forum.php?mod=viewthread&tid=276626
回复

使用道具 举报

3

主题

821

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3369
金钱
3369
注册时间
2011-11-10
在线时间
207 小时
发表于 2021-6-25 17:25:53 | 显示全部楼层
1s发出300*256=76800个数据,一个AD数据12bit,其实占内存16bit,也就是2个字节。
1s要发出76800*2=153600个字节,如果不考虑校验位,需要波特率是153600*10=1536000
你用115200,这根本不够的啊,差距太远了
回复

使用道具 举报

233

主题

961

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1814
金钱
1814
注册时间
2011-10-9
在线时间
230 小时
发表于 2021-6-25 17:38:03 | 显示全部楼层
放弃吧 串口不可能 改用网口可能还有点机会  
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2021-6-25 17:47:39 | 显示全部楼层
本帖最后由 edmund1234 于 2021-6-25 18:02 编辑

用115200发一字节, 时间是 10/115200 = 86.8us每字节
用115200发30*2字节, 时间是 2*300*10/115200 = 52.083ms每600字节

时间充裕到可以睡一觉再回来做
回复

使用道具 举报

85

主题

249

帖子

0

精华

高级会员

Rank: 4

积分
674
金钱
674
注册时间
2020-12-5
在线时间
202 小时
 楼主| 发表于 2021-6-27 09:28:59 | 显示全部楼层
hou18 发表于 2021-6-25 15:57
参考下这个:【战舰V3_关于ADC和DMA,串口+DMA的结合使用(串口空闲中断+DMA/六路ADC+DMA/12路ADC+DMA)】 htt ...

感谢感谢
回复

使用道具 举报

85

主题

249

帖子

0

精华

高级会员

Rank: 4

积分
674
金钱
674
注册时间
2020-12-5
在线时间
202 小时
 楼主| 发表于 2021-6-27 09:29:32 | 显示全部楼层
c2007s 发表于 2021-6-25 17:25
1s发出300*256=76800个数据,一个AD数据12bit,其实占内存16bit,也就是2个字节。
1s要发出76800*2=153600 ...

明白了 感谢您
回复

使用道具 举报

85

主题

249

帖子

0

精华

高级会员

Rank: 4

积分
674
金钱
674
注册时间
2020-12-5
在线时间
202 小时
 楼主| 发表于 2021-6-27 09:30:15 | 显示全部楼层
simms01 发表于 2021-6-25 17:38
放弃吧 串口不可能 改用网口可能还有点机会

好的感谢您 我再尝试一下
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-23 05:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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