TI工程师,你们好:
CC3200作为STA模式链接上路由了,数据交换都没问题,请使用什么函数获取当前跟路由器的连接质量呢?就是RSSI值。
我看了TI提供的DEMO,好像是是用 sl_WlanRxStatStart, sl_WlanRxStatGet, sl_WlanRxStatStop,这3个函数,对吗?
如果是,这个开启统计数据,对WIFI链接或成功链接上路由器后的TCP,UDP数据交换是否有影响呢?谢谢
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
不是上面的三个API,可以直接去FLASH里面取扫描的结果,sl_WlanGetNetworkList, 然后和你连的SSID对比,就可以得到相应的RSSI了。
这个函数不是要扫描的时候才使用的吗?就是需要断开链接,如果是东东链接的话,还需要先改变链接策略。我的意思是,如何像普通笔记本一样,你笔记本离路由器远点,右下角的信号强度会减弱,也就是说这个信号值是从正常链接后的数据交换中所提取出来的实时信号值,就像CC2530里的通讯一样,每个数据包都包含RSSI,请问CC3200如何获取在正常链接之后的实时RSSI值呢?
因为WIFI内部是有一个定时的扫描来更新FLASH里面的扫描结果,你可以用API去设置这个定时的interval是多少。你可以参考例程scan_policy, 里面有详细的介绍。
Yonghua Pan 谢谢你的回答。
恩,例子都都看了,扫描的功能我都是参照例程的。
但有个问题,要使用sl_WlanGetNetworkList获取扫描结果,需要 SL_SCAN_POLICY(1);来开启扫描,那意思是从一开始就开启 SL_SCAN_POLICY(1);,然后就不关闭了,就算跟WIFI连接或断开都不用去 SL_SCAN_POLICY(0);,是吗?
HI Yonghua Pan
我在使用sl_WlanGetNetworkList(0, SCAN_TABLE_SIZE, netEntries);读出了ap的rssi的值;我在手机里也下载了这样一个能够读取信号强度的APP,把手机放在3200模块的旁边,对比两者的结果发现CC3200读取的数值都要比手机读到的数值小了十几甚至20多个db。
我的问题是为什么会出现这种情况,这与硬件有关还是与软件相关? cc3200可以通过设置(而不改变里路由器的距离)抬高rssi的值吗?
同样的,3200开放了设置接收灵敏度的接口吗?如果有,使用哪个API可以修改接收灵敏度?
期盼你的回复,谢谢!
直接调用
lRetVal = sl_WlanGetNetworkList(ucIndex, (unsigned char)WLAN_SCAN_COUNT,
&netEntries[ucIndex]);
函数就可以得到扫描到的AP的RSSI值,具体可以参考scan_policy例程
谢谢
用CCS或是IAR都行,你可以将程序烧录到片内的RAM里面在线调试。
当然用uniflash烧录到片外的SFLASH也行,只是需要离线运行了。
谢谢
我是这样改变扫描周期的
。。。。。
ui_policy_inv = 5;
ucpolicy_opt = SL_SCAN_POLICY(1);
ret_val = sl_WlanPolicySet(SL_POLICY_SCAN, ucpolicy_opt, (unsigned char *)(&ui_policy_inv), sizeof(ui_policy_inv));
if(ret_val < 0){
DO_Printf("Wlan Enable Scan Policy Failure.\r\n");
goto return_point;
}
。。。。。 而且RSSI的值是8位有符号数,是不是变量类型没给对呢?
我的信号值是这样处理的
signed char rssi = wlan_net_entries[ret_val].rssi;
chen,
你的程序好像有点问题,应该使用下面的语句来改变scan cycle:
// enable scan
//
ucpolicyOpt = SL_SCAN_POLICY(1);
//
// set scan cycle to 10 seconds
//
policyVal.uiPolicyLen = 10;
//
// set scan policy - this starts the scan
//
lRetVal = sl_WlanPolicySet(SL_POLICY_SCAN , ucpolicyOpt,
(unsigned char*)(policyVal.ucPolicy), sizeof(policyVal));
谢谢
但是我在 CC32XX SimpleLink Host Driver 1.0.0.1这个文档上看到的是这样的
For example, setting scan interval to 1 minute interval use: _u32 intervalInSeconds = 60; #define SL_SCAN_ENABLE 1 sl_WlanPolicySet(SL_POLICY_SCAN,SL_SCAN_ENABLE, (_u8 *)&intervalInSeconds,sizeof(intervalInSeconds)); For example, disable scan: #define SL_SCAN_DISABLE 0 sl_WlanPolicySet(SL_POLICY_SCAN,SL_SCAN_DISABLE,0,0);
是否我的这个文档版本旧呢?或者你的代码中的 policyVal 是一个联合体呢?
谢谢
SDK里的scan例程还要修改吗?最后调用lRetVal怎么调用,是在main里面再调用一次吗?
SDk里面的scan例程不需要修改,你直接在那个例程的WlanScan()函数里面,设置好scanpolicy的扫描周期后,在 MAP_UtilsDelay(8000000);延时后面添加就行。
谢谢
我按照您的说明操作了一次,可是还是测不到RSSI值?是这样的吗?在 MAP_UtilsDelay(8000000)后面例程中原来就调用了lRetVal还有什么需要修改的吗?
SDK 的scan例程中RSSI的是 _i8 rssi; 应该没有问题吧
我是直接用SDK里的scan 例程用CCS进行试验的,没有一点改动,然后数据库里还是导入simplelin,oslib,driverlib和ti_rtos这几个函数,这样做是不是少了什么步骤?希望您的指正,谢谢!
//启动扫描热点
ui_policy_inv = 5;
ucpolicy_opt = SL_SCAN_POLICY(1);
ret_val = sl_WlanPolicySet(SL_POLICY_SCAN, ucpolicy_opt, (unsigned char *)(&ui_policy_inv), sizeof(ui_policy_inv));
if(ret_val < 0){
DO_Printf("Wlan Enable Scan Policy Failure.\r\n");
goto return_point;
}
开启扫描热点后,等待一段时间,让芯片内部去扫描一些结果,然后循环去查询这个结果列表
i_val = 20;
while(i_val--){
vTaskDelay(1350);
memset(wlan_net_entries, 0, sizeof(wlan_net_entries));
ret_val = sl_WlanGetNetworkList(i_val, (unsigned char)WLAN_MAX_NET_ENTRIE_COUNT, &wlan_net_entries[0]);
if(ret_val == 0){
return -1;//无法扫描到热点
}else{
for(j_val = 0;j_val < WLAN_MAX_FILTER_ENTRIE_COUNT;j_val++){
i8 rssi = wlan_net_entries[j_val].rssi;
}
}您这个程序应该不是SDK scan例程吧?是您自己写的还是照着例程修改的?
你好!
我在使用scan_policy例程时,单步运行到sl_WlanGetNetworkList函数lRetVal能看到数值,可以我的wifi并没有开启呀?
万分感激您的回答