年前买了两块CC3235S开发板体验一下。主要是运用在物联网方面,想做成串口透传更方便运用到项目上。
功能实现了,不过实际没有用上。
所以分享一下串口透传的程序。
使用的是CCS编译器,TIRTOS。程序使用AT_COMMANDS例程改写。程序仅是用来验证串口透传的收发能力,有部分问题没有解决。
主要代码是这三个函数:
//*****************************************************************************
//
//! ATCommands_RecvTask
//!
//! \param pvParameters
//!
//! \return none
//!
//! \brief AT event Task handler function to receive inputs
//
//*****************************************************************************
void * ATCommands_RecvTask(void *pvParameters)
{
int status;
SlSocklen_t AddrSize;
AddrSize = sizeof(SlSockAddrIn_t);
#ifdef AP
Addr.sin_port = sl_Htons(sta_port);
Addr.sin_addr.s_addr = sl_Htonl(SL_IPV4_VAL(sta_addr3, sta_addr2, sta_addr1, sta_addr0));
#else
Addr.sin_port = sl_Htons(ap_port);
Addr.sin_addr.s_addr = sl_Htonl(SL_IPV4_VAL(ap_addr3, ap_addr2, ap_addr1, ap_addr0));
#endif
while(1)
{
status = sl_RecvFrom(Sd, RecvBuf, ATCOMMANDS_RECV_BUF_SIZE, 0, ( SlSockAddr_t *)&Addr, &AddrSize);
SendData(RecvBuf, status);
LED_toggle(ledHandle[1]);
}
}
//*****************************************************************************
//
//! ATCommands_SendTask
//!
//! \param pvParameters
//!
//! \return none
//!
//! \brief AT event Task handler function to receive inputs
//
//*****************************************************************************
void * ATCommands_SendTask(void *pvParameters)
{
int len;
#ifdef AP
Addr.sin_port = sl_Htons(sta_port);
Addr.sin_addr.s_addr = sl_Htonl(SL_IPV4_VAL(sta_addr3, sta_addr2, sta_addr1, sta_addr0));
#else
Addr.sin_port = sl_Htons(ap_port);
Addr.sin_addr.s_addr = sl_Htonl(SL_IPV4_VAL(ap_addr3, ap_addr2, ap_addr1, ap_addr0));
#endif
while(1)
{
//usleep(1);
len = GetRawCmd(SendBuf, ATCOMMANDS_SEND_BUF_SIZE);
sl_SendTo(Sd, SendBuf, len, 0, (SlSockAddr_t*)&Addr,sizeof(SlSockAddr_t));
}
}
//*****************************************************************************
//
//! mainThread
//!
//! \param pvParameters
//!
//! \return none
//!
//! \brief Task handler
//
//*****************************************************************************
void mainThread(void *pvParameters)
{
//uint8_t Mode = 1;
uint8_t channel = 36;
uint8_t Ssid[] = "Test_AP";
uint8_t val = SL_WLAN_SEC_TYPE_WPA_WPA2;
uint8_t password[] = {"12345678"};
uint16_t len = strlen(password);
int32_t status = 0;
int16_t Role;
int16_t Index;
SlWlanSecParams_t SecParams;
LED_Params ledParams;
pthread_attr_t pAttrs;
pthread_attr_t pAttrs1;
struct sched_param priParam;
/* Initialize SlNetSock layer with CC31xx/CC32xx interface */
status = ti_net_SlNet_initConfig();
if(0 != status)
{
UART_PRINT("Failed to initialize SlNetSock\n\r");
}
GPIO_init();
SPI_init();
LED_init();
/* Open LED0 and LED1 with default params */
LED_Params_init(&ledParams);
ledHandle[CONFIG_LED_1] = LED_open(CONFIG_LED_1, &ledParams);
ledHandle[CONFIG_LED_2] = LED_open(CONFIG_LED_2, &ledParams);
/* Configure the UART */
InitTerm();
/* Create AT Command module */
#ifdef AP
ATCmd_create();
sl_Start(0, 0, 0);
sl_WlanSetMode(ROLE_AP);
sl_Stop(0);
Role = sl_Start(0, 0, 0);
if (ROLE_AP != Role)
{
UART_PRINT("AP failure:%d\n\r", Role);/* Role Error */
} else {
UART_PRINT("Role:%d\n\r", Role);
}
/* AP */
//sl_WlanSet(SL_WLAN_CFG_GENERAL_PARAM_ID, SL_WLAN_GENERAL_PARAM_OPT_ENABLE_5G, 1, (_u8*)&Mode);
sl_WlanSet(SL_WLAN_CFG_AP_ID, SL_WLAN_AP_OPT_CHANNEL, 1, (_u8 *)& channel);
sl_WlanSet(SL_WLAN_CFG_AP_ID, SL_WLAN_AP_OPT_SSID, strlen(Ssid), Ssid);
sl_WlanSet(SL_WLAN_CFG_AP_ID, SL_WLAN_AP_OPT_SECURITY_TYPE, 1, (_u8 *)&val);
sl_WlanSet(SL_WLAN_CFG_AP_ID, SL_WLAN_AP_OPT_PASSWORD, len, (_u8 *)password);
Sd = sl_Socket(SL_AF_INET, SL_SOCK_DGRAM, 0);
if( 0 > Sd )
{
UART_PRINT("Socket error\n\r");// error
}
UART_PRINT("Socket:%d\n\r", Sd);
Addr.sin_family = SL_AF_INET;
Addr.sin_port = sl_Htons(ap_port);
Addr.sin_addr.s_addr = sl_Htonl(SL_IPV4_VAL(ap_addr3, ap_addr2, ap_addr1, ap_addr0));
status = sl_Bind(Sd, ( SlSockAddr_t *)&Addr, sizeof(SlSockAddrIn_t));
if( status )
{
UART_PRINT("Bind error:%d\n\r", status);// error
} else {
UART_PRINT("Bind Success\n\r");
}
#else
ATCmd_create();
sl_Start(0, 0, 0);
sl_WlanSetMode(ROLE_STA);
sl_Stop(0);
Role = sl_Start(0, 0, 0);
if (ROLE_STA != Role)
{
UART_PRINT("STA failure:%d\n\r", Role);/* Role Error */
} else {
UART_PRINT("Role:%d\n\r", Role);
}
/* STA */
SecParams.Type = SL_WLAN_SEC_TYPE_WPA_WPA2;
SecParams.Key = "00000000";
SecParams.KeyLen = strlen(SecParams.Key);
Index = sl_WlanProfileAdd("Test_AP", strlen("Test_AP"), NULL, &SecParams, NULL, 15 /*Priority*/, 0);
UART_PRINT("Index:%d\n\r", Index);
/*status = sl_WlanConnect("Test_AP", strlen("Test_AP"), 0,&SecParams, 0);
while (status)
{
UART_PRINT("Connect failure :%d\n\r", status);
sleep(1);
status = sl_WlanConnect("Test_AP", strlen("Test_AP"), 0,&SecParams, 0);
}
UART_PRINT("Connect Success\n\r");*/
Sd = sl_Socket(SL_AF_INET, SL_SOCK_DGRAM, 0);
if( 0 > Sd )
{
UART_PRINT("Socket error\n\r");
}
UART_PRINT("Socket:%d\n\r", Sd);
Addr.sin_family = SL_AF_INET;
Addr.sin_port = sl_Htons(sta_port);
Addr.sin_addr.s_addr = SL_INADDR_ANY;//sl_Htonl(SL_IPV4_VAL(sta_addr3, sta_addr2, sta_addr1, sta_addr0));
status = sl_Bind(Sd, ( SlSockAddr_t *)&Addr, sizeof(SlSockAddrIn_t));
if( status )
{
UART_PRINT("Bind error:%d\n\r", status);
} else {
UART_PRINT("Bind Success\n\r");
}
#endif
ATCommands_displayBanner();
pthread_attr_init(&pAttrs);
priParam.sched_priority = 5;
status = pthread_attr_setschedparam(&pAttrs, &priParam);
status |= pthread_attr_setstacksize(&pAttrs, ATCOMMANDS_TASK_STACK_SIZE);
status =
pthread_create( &ATCommands_Recv,
&pAttrs,
ATCommands_RecvTask,
NULL );
if(status != 0)
{
UART_PRINT("could not create task\n\r");
/* error handling */
while(1)
{
;
}
}
pthread_attr_init(&pAttrs1);
priParam.sched_priority = 4;
status = pthread_attr_setschedparam(&pAttrs1, &priParam);
status |= pthread_attr_setstacksize(&pAttrs1, ATCOMMANDS_TASK_STACK_SIZE);
status =
pthread_create( &ATCommands_Send,
&pAttrs1,
ATCommands_SendTask,
NULL );
if(status != 0)
{
UART_PRINT("could not create task\n\r");
/* error handling */
while(1)
{
;
}
}
//ATCommands_readCmd();
}
在mainThread函数中初始化CC3235芯片。AP和STA模式通过宏定义决定。
AP模式:
需要写配置模式sl_WlanSetMode(ROLE_AP);
在配置各种参数channel,ssid,password,val。
5G频段的channel是36、40、44、48、52、56、60、64、100、104、108、112、116、120、124、128、132、136、140、144、149、153、157、161、165
使用的UDP,先创建socket,在绑定IP地址和端口
STA模式:
需要写配置模式sl_WlanSetMode(ROLE_STA);
我配置了自动连接。
SecParams.Type = SL_WLAN_SEC_TYPE_WPA_WPA2;
SecParams.Key = "00000000";
SecParams.KeyLen = strlen(SecParams.Key);
Index = sl_WlanProfileAdd("Test_AP", strlen("Test_AP"), NULL, &SecParams, NULL, 15 /*Priority*/, 0);
同样是UDP,创建socket,但是之后这一步一直没懂,当STA配置地址时,不能自己设定IP,只能使用:
Addr.sin_addr.s_addr = SL_INADDR_ANY;
才不会报错。
如果我使用:
Addr.sin_addr.s_addr = sl_Htonl(SL_IPV4_VAL(sta_addr3, sta_addr2, sta_addr1, sta_addr0));
这样自己设定的IP,sl_Blnd函数会报错。所以导致程序有一个问题,最后再说。
这样AP和STA配置完成后,就可以开始通讯了。
ATCommands_RecvTask函数用来接收CC3235S信息,并将信息通过串口打印出来。
ATCommands_SendTask函数用来接收串口信息,并通过CC3235S发送出去。
测试结果就不说了,毕竟是面向的物联网。
遇到的问题是,由于STA不能用自定的IP,所以必须AP收到一次STA的数据,AP才能知道STA的地址。之后才能自由的串口透传。也希望大家帮忙解决一下。
最后把C文件传上来
at_commands.zip
(3.51 KB)
|