您好!
我使用两个 LAUNCHXL-CC3235SF 以高比特率测试原始数据包。
修改网络终端示例以启动 send/recv (消息末尾的代码)
一侧发送步长为1ms 的数据包。

如果我使用 radiotool recv 统计数据、我可以查看所有数据包。 例如、5秒矩形:

但是、如果我尝试取回所有数据、则结果非常糟糕

此外、我尝试了单线程(非 RTOS)项目。 结果好很多、但仍然不好

和另一个测试。 如果我发送1200字节而不是1536 (取消注释//size = 1200;在代码中)、则结果如下。 请注意"Max" RECT 周期

那么、问题是:是否有任何方法可以发送和接收具有高数据比特率的原始数据包? 我需要真正的低级、不需要任何软件包和超时
我的测试代码(在末尾的 main 函数 test())。 createSocket ()中的一些代码可能是无用的,但我尝试了不同的方式
extern "C" {
#include "network_terminal.h"
#ifdef SL_PLATFORM_MULTI_THREADED
#include "FreeRTOS.h"
#include "task.h"
#endif
#include "uart_term.h"
#include "inc/hw_nvic.h"
#include "inc/hw_types.h"
#include <ti/drivers/net/wifi/source/driver.h>
}
//////////////////////////////////////////////////////////// auxiliary functions begin
void onAssert(const char* exp) {
UART_PRINT("\r\n!!!ASSERT:%s", exp);
while (1) ;
}
#define _ASSERT_R(exp) if(!(exp)) onAssert(#exp);
#define CPU_CLOCK_MHZ (80)
#define TICK2US(tick) ((tick) / CPU_CLOCK_MHZ)
#ifndef SL_PLATFORM_MULTI_THREADED
typedef struct _ClockP_Control {
uint64_t count;
struct ClockP_Obj *list;
} ClockP_Control;
extern ClockP_Control ClockP_ctrl;
inline uint32_t xTaskGetTickCount() { return *(volatile uint32_t*)&ClockP_ctrl.count; }
#endif
inline uint32_t tickUs32() {
for (uint32_t count = xTaskGetTickCount();;) {
uint32_t tick = HWREG(NVIC_ST_CURRENT);
uint32_t count2 = xTaskGetTickCount();
if (count == count2)
return count * (1000000 / _SYS_CLOCK_PERIOD_) - tick / CPU_CLOCK_MHZ;
count = count2;
}
}
//////////////////////////////////////////////////////////// auxiliary functions end
static _i16 rate = SL_SOCK_TX_RATE_24M;
static _u32 power = 1;
static _u32 preamble = 0;
static _u32 channel = 100;
int createSocket() {
SlNetCfgIpV4Args_t ipAddr = {0};
_ASSERT_R(!sl_NetCfgSet(SL_NETCFG_IPV4_STA_ADDR_MODE, SL_NETCFG_ADDR_STATIC, sizeof(SlNetCfgIpV4Args_t), (_u8*)&ipAddr));
sl_NetAppStop(SL_NETAPP_HTTP_SERVER_ID | SL_NETAPP_DHCP_SERVER_ID | SL_NETAPP_MDNS_ID);
_ASSERT_R(!sl_Stop(1000));
_ASSERT_R(!sl_Start(NULL, NULL, NULL)) ;
SlWlanRxFilterIdMask_t FilterIdMask {};
_u16 len = sizeof(SlWlanRxFilterIdMask_t);
_ASSERT_R(!sl_WlanSet(SL_WLAN_RX_FILTERS_ID, SL_WLAN_RX_FILTER_STATE, len, (_u8*)FilterIdMask));
_ASSERT_R(!sl_WlanPolicySet(SL_WLAN_POLICY_CONNECTION, SL_WLAN_CONNECTION_POLICY(0, 0, 0, 0), NULL, 0));
_ASSERT_R(!sl_WlanPolicySet(SL_WLAN_POLICY_PM, SL_WLAN_ALWAYS_ON_POLICY, NULL, 0));
int s = sl_Socket(SL_AF_RF, SL_SOCK_RAW, 0);
_ASSERT_R(s >= 0);
SlSockNonblocking_t BlockingOption { 1 };
_ASSERT_R(!sl_SetSockOpt(s, SL_SOL_SOCKET, SL_SO_NONBLOCKING, (_u8*)&BlockingOption, sizeof(BlockingOption)));
_ASSERT_R(!sl_SetSockOpt(s, SL_SOL_PHY_OPT, SL_SO_PHY_RATE, &rate, sizeof(rate)));
_ASSERT_R(!sl_SetSockOpt(s, SL_SOL_PHY_OPT, SL_SO_PHY_TX_POWER, &power, sizeof(power)));
_ASSERT_R(!sl_SetSockOpt(s, SL_SOL_PHY_OPT, SL_SO_PHY_PREAMBLE, &preamble, sizeof(preamble)));
_ASSERT_R(!sl_SetSockOpt(s, SL_SOL_SOCKET, SL_SO_CHANGE_CHANNEL, &channel, sizeof(channel)));
_u32 timeout = 0;
_ASSERT_R(!sl_SetSockOpt(s, SL_SOL_PHY_OPT, SL_SO_PHY_TX_TIMEOUT, &timeout, sizeof(timeout))) ;
_u32 acks = 0;
_ASSERT_R(!sl_SetSockOpt(s, SL_SOL_PHY_OPT, SL_SO_PHY_ALLOW_ACKS, &acks, sizeof(acks))) ;
UART_PRINT("\r\nRAW socket is configured on channel %d (rate:%d txpower:%d preamble:%d)", channel, rate, power, preamble);
return s;
}
void makeHdr(_u8* buf)
{
#define FRAME_TYPE 0x88
#define FRAME_CONTROL 0x00
#define DURATION 0xc0,0x00
#define RECEIVE_ADDR 0x08, 0x00, 0x28, 0x5A, 0x72, 0x3C
#define TRANSMITTER_ADDR 0x08, 0x00, 0x28, 0x5a, 0x78, 0x1e
#define BSSID_ADDR 0x22, 0x44, 0x88, 0x11, 0x22, 0x33
#define FRAME_NUMBER 0x00, 0x00
#define QOS_CTRL 0x00, 0x00
char FrameBaseData[] = {
FRAME_TYPE, FRAME_CONTROL, DURATION, RECEIVE_ADDR, TRANSMITTER_ADDR, BSSID_ADDR, FRAME_NUMBER, QOS_CTRL
};
memcpy(buf, FrameBaseData, sizeof(FrameBaseData));
}
extern "C" void test(int bSend) {
_u8 buf[1536 + 8] {};
int s = createSocket();
makeHdr(buf);
int size = 1536;
//size = 1200;
for (uint32_t nIndex = 0, us = tickUs32(), sec = us, start = us, dt = 0, dtmax = 0, nextsend = us;; us = tickUs32()) {
if (bSend) {
while (tickUs32() < nextsend);
while (1) {
#ifndef SL_PLATFORM_MULTI_THREADED
_SlNonOsHandleSpawnTask();
#endif
if (sl_Send(s, buf, size, 0) == size)
break;
}
nextsend += 1000;
}
else {
while(sl_Recv(s, buf, sizeof(buf), 0) <= 0);
}
++nIndex;
uint32_t now = tickUs32(), stepUs = now - us;
dt += stepUs;
if (dtmax < stepUs)
dtmax = stepUs;
if (now - sec < 1000000)
continue;
sec += 1000000;
UART_PRINT("\r\n%u: %s %u packets avg:%uus max:%uus", (now - start) / 1000, bSend ? "SEND" : "RECV", nIndex, dt / nIndex, dtmax);
nIndex = dt = dtmax = 0;
}
}