数据传输——基本程序流程

版权声明:虽为原创,欢迎转载。 https://blog.csdn.net/m0_37655357/article/details/86633649
  1. 芯片初始化与基本配置

  2. UDMA初始化(目前还不清楚他在哪里用了DMA)

  3. 引脚复用设置

  4. 串口初始化

  5. IIC初始化(快速模式,400K/bps)

  6. 串口打印程序标语

  7. 初始化应用的变量(包括清空数据缓冲区,tcp通信需要的IP和端口号,发送的数据长度)

  8. 配置simplelink到默认模式(STA模式)

  9. 启动simplelink

  10. 连接到AP并得到IP地址

  11. 等待用户输入(这一步只是我调试用,最终版会把这个去掉)

    扫描二维码关注公众号,回复: 5808583 查看本文章
  12. 在用户输入界面,通过串口先设置好同一局域网下的电脑的IP地址(因为这个是不固定的)

  13. 选择发送数据,然后在发送数据函数中,加入读传感器的程序

那么问题来了是读一个数据就立刻发送出去呢?还是读1s或者100个数据之后再集中发送呢?因为我担心读一个发一个的话数据发送效率会很低。下面是实际测试的几种情况

情况1:

    读取开发板上自带的加速度传感器BMA222E,一次读6个数据,可以把X Y Z轴的加速度数据全部读取出来,但是这6个数据中只有3个是加速度值,另外三个是新数据标志位,如下图所示,需要剔除。

将加速度数据单独拿出来放在一个数组中,准备发送

        //
        // Read the specified length of data
        //
        RET_IF_ERR(I2C_IF_Read(devAddr, &aucRdDataBuf[0],  ucRdLen));
        i = 0;
        for(sendCount = 0; sendCount < 6; sendCount++)
        {
            if(0 != sendCount%2)
            {
                tempBuf[i] = aucRdDataBuf[sendCount];
                i++;
            }
        }

测试程序中,一共读取1000次,每次读取的数据中有3个字节的数据需要发送出去,也就是最终会发送3000个字节的数据。为了检验数据发送的正确性,也将读取的加速度值通过串口打印到电脑上面,利用DisplayBuffer(tempBuf, 3);可以完成。然后通过sl_Send()函数进行数据的TCP传输,发送到电脑上虚拟的TCP服务器上面。

在上面这种传输方式下,实测发送3000字节的数据,需要3121ms,传输速率大概在0.96KB/S,远远低于理想的3MB/S。

我认为其中原因主要是:这3121ms并不是单纯的发送数据的时间,他还包括了读取传感器数据的时间和串口打印数据的时间。串口打印数据这一点可以去掉,但是读取传感器数据的时间是避免不了的,总是要先读取数据然后发送。

程序如下:

     //
    // Write the register address to be read from.
    // Stop bit implicitly assumed to be 0.
    //    
    RET_IF_ERR(I2C_IF_Write(devAddr,&ucRegOffset,1,0));
    //read 1000 data from the sensor and send it
    while(lLoopCount < g_ulPacketCount)
    {
        //
        // Read the specified length of data
        //
        RET_IF_ERR(I2C_IF_Read(devAddr, &aucRdDataBuf[0],  ucRdLen));
        i = 0;
        for(sendCount = 0; sendCount < 6; sendCount++)
        {
            if(0 != sendCount%2)
            {
                tempBuf[i] = aucRdDataBuf[sendCount];
                i++;
            }
        }
        DisplayBuffer(tempBuf, 3);
        // sending packet
        iStatus = sl_Send(iSockID, tempBuf, 3, 0 );
        if( iStatus < 0 )
        {
            // error
            sl_Close(iSockID);
            ASSERT_ON_ERROR(SEND_ERROR);
        }
        lLoopCount++;
    }

虚拟服务器接收的数据:

如果是先读取1s的数据或者100个数据在发送的话,那么发送过程中也会有很多的实时数据产生,这时就忽略了很多数据。所以我觉得还是读取一个发送一个的好。

情况二:

去掉串口打印功能之后的发送速率测试:

3000字节的数据,读取加发送的一共耗时467ms,传输速率大概在6.4KB/S,还是没有达到1MB/S的传输速率。

情况三:

采用以下代码单纯的发送数据,实测1.4MB的数据的发送完成需要1.077s,发送速率为1.3MB/S,这是目前测得的最大的传输速率了。

    // sending multiple packets to the TCP server
    while (lLoopCount < g_ulPacketCount)
    {
        // sending packet
        iStatus = sl_Send(iSockID, g_cBsdBuf, sTestBufLen, 0 );
        if( iStatus < 0 )
        {
            // error
            sl_Close(iSockID);
            ASSERT_ON_ERROR(SEND_ERROR);
        }
        lLoopCount++;
    }

以上三种情况都是以手机热点作为AP接入点的,CC3200和电脑全部连接的手机热点,构成局域网。暂时没有找到合适的路由器作为接入点。不知道TCP的传输速率和接入点的性能有没有关系。

猜你喜欢

转载自blog.csdn.net/m0_37655357/article/details/86633649