RRJ67 发表于 2024-1-16 10:48:24

串口发送数据

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

eric2013 发表于 2024-1-16 11:01:16

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

RRJ67 发表于 2024-1-16 11:10:42

STM32的串口速度最高也才是4.5Mbps,达不到这个速度啊,但是采集正弦波的波形并未发现丢点的情况,就只有后面的数据没了,点数对应不上,那后面没了的那些点是丢了还是没发送走啊

eric2013 发表于 2024-1-16 11:15:55

RRJ67 发表于 2024-1-16 11:10
STM32的串口速度最高也才是4.5Mbps,达不到这个速度啊,但是采集正弦波的波形并未发现丢点的情况,就只有后 ...

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

qq1646544 发表于 2024-1-16 11:18:07

eric2013 发表于 2024-1-16 11:01
1ms上传100个点,那么串口速度至少是1ms * 1000 * 10bit(1bit起始+8bit数据+1bit停止) = 10Mbps的速度才 ...

1000是哪里来的?

eric2013 发表于 2024-1-16 11:20:46

qq1646544 发表于 2024-1-16 11:18
1000是哪里来的?

写错了,是乘以100

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

qq1646544 发表于 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把?

RRJ67 发表于 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);
        }
       
        //半传输完成中断
        if(DMA_GetITStatus(DMA1_IT_HT1) != RESET ){
                DMA_ClearITPendingBit(DMA1_IT_HT1);

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

eric2013 发表于 2024-1-16 11:42:25

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

对,还是你考虑的细。

eric2013 发表于 2024-1-16 11:43:18

RRJ67 发表于 2024-1-16 11:38
void DMA1_Channel1_IRQHandler(void)
{



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

RRJ67 发表于 2024-1-16 11:43:49

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

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

RRJ67 发表于 2024-1-16 11:49:54

eric2013 发表于 2024-1-16 11:43
可以考虑DMA设置为Normal模式,仅传输一次看看。

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

skyshine 发表于 2024-1-16 13:52:34

换个串口调试工具试试,在数据包前面加个序号,看看是丢了哪部分数据,只看波形不容易看出来

RRJ67 发表于 2024-1-16 14:14:52

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

数据包里有序号,序号是连续的,丢的是少发的那部分数据,比如说1s应该发送1000包数据,但实际只发送900包,丢了最后那100包的数据
页: [1]
查看完整版本: 串口发送数据