CC3200 freemodbus-tcp移植过程
来源:互联网 发布:淘宝退款在哪里看 编辑:程序博客网 时间:2024/05/17 07:07
- 工程所在github:https://github.com/RaphaelZheng/CC3200-MODBUS-TCP
准备工作
- 一个wifi:提供连接测试
- freemodbus包:移植需要
- 我这里选择的是freemodbus-v1.50
- CC3200开发环境
- 我使用的是CCS
- 需要下载SDK,通过改编example来移植
移植分析
- 根据modbus-tcp原理分析得知需要通过socket进行通信,所以选择了TI提供的SDK中examples中的tcp_socket进行移植操作
移植过程
- modbus文件
- 选择freemodbus中的模块
- 我这里选择了demo中的MCF5235TCP作为参考模板!
- 我这里选择了demo中的MCF5235TCP作为参考模板!
- 在MCF5235TCP我们需要选择port文件夹,并在portttcp.h中添加simplelink.h头文件,然后注释掉所有的lwip相关头文件
- 将modbus文件夹中的functions、include、tcp文件夹以及mb.文件全部添加到工程中
- 最终modbus模块包含文件
- 还有一些全局变量需要修改,请按程序报错修改
- 选择freemodbus中的模块
- CCS工程文件修改
- 添加头文件文件夹,将相应modbus下属文件夹都添加进去
- main文件修改
- 将demo.c中的一些宏定义复制过来
- 利用socket的BsdTcpServer进行修改
- 将demo.c中的一些宏定义复制过来
int BsdTcpServer(unsigned short usPort){ SlSockAddrIn_t sAddr; SlSockAddrIn_t sLocalAddr; int iCounter; int iAddrSize; int iSockID; int iStatus; int iNewSockID; long lLoopCount = 0; long lNonBlocking = 1; int iTestBufLen; iTestBufLen = BUF_SIZE; //filling the TCP server socket address sLocalAddr.sin_family = SL_AF_INET; sLocalAddr.sin_port = sl_Htons((unsigned short)usPort); sLocalAddr.sin_addr.s_addr = 0;// // creating a TCP socket// iSockID = sl_Socket(SL_AF_INET,SL_SOCK_STREAM, 0);//// if( iSockID < 0 )// {// // error// ASSERT_ON_ERROR(SOCKET_CREATE_ERROR);// }////// iAddrSize = sizeof(SlSockAddrIn_t);//// // binding the TCP socket to the TCP server address// iStatus = sl_Bind(iSockID, (SlSockAddr_t *)&sLocalAddr, iAddrSize);// if( iStatus < 0 )// {// // error// sl_Close(iSockID);// ASSERT_ON_ERROR(BIND_ERROR);// }//// // putting the socket for listening to the incoming TCP connection// iStatus = sl_Listen(iSockID, 0);// if( iStatus < 0 )// {// sl_Close(iSockID);// ASSERT_ON_ERROR(LISTEN_ERROR);// } vMBServerTask(); while(1) { eMBPoll(); }// // setting socket option to make the socket as non blocking// iStatus = sl_SetSockOpt(iSockID, SL_SOL_SOCKET, SL_SO_NONBLOCKING,// &lNonBlocking, sizeof(lNonBlocking));// if( iStatus < 0 )// {// sl_Close(iSockID);// ASSERT_ON_ERROR(SOCKET_OPT_ERROR);// }// iNewSockID = SL_EAGAIN;//////////// // waiting for an incoming TCP connection// while( iNewSockID < 0 )// {// // accepts a connection form a TCP client, if there is any// // otherwise returns SL_EAGAIN// iNewSockID = sl_Accept(iSockID, ( struct SlSockAddr_t *)&sAddr,// (SlSocklen_t*)&iAddrSize);//// /*// eMBErrorCode xStatus;// UCHAR test_array[5];// xStatus = eMBRegHoldingCB( test_array, 0, 5,MB_REG_WRITE);// UART_PRINT( "eMBRegHoldingCB%d\r\n",xStatus );// xStatus = eMBPoll();// UART_PRINT( "eMBPoll%d\r\n",xStatus );// //* An error occured. Maybe we can restart. */// /*// while(1)// {// xStatus =eMBRegHoldingCB(test_array,0,1,MB_REG_READ);// if(test_array[0]==6)// {//// UART_PRINT( "eMBDisable\r\n");// ( void )eMBDisable( );// UART_PRINT( "eMBClose\r\n");// ( void )eMBClose( );// }// }*///// }//// // waits for 1000 packets from the connected TCP client//// int t=0;// while (lLoopCount < g_ulPacketCount)// {// iStatus = sl_Recv(iNewSockID, g_cBsdBuf, iTestBufLen, 0);// Report("Recieved times%d",++t);// int i=0;// for( i=0;i<20;i++)// {// Report("%x\r\n",g_cBsdBuf[i]);// }// Report("\n\r");// if( iStatus <= 0 )// {// // error// sl_Close(iNewSockID);// sl_Close(iSockID);// ASSERT_ON_ERROR(RECV_ERROR);// }//// lLoopCount++;// }//// //Report("Recieved %u packets successfully\n\r",g_ulPacketCount);//// // close the connected socket after receiving from connected TCP client// iStatus = sl_Close(iNewSockID);// ASSERT_ON_ERROR(iStatus);// // close the listening socket// iStatus = sl_Close(iSockID);// ASSERT_ON_ERROR(iStatus); return SUCCESS;}
- server初始化
voidvMBServerTask( void ){ eMBErrorCode xStatus; UCHAR const * a=NULL; eMBSetSlaveID( 1, 0xff,a,0);//设置从机 UART_PRINT( "vMBServerTask\r\n"); if( eMBTCPInit( MB_TCP_PORT_USE_DEFAULT ) != MB_ENOERR ) { UART_PRINT( "can't initialize modbus stack!\r\n"); } else if( eMBEnable( ) != MB_ENOERR ) { UART_PRINT( "can't enable modbus stack!\r\n" ); }}
- main函数中还有一些非tcp模式的需要注释,具体请参考我的github
测试连接
- CC3200连接上wifi,等待主机连接
- 启动主机测试
- 可以实现改写寄存器和读取寄存器数据
0 0
- CC3200 freemodbus-tcp移植过程
- STM32 移植FreeModbus 详细过程
- freemodbus移植stm32过程分析及代码
- 移植Freemodbus
- 移植freemodbus
- STM32 上移植FreeModbus详细过程(学习总结)
- FreeModbus移植经验分享
- FreeModbus移植 经验分享
- MODBUS之FREEMODBUS移植
- freemodbus移植讲解
- freemodbus移植讲解 ZZ
- STM32 freemodbus TCP 通讯
- 移植DS1302到CC3200
- 基于EncEthernet的FreeModbus-TCP 在stm32上的移植与测试
- 基于EncEthernet的FreeModbus-TCP 在stm32上的移植与测试
- CC3200 TCP socket编程
- CC3200 TCP socket编程
- 移植freemodbus到vxworks 6
- 支付宝支付-常用支付API详解(查询、退款、提现等)
- Hibernate框架流程
- 蓝桥杯=横向打印二叉树
- JS设计模式之基于组合模式的code review
- DFS+剪枝
- CC3200 freemodbus-tcp移植过程
- mfc的控件与响应顺序
- Spring学习笔记之使用对象-关系映射持久化数据
- VS2015 使用GDI+ 和 easyX的安装
- 2017年华东师范大学网络赛 A
- KMP算法 Java实现
- company——桶思想
- 模块化开发
- JAVA String、StringBuilder和StringBuffer区别