【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)}
阅读全文
0 0
- 【cc3200】wlan_station项目修改为与服务器通讯
- 浏览器与服务器通讯
- 通过JSON与服务器通讯
- UDP通讯:服务器与客户端
- smartfoxserver2x 与服务器通讯(二)
- android与服务器通讯方式
- AngularJS – 与服务器通讯
- 使用RequestBuilder与服务器通讯
- 使用WinHTTP与服务器通讯
- 【cc3200】向服务器发送温度数据
- VB.NET与WEB服务器通讯
- VB.NET与WEB服务器通讯
- VB.NET与WEB服务器通讯
- WFE与Index服务器之前的通讯
- Android与服务器的简单通讯
- android httpclient与javaweb服务器通讯
- 使用hessian进行服务器与客户端通讯
- 客户端与服务器通讯的类
- 只懂JavaScript也可以开发VR/AR内容了!
- kvo 实践使用总结
- 很多资料的博客,常看
- 身为前端攻城狮‘必知’的 JavaScript 知识点
- QProcess 进程类—调用外部程序
- 【cc3200】wlan_station项目修改为与服务器通讯
- Redis操作手册
- Linux下搭建maven-nexus私服仓库
- verdi/debussy的快捷键 以及基本操作
- cmake学习笔记
- 欢迎使用CSDN-markdown编辑器
- Redis_lesson2 _ Redis 杂项与基础命令整理
- 解决AndroidStudio导入项目在 Building gradle project info 一直卡住
- nginx-rtmp配置