-
芯片初始化与基本配置
-
UDMA初始化(目前还不清楚他在哪里用了DMA)
-
引脚复用设置
-
串口初始化
-
IIC初始化(快速模式,400K/bps)
-
串口打印程序标语
-
初始化应用的变量(包括清空数据缓冲区,tcp通信需要的IP和端口号,发送的数据长度)
-
配置simplelink到默认模式(STA模式)
-
启动simplelink
-
连接到AP并得到IP地址
-
等待用户输入(这一步只是我调试用,最终版会把这个去掉)
扫描二维码关注公众号,回复: 5808583 查看本文章 -
在用户输入界面,通过串口先设置好同一局域网下的电脑的IP地址(因为这个是不固定的)
-
选择发送数据,然后在发送数据函数中,加入读传感器的程序
那么问题来了是读一个数据就立刻发送出去呢?还是读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的传输速率和接入点的性能有没有关系。