一、 通过TCP/IP协议通信:
1.目标:将PC机中C盘目录下的a.bmp文件通过网口传递给6678 2.准备工作:(CCSv5.2;C++2010;EVM6678L) 1).将PC的IP设为192.168.2.101
2).将6678设为静态IP和No Boot模式,各按键设置如图所示。
3).编译PC端C++程序时,需添加相应的网络应用的库函数WS_32.lib。具体步骤如下: 项目→XXX(文件名)属性→配置属性→链接器→输入→附加依赖项→WS_32.lib 3.程序说明: 1)PC端C++程序
#include
constint DEFAULT_PORT=700; //初始化
WORD wVerisonRequested; WSADATA wsaData;
//6678程序端口号
1 / 9
interr,iLen=0;
wVerisonRequested=MAKEWORD(2,2);
err=WSAStartup(wVerisonRequested,&wsaData); if(err!=0) { }
cout<<\加载WinSock成功!\< SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);//创建基于TCP协议的SOCKET,参数SOCKET_STREAM:if(sockClient==INVALID_SOCKET) { } cout<<\< SOCKADDR_IN addrSrv,addrCli;//初始化PC端和6678端的IP地址,通信协议类型,和程序端口号,//6678 cout<<\< cout<<\加载WinSock失败!\; return 0; TCP;SOCKET_DGRAM:UDP. 作为服务器addrSrv,PC端做客户端addrCli addrCli.sin_family=AF_INET;//通信协议 addrCli.sin_addr.S_un.S_addr=inet_addr(\);//IPaddrCli.sin_port=htons(500);//端口号 //inet_addr()和htons()为字节序转换函数,由于计算机字节序和网络字节序相反,需通过上述函//数进行变换 //将PC端的socket与6678端的socket进行绑定 //读入a.bmp文件 ifstreaminfile(\,ios::binary); staticcharbmpBuf[768][1024][3],ack;//bmpBuf用于存放读入的bmp位图数据 err=bind(sockClient,(SOCKADDR*)&addrCli,sizeof(SOCKADDR)); if (err!=0) { } cout<<\< cout<<\< addrSrv.sin_family=AF_INET; addrSrv.sin_addr.S_un.S_addr=inet_addr(\); addrSrv.sin_port=htons(DEFAULT_PORT); 2 / 9 BITMAP bmpHeader,*pbmpHeader=&bmpHeader;//用于存放bmp文件头 memset(pbmpHeader,0,sizeof(BITMAP)); BITMAPINFOHEADER bmpInfoHeader,*pbmpInfoHeader=&bmpInfoHeader;//用于存放bmp位图信息//头 memset(pbmpInfoHeader,0,sizeof(BITMAPINFOHEADER)); in ((char*)pbmpHeader,sizeof(BITMAP));//读入bmp文件头 in((char*)pbmpInfoHeader,sizeof(BITMAPINFOHEADER));//读入bmp位图信息头 cout< if(bmpHeader.bfOffBits==0x36&&bmpInfoHeader.biBitCount==0x18)//判断有无彩色板,以及//是否是{ } elsegoto end; in((char*)bmpBuf,sizeof(bmpBuf));//读入位图信息 24位真彩色图像,本程序只对上述条件成立的图像才能正确执行。 //连接PC和6678 //开始发送位图数据 int count=2359296;//需要发送的总字节数1024*768*3 char *pbuf=bmpBuf[0][0]; //用于指定未发字符的开头 for(err=0;count>0;count-=err) { pbuf+=err; err=send(sockClient,pbuf,1024,0); if(err==SOCKET_ERROR) { cout<<\< err=connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); if (err==INVALID_SOCKET) { } cout<<\连接成功!\< cout<<\< }//发送位图数据 iLen=recv(sockClient,&ack,1,0);//接收6678返回的收到确认信息 if(iLen==0) { } if(iLen==SOCKET_ERROR) cout<<\< 3 / 9 } { } cout< cout<<\< if(count==0) cout<<\全部发送成功!\< end://缓存释放 } in(); in(); closesocket(sockClient); WSACleanup(); 2)6678端程序 程序改自helloworld例程运行流程如下: main()→BIOS_start()→主线程StackTest()→网络服务循环: do { rc = NC_NetStart( hCfg, NetworkOpen, NetworkClose, NetworkIPAddr ); } while(rc> 0 ); 其中NetworkOpen用于新建一个基于socket的daemon进程,用于侦听和服务网口的通信请求 staticvoidNetworkOpen() { // Create our local server hHello = DaemonNew( SOCK_STREAM, 0, 700, dtask_tcp_hello, OS_TASKPRINORM, OS_TASKSTKNORM, 0, 1 ); } SOCK_STREAM:表示该daemon进程中的socket类型为TCP,UDP对应的是SOCK_DGRAM; 0:该参数为本地IP,0表示任意; 700:程序端口号; dtask_tcp_hello:回调函数指针,当有网络通信请求时,调用该函数,udp对应的回调函数指针是dtask_udp_hello; OS_TASKPRINORM:为回调函数生成的task的优先级; OS_TASKSTKNORM:该task的堆栈尺寸 4 / 9 0:传递给回调函数的参数 1:回调函数实体的最大个数(UDP必须为1) 因此采用不同的传输层协议时(TCP或UDP)需对应的更改第一、第四和最后一个参数。 且在hello.c的开头对相应的回调函数进行申明: externintdtask_tcp_hello(); 同时建立一个用于存放图片数据的buffer charbufqgp[768][1024][3]; 当有基于TCP的网络服务请求时创建一个新task,调用dtask_tcp_hello(); #include externcharbufqgp[768][1024][3]; //存储图像 // // dtask_tcp_hello() - TCP Echo Server Daemon Function // (SOCK_DGRAM, port 7) // // Returns \ // intdtask_tcp_hello( SOCKET s, UINT32 unused ) { structtimeval to; int i=0,count=2359296; char *pBuf=bufqgp[0][0],rec=65; (void)unused; // Configure our socket timeout to be 3 seconds to.tv_sec = 3; to.tv_usec = 0; setsockopt( s, SOL_SOCKET, SO_SNDTIMEO, &to, sizeof( to ) ); setsockopt( s, SOL_SOCKET, SO_RCVTIMEO, &to, sizeof( to ) ); for(;count!=0;count-=i) { i = (int)recv( s, (void *)pBuf, count, 0 ); // Spit any data back out if(i>0) { send( s, &rec, 1,0 ); pBuf+=i; } //qgp 5 / 9
电脑与6678通过网口通信



