硬汉嵌入式论坛

 找回密码
 立即注册
查看: 472|回复: 13
收起左侧

[技术讨论] 串口发送数据

[复制链接]

5

主题

20

回帖

35

积分

新手上路

积分
35
发表于 2024-1-16 10:48:24 | 显示全部楼层 |阅读模式
请教大佬,在项目中使用串口发送数据会出现数据量和理论计算量不一致的情况,通过采集正弦波推断采样过程中并未丢点(正弦波连续且周期正常),先用ADC进行采样(100kHz采样率),使用DMA进行数据传输(DMA长度设置为100),在DMA中断里将100个采样数据点打包,再通过串口发送,理论上是1ms会有1包即100个点上传,1s有1000包即100000个点,但实际通过串口调试助手在一定时间内统计字节数发现并未发送这么多数据,相差在一半数据量左右,通过改变串口波特率可以提升部分数据量,但效果不明显,换成使用w5500模块上传数据,也还存在丢点情况,目前还未查出点丢在哪里,请大佬帮忙给指点一下呀
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106855
QQ
发表于 2024-1-16 11:01:16 | 显示全部楼层
1ms上传100个点,那么串口速度至少是1ms * 1000 * 10bit(1bit起始+8bit数据+1bit停止) = 10Mbps的速度才可以。考虑到冗余,你得串口速度最好15Mbps作用比较保险
回复

使用道具 举报

5

主题

20

回帖

35

积分

新手上路

积分
35
 楼主| 发表于 2024-1-16 11:10:42 | 显示全部楼层
STM32的串口速度最高也才是4.5Mbps,达不到这个速度啊,但是采集正弦波的波形并未发现丢点的情况,就只有后面的数据没了,点数对应不上,那后面没了的那些点是丢了还是没发送走啊
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106855
QQ
发表于 2024-1-16 11:15:55 | 显示全部楼层
RRJ67 发表于 2024-1-16 11:10
STM32的串口速度最高也才是4.5Mbps,达不到这个速度啊,但是采集正弦波的波形并未发现丢点的情况,就只有后 ...

这个要看你的程序处理方式了,贴代码看下。
回复

使用道具 举报

13

主题

89

回帖

128

积分

初级会员

积分
128
发表于 2024-1-16 11:18:07 | 显示全部楼层
eric2013 发表于 2024-1-16 11:01
1ms上传100个点,那么串口速度至少是1ms * 1000 * 10bit(1bit起始+8bit数据+1bit停止) = 10Mbps的速度才 ...

1000是哪里来的?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106855
QQ
发表于 2024-1-16 11:20:46 | 显示全部楼层

写错了,是乘以100

1ms上传100个点,那么串口速度至少是1ms * 100 * 10bit(1bit起始+8bit数据+1bit停止) = 1Mbps的速度才可以。考虑到冗余,你得串口速度最好1-2Mbps作用比较保险
回复

使用道具 举报

13

主题

89

回帖

128

积分

初级会员

积分
128
发表于 2024-1-16 11:25:59 | 显示全部楼层
本帖最后由 qq1646544 于 2024-1-16 11:40 编辑
eric2013 发表于 2024-1-16 11:20
写错了,是乘以100

1ms上传100个点,那么串口速度至少是1ms * 100 * 10bit(1bit起始+8bit数据+1bit停 ...

感觉楼主没指定这个点是 什么数据类型的,如果是1字节的就是这公式,2字节对还要乘2,浮点的还要再乘4把?
回复

使用道具 举报

5

主题

20

回帖

35

积分

新手上路

积分
35
 楼主| 发表于 2024-1-16 11:38:51 | 显示全部楼层
void DMA1_Channel1_IRQHandler(void)
{

        //传输完成中断
        if(DMA_GetITStatus(DMA1_IT_TC1) != RESET){
                DMA_ClearITPendingBit(DMA1_IT_TC1);

                Adc1_Dma_CallBack(&adc1_dma_buf[adc1_dma_len_temp], adc1_dma_len_temp);
        }
       
        //半传输完成中断
        if(DMA_GetITStatus(DMA1_IT_HT1) != RESET ){
                DMA_ClearITPendingBit(DMA1_IT_HT1);

                Adc1_Dma_CallBack(&adc1_dma_buf[0], adc1_dma_len_temp);
        }
}
void Adc1_Dma_CallBack(uint16_t *src, uint16_t len)
{
        for(int i=0; i<adc1_point_num; i++){
                adc1_avg_val[i] = src[i] / 4096.0f * 3300.0f;
        }
        Adc1_Send_Org_Data_1(0, &adc1_avg_val[0], len);
}
adc1_dma_len_temp长度是100,进中断后计算完上传数据,显示波形是正常的,
为了排查这个问题,调试过程中还加入了平均处理,即100个点平均一次得出一个点,这样就相当于是1kHz采样率了,就是1ms一个点,1s就是1000点,但是通过串口调试助手看发送数据量依然达不到理论计算值(串口波特率设置的是460800,再提高有几率会出现数据错乱的现象)
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106855
QQ
发表于 2024-1-16 11:42:25 | 显示全部楼层
qq1646544 发表于 2024-1-16 11:25
感觉楼主没指定这个点是 什么数据类型的,如果是1字节的就是这公式,2字节对还要乘2,浮点的还要再乘4把 ...

对,还是你考虑的细。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106855
QQ
发表于 2024-1-16 11:43:18 | 显示全部楼层
RRJ67 发表于 2024-1-16 11:38
void DMA1_Channel1_IRQHandler(void)
{

可以考虑DMA设置为Normal模式,仅传输一次看看。
回复

使用道具 举报

5

主题

20

回帖

35

积分

新手上路

积分
35
 楼主| 发表于 2024-1-16 11:43:49 | 显示全部楼层
qq1646544 发表于 2024-1-16 11:25
感觉楼主没指定这个点是 什么数据类型的,如果是1字节的就是这公式,2字节对还要乘2,浮点的还要再乘4把 ...

对的,这里定义上传的数据类型是浮点数,还要×4,感觉串口速率达不到啊
回复

使用道具 举报

5

主题

20

回帖

35

积分

新手上路

积分
35
 楼主| 发表于 2024-1-16 11:49:54 | 显示全部楼层
eric2013 发表于 2024-1-16 11:43
可以考虑DMA设置为Normal模式,仅传输一次看看。

仅传输一次,一包的数据量也是对的,数据也是正常,循环传输这个数据量就跟不上了
回复

使用道具 举报

3

主题

124

回帖

133

积分

初级会员

积分
133
发表于 2024-1-16 13:52:34 | 显示全部楼层
换个串口调试工具试试,在数据包前面加个序号,看看是丢了哪部分数据,只看波形不容易看出来
回复

使用道具 举报

5

主题

20

回帖

35

积分

新手上路

积分
35
 楼主| 发表于 2024-1-16 14:14:52 | 显示全部楼层
skyshine 发表于 2024-1-16 13:52
换个串口调试工具试试,在数据包前面加个序号,看看是丢了哪部分数据,只看波形不容易看出来

数据包里有序号,序号是连续的,丢的是少发的那部分数据,比如说1s应该发送1000包数据,但实际只发送900包,丢了最后那100包的数据
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-7 14:57 , Processed in 0.193299 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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