打印
[wifi]

【TI无线】CC3235串口透传程序分享

[复制链接]
17274|33
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ddplys|  楼主 | 2020-5-18 20:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
年前买了两块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)

使用特权

评论回复

相关帖子

沙发
dirtwillfly| | 2020-5-18 21:30 | 只看该作者
你最后说的这个问题,是有网络通讯的协议决定的。
必须先建立连接,ap才能知道sta的地址,才能进行数据传输

使用特权

评论回复
板凳
selongli| | 2020-5-25 16:08 | 只看该作者

使用特权

评论回复
地板
wiba| | 2020-6-1 15:30 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
5
zljiu| | 2020-6-1 15:30 | 只看该作者
代码好详细啊

使用特权

评论回复
6
coshi| | 2020-6-1 15:30 | 只看该作者
请问什么叫透传啊

使用特权

评论回复
7
aoyi| | 2020-6-1 15:31 | 只看该作者
楼主辛苦了

使用特权

评论回复
8
drer| | 2020-6-1 15:31 | 只看该作者
方便分享整个工程吗

使用特权

评论回复
9
gwsan| | 2020-6-1 15:31 | 只看该作者
感谢楼主的分享呀

使用特权

评论回复
10
gygp| | 2020-7-2 20:52 | 只看该作者
怎么用两个串口做透传  

使用特权

评论回复
11
chenci2013| | 2020-7-2 21:04 | 只看该作者
CC3235芯片是TI公司的第三代Wi-Fi产品

使用特权

评论回复
12
biechedan| | 2020-7-2 21:04 | 只看该作者
这个的性能怎么样     

使用特权

评论回复
13
wangdezhi| | 2020-7-2 21:05 | 只看该作者
      

使用特权

评论回复
14
isseed| | 2020-7-2 21:05 | 只看该作者
怎么设置为串口透传模式  

使用特权

评论回复
15
xietingfeng| | 2020-7-2 21:05 | 只看该作者
透传模块怎么使用  

使用特权

评论回复
16
suzhanhua| | 2020-7-2 21:05 | 只看该作者
串口模块之间透传需要注意什么

使用特权

评论回复
17
mituzu| | 2020-7-2 21:06 | 只看该作者
串口透传模块怎么使用

使用特权

评论回复
18
hellosdc| | 2020-7-2 21:06 | 只看该作者
如何做出稳定的BLE蓝牙4.0串口透传模块

使用特权

评论回复
19
uiint| | 2020-7-2 21:06 | 只看该作者
CC3235S的原理图有吗   

使用特权

评论回复
20
wangdezhi| | 2020-7-2 21:06 | 只看该作者
谢谢楼主分享的资料了   

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

7

帖子

0

粉丝