【cc3200】wlan_station项目修改为与服务器通讯

来源:互联网 发布:大数据核查汇报 编辑:程序博客网 时间:2024/06/10 21:18

资料来源:郭书军老师的《CC3200应用指南》

主要是里面的osi_TaskCreate让我眼前一亮,创建三个任务,然后分别去执行,就像多进程一样(可能就是多进程……)
实现的效果如下
串口助手发送数据123456(无视后面的回显,我也不知道怎么回事),服务端接收到123456,服务端发送5425,串口助手打印5425

串口助手:
这里写图片描述

为了简便,用socket调试工具模拟服务器:
这里写图片描述

先把wlan_station工程导入,然后着手修改,在创建WlanStationMode后面添加两个任务,分别是发送方法和接收方法

int iNewSockID=0,iFlag=1;//用于代码控制void main(){……    //    // Start the WlanStationMode task    //    lRetVal = osi_TaskCreate( WlanStationMode, \                                (const signed char*)"Wlan Station Task", \                                OSI_STACK_SIZE, NULL, 1, NULL );    if(lRetVal < 0)    {        ERR_PRINT(lRetVal);        LOOP_FOREVER();    }    lRetVal = osi_TaskCreate(SendTask,"SENDTASK",OSI_STACK_SIZE, NULL, 1, NULL);    lRetVal = osi_TaskCreate(ReceiveTask,"RECEIVETASK",OSI_STACK_SIZE, NULL, 1, NULL);    //    // Start the task scheduler    //    osi_start();}

可以看到,我们的串口助手一开始创建了三个任务,也就是说,此时执行了三条线,第一条用来初始化设备,第二条用来创建发送任务,第三条用来创建接收任务

我们一条线一条线来看

首先第一条线是WlanStationMode(只写修改部分)
前面是一些配置WLAN,不用改,把检查连接部分改成BsdTcpClient函数,该函数从tcp_socket复制

void WlanStationMode( void *pvParameters ){……    lRetVal = WlanConnect();    if(lRetVal < 0)    {        UART_PRINT("Failed to establish connection w/ an AP \n\r");        LOOP_FOREVER();    }    UART_PRINT("\r\nConnection established w/ AP and IP is aquired \n\r");    //0xc0a8032f 192.168.3.47 本地PC    lRetVal = BsdTcpClient(8000,0xc0a8032f);    if(lRetVal < 0)    {        UART_PRINT("BsdTcpClient<0 \n\r");    }    lRetVal = sl_Stop(SL_STOP_TIMEOUT);……}

BsdTcpClient函数传入IP地址和PORT,

int BsdTcpClient(unsigned short usPort,unsigned int g_ulDestinationIp){    UART_PRINT("\r\n 启动BsdTcpClient方法,创建socket \r\n");……    // connecting to TCP server    iStatus = sl_Connect(iSockID, ( SlSockAddr_t *)&sAddr, iAddrSize);    if( iStatus < 0 )    {        // error        sl_Close(iSockID);        UART_PRINT("\r\n  iStatus < 0  \r\n");    }    UART_PRINT("\r\n 连接服务器成功 \r\n");    //设置非阻塞模式    long lNonBlocking=1;    iStatus=sl_SetSockOpt(iSockID,SL_SOL_SOCKET,SL_SO_NONBLOCKING,&lNonBlocking,sizeof(lNonBlocking));    if(iStatus<0){        sl_Close(iSockID);    }    iNewSockID=iSockID;//先设置非阻塞,然后再让接收方法执行    while(iFlag){        osi_Sleep(100);    }……}

程序会停在上面的while循环里。

现在我们来看第二条线,其中的代码控制

void SendTask(void *pvParameters){    char cGetChar;    char cTxBuf[100];    int iCounter=0;    int iStatus;    UART_PRINT("\r\n Create SendTask\r\n");    while(1){        cGetChar=MAP_UARTCharGetNonBlocking(UARTA0_BASE);        if( (cGetChar!=0xff) && (iNewSockID>0) ){            cTxBuf[iCounter++]=cGetChar;            if(cGetChar==0x0d || cGetChar==0x1b){                UART_PRINT("\r\n当检测到串口输入的数据中包含回车或十六进制1b时进入此方法\r\n");                cTxBuf[iCounter++]=0x0a;                iStatus=sl_Send(iNewSockID,cTxBuf,iCounter,0);                if( iStatus>0 && cGetChar==0x0d ){                    UART_PRINT("\r\n 发送的数据为: %s \r\n",cTxBuf);                    iCounter=0;                }else{                    UART_PRINT("\r\n cGetChar==0x1b,退出BsdTcpClient的循环\r\n");                    iFlag=0;                }            }//if(cGetChar==0x0d || cGetChar==0x1b)        }//if( (cGetChar!=0xff) && (iNewSockID>0) )        osi_Sleep(100);    }//while(1)}

程序会一直跑在while循环里

第三条线,接收方法

void ReceiveTask(void *pvParameters){    char cRxBuf[100];    int iStatus;    UART_PRINT("\r\n Create ReceiveTask\r\n");    while(1){        if(iNewSockID>0){            iStatus=sl_Recv(iNewSockID,cRxBuf,100,0);            if(iStatus>0){                if( cRxBuf[iStatus-2]==0x0d ){                    cRxBuf[iStatus]=0;                    UART_PRINT("\r\n收到的是%s\r\n",cRxBuf);                }else{                    UART_PRINT("\r\n cRxBuf[iStatus-2]是0x1b,结束循环 \r\n");                    iFlag=0;                }            }        }//if(iNewSockID>0)        osi_Sleep(100);    }//while(1)}
原创粉丝点击