好文档 - 专业文书写作范文服务资料分享网站

电脑与6678通过网口通信

天下 分享 时间: 加入收藏 我要投稿 点赞

一、 通过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 #include usingnamespacestd; #include #include #include int main() {

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 #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通过网口通信

一、通过TCP/IP协议通信:1.目标:将PC机中C盘目录下的a.bmp文件通过网口传递给66782.准备工作:(CCSv5.2;C++2010;EVM6678L)1).将PC的IP设为192.168.2.1012).将6678设为静态IP和NoBoot模式,各按键设置如图所示。3).编译PC端C++程序时,需添加相应
推荐度:
点击下载文档文档为doc格式
4a36v8gmtc8az813jgo32teb88j4b1005wt
领取福利

微信扫码领取福利

微信扫码分享