|
移植了RealTouch的WIFI驱动,搜索一次需要几分钟的时间。觉得奇怪,安卓手机搜一次秒杀,电脑也只要5秒钟。研究了一天发现RealTouch的WIFI驱动的一个小BUG导致的。改了之后现在搜索秒杀了,(实际上是500ms)。
。
SCAN_RESP: Scanned 4
Scan: Chan( 2), Radio(0), Mode(0,0), Dur(100)
Scan: Chan( 3), Radio(0), Mode(0,0), Dur(100)
Scan: Chan( 4), Radio(0), Mode(0,0), Dur(100)
Scan: Chan( 5), Radio(0), Mode(0,0), Dur(100)
send CMD: 0x6, len 51, Number 8
send:0x06 0x00 0x33 0x00 0x08 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x01 0x20 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x64 0x00 0x00 0x03 0x00 0x00 0x00 0x00 0x64 0x00 0x00 0x04 0x00 0x00 0x00 0x00 0x64 0x00 0x00 0x05 0x00 0x00 0x00 0x00 0x64 0x00
0x06 0x00 0x33 0x00 0x08 0x00 0x00 0x00 _HostCmd_DS_COMMAND
0x01 CMD_BSS_TYPE_BSS
0x00 0x00 0x00 0x00 0x00 0x00 BSSID
0x01 0x01 CHANLIST
0x20 0x00 length
0x00 0x02 0x00 0x00 0x00 0x00 0x64 0x00 _ChanScanParamSet_t
0x00 0x03 0x00 0x00 0x00 0x00 0x64 0x00 _ChanScanParamSet_t
0x00 0x04 0x00 0x00 0x00 0x00 0x64 0x00 _ChanScanParamSet_t
0x00 0x05 0x00 0x00 0x00 0x00 0x64 0x00 _ChanScanParamSet_t
typedef struct
{
u8 PassiveScan:1;
u8 DisableChanFilt:1;
u8 Reserved_2_7:6;
} ChanScanMode_t;
typedef struct _ChanScanParamSet_t
{
u8 RadioType;
u8 ChanNumber;
ChanScanMode_t ChanScanMode;
u16 MinScanTime;
u16 MaxScanTime;
}ChanScanParamSet_t;
发现这个数据和结构体的长度不一样
0x00 0x02 0x00 0x00 0x00 0x00 0x64 0x00 _ChanScanParamSet_t
然后用sizeof测试一下,发现sizeof(_ChanScanParamSet_t)=8.
最后发现原来是结构体对齐的原因导致的。而实际上正确的命令应该是
|MaxScanTime|
0x00 0x02 0x00 0x00 0x00 0x64 0x00 对比错误的命令:
0x00 0x02 0x00 0x00 0x00 0x00 0x64 0x00
发现MaxScanTime由原来的0x0064(100ms)变成了0x6400(25.6s)。这才导致了每次的搜索时间长的上几分钟。(令我奇怪的是这条命令竟然还能被执行。)
解决方法就是加上__packed修饰,让结构体按照字节对齐就可以了。
typedef __packed struct
{
u8 PassiveScan:1;
u8 DisableChanFilt:1;
u8 Reserved_2_7:6;
} ChanScanMode_t;
/** ChanScanParamSet_t */
typedef __packed struct _ChanScanParamSet_t
{
u8 RadioType;
u8 ChanNumber;
ChanScanMode_t ChanScanMode;
u16 MinScanTime;
u16 MaxScanTime;
} ChanScanParamSet_t;
现在搜索就是一眨眼的时间,连接也是这样快。
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
该献的血还是要献的。你不献他不献。难道让我去献? --- 出自坛友:lovejp1981
|