基于VC++的WinCE网口通信
基于VC++的WinCE网口通信
WinCE下的网络编程与Windows下的非常类似,只是个别API函数有所不同。同样分为UDP和TCP两种,UDP就是无连接的通信,通过“用户数据报协议”(UDP)来完成的;而TCP是有连接的,即传输控制协议,实现无差错无重复的顺序数据传输。
一、UDP编程
UDP编程相对简单:首先调用socket函数创建数据报套接字,然后调用bind函数绑定本地地址后,接着就可以调用sendto和recvfrom函数来直接发送数据和接收数据了。在sendto函数里参数to直接指定了接收方的地址和端口号,而recvfrom函数里的参数from可以直接得到接收数据的来源。
UDP最大的特定就是不存在客户端与服务器之说,故编制的客户端程序也就是服务器端程序,下面建立一个WinCE充当客户端,而上位机的Windows做服务器。
WinCE用参考书目1中的现成类,主要代码如下:
#define WM_RECV_UDP_DATA WM_USER + 101 //UDP 接收数据消息
afx_msg LONG OnRecvUdpData(WPARAM wParam,LPARAM lParam); // UDP接收数据处理函数
//UDP接收数据事件
static void CALLBACK OnUdpCERecv(void * pOwner,char*buf,DWORD dwBufLen,sockaddr * addr);
static void CALLBACK OnUdpCEError(void * pOwner,intnErrorCode); //UDP通讯错误事件
CUDP_CEm_CEUdp; //定义UDP通讯类变量
void CUDP_WinceDlg::OnBnClickedButtonOpen() //建立,打开UDP通讯端口函数
{
UpdateData(TRUE);
m_CEUdp.m_OnUdpRecv =OnUdpCERecv;
m_CEUdp.m_OnUdpError =OnUdpCEError;
DWORD nResult =m_CEUdp.Open(this,m_LocalPort,m_RemoteHost.GetBuffer(m_RemoteHost.GetLength()),m_RemotePort); //此Open函数包括创建UDP套接字,绑定地址,创建通讯线程,让线程开始运行等函数
if (nResult <=0)
{
AfxMessageBox(_T("打开端口失败"));
}
else
{
AfxMessageBox(_T("打开端口成功"));
}
}
m_CEUdp.Close(); //关闭UDP端口函数很简单,一条命令即可,纸条调用线程退出事件,通知线程退出
void CUDP_WinceDlg::OnBnClickedButtonSend()
{ //由于下面的SendData函数的定义原因,此处只能是发送char型数据了,不能发送unsigned char 型
char send_byte[14];
char *buf = NULL;
unsigned charuch1,uch2;
send_byte[0]= 'A'; send_byte[1] = 'A'; //AA 170
send_byte[2]= 0x0; send_byte[3] =0x0;
send_byte[4]= 0x0; send_byte[5] =0xf;
send_byte[6]= 0x1; send_byte[7] =0xf;
uch1 = (unsigned char)(num1>>8);
send_byte[8]= char(uch1/16);
send_byte[9]= char(uch1-(send_byte[8]*16));
uch2 = (unsigned char)num1;
send_byte[10]= char(uch2/16);
send_byte[11]= char(uch2-(send_byte[10]*16));
send_byte[12]= 'F'; send_byte[13] = 'F';
buf =send_byte;
m_CEUdp.SendData(buf,15); //发送数据
num1 = num1+ 1;
delete[] buf; //释放内存
buf = NULL;
}
更多代码,参考书目1。
Windows下面的服务器代码如下:
CSocket m_sockRecv;
m_sockRecv.Create(5800,SOCK_DGRAM,"192.168.1.113");
m_sockRecv.Bind(5800,"192.168.1.113");
SetTimer(1,2000,NULL);
void CSocket1_serverDlg::OnTimer(UINT nIDEvent)
{
//TODO: Add your message handler code here and/or call default
char szRecv[20];
CString szIP("192.168.1.112");
//CString szIP("10.11.200.251");
UINTnPort=5804;
int iRecv =m_sockRecv.ReceiveFrom(szRecv,10,szIP,nPort,0); //接受数据,此处的10是接受10个字节的数据
TRACE("received %d byte\n",iRecv);
szRecv[iRecv]='\0';
m_sockRecv.SendTo(szRecv,iRecv,5804,"192.168.1.112",0); //将接受到的数据返回,看是否正确
m_StrRecv=szRecv;
UpdateData(FALSE);
CDialog::OnTimer(nIDEvent);
}
二、TCP编程
TCP编程相对于UDP编程而言要复杂的多,TCP服务器编程的一般流程为:首先TCP服务器端调用socket函数建立流式套接字,然后调用bind函数绑定本地地址,接着调用Listen函数进行监听客户端连接,一旦监听到客户端连接请求以后,服务器套接字就会调用Accpet函数接受客户端连接请求,并建立连接,同时服务器端会新增加一个单独的套接字与可无端进行通讯。
对于TCP客户端来说,编程的过程就相对简单多了。首先客户端调用socket函数建立流式套接字,然后调用connect函数,请求与服务器端TCP建立连接,成功建立连接后,就可以同服务器端进行通讯了。
1、 WinCE客户端编程
这里主要还是参考书目1中的CTPClient_CE类来完成的,该类的主要特点是,执行Open方法后将创建一个单独的线程来检测通讯事件,检测通讯的工作通过Select函数来完成。
2、 WinCE服务器端编程
参考书目1中的TCP服务器端支持多个客户端连接,是典型的C/S结构。在该实例中创建CTCPServer_CE和CTCPCustom_CE两个类,其中CTCPServer_CE类也创建了一个线程,并通过Select函数来检测是否有客户端连接,一旦有客户端请求连接,它就负责接收此连接,并创建一个新的CTCPCustom_CE对象与客户端进行通讯,然后CTCPServer_CE类接着监听其它客户端的请求。
CTCPCustom_CE类与上面的CTCPClient_CE类非常相似,不同的就是少了一个Connect方法,这是因为只有服务器端接收了一个客户端的连接后,才有CTCPCustom_CE类与客户端进行通讯。
3、Windows服务器端编程
Windows服务器端编程采用的是CWSocket类来完成的,这个函数比较复杂。首先建立服务,然后开启服务(开启服务的同时,已经服务器的侦听函数带入类中),通过try,catch函数开启,然后是死循环一直在执行,通过ReadData函数读取,读的过程中使用了超时控制函数TimeoutControl;发送过程相对简单,直接调用SendData函数发送。
参考文献
[1] 汪兵.Windows CE 嵌入式高级编程与实例详解(用C++实现),[M].中国水利水电出版社,2008
基于VC++的WinCE网口通信的更多相关文章
- (转载)用vs2010开发基于VC++的MFC 串口通信一*****两台电脑同一个串口号之间的通信
此文章以visual C++数据採集与串口通信測控应用实战为參考教程 此文章适合VC++串口通信入门 一.页面布局及加入控件 1, 安装好vs2010如图 2, 新建一个基于VC++的MFC项目com ...
- 012 基于FPGA的网口通信实例设计【转载】
一.网口通信设计分类 通过上面其他章节的介绍,网口千兆通信,可以使用TCP或者UDP协议,可以外挂PHY片或者不挂PHY片,总结下来就有下面几种方式完成通信: 图8‑17基于FPGA的网口通信实例设计 ...
- WinSock2.0通信的一个例子(基于VC++6.0开发测试)
实验目的: 掌握Winsock2.0套接字编程技术的基本方法. 实验要求: 运用TCP/IP Winsock2.0套接字编程技术,使用VC编写一个面向连接通信的服务端程序与客户端程序,服务器先与端口3 ...
- 基于335X的UBOOT网口驱动分析
基于335X的UBOOT网口驱动分析 一.软硬件平台资料 1. 开发板:创龙AM3359核心板,网口采用RMII形式 2. UBOOT版本:U-Boot-2016.05,采用FDT和DM. 参考链 ...
- 自己编写的基于VC++6.0的串口调试软件,并贡献源程序!
自己编写的基于VC++6.0的串口调试软件源程序! 程序下载链接: 点击打开链接
- 基于VC++ Win32+CUDA+OpenGL组合与VC++ MFC SDI+CUDA+OpenGL组合两种方案的遥感影像显示:获得的重要结论!
1.基于VC++ Win32+CUDA+OpenGL组合的遥感影像显示 在该组合方案下,初始化时将OpenGL设置为下面两种方式,效果一样 //设置方式1 glutInitDisplayMode (G ...
- Android基于UDP的局域网聊天通信
代码地址如下:http://www.demodashi.com/demo/12057.html 记得把这几点描述好咯:代码实现过程 + 项目文件结构截图 + 演示效果 1. 开发环境 1.1 开发工具 ...
- RRiBbit,一个事件总线.基于spring配置不同服务通信!
1.何为RRiBbit? *一种开源事件总线技术,能够让模块(组件)之间双向通讯,也被称为请求相应总线(request-response-bus),使用简单,相对其他框架来说,RRiBbit只需要加个 ...
- day31——recv工作原理、高大上版解决粘包方式、基于UDP协议的socket通信
day31 recv工作原理 源码解释: Receive up to buffersize bytes from the socket. 接收来自socket缓冲区的字节数据, For the opt ...
随机推荐
- ugui之圆角矩形头像实现
这个是参考大神的修改了一下渲染方式实现的,可以去查看原帖的,原贴是圆形头像,原理讲的非常详细 点击这里 我写的这个只支持正方形图片,效果是酱紫的~ 一共三个代码,还需要两个代码,原帖里都有的,我只是修 ...
- git自动更新网站代码
1.实现过程在linux上安装git服务.创建源版本库.从源版本库克隆得到网站目录,然后利用git中的hooks机制,在git push推送代码到源版本库的时候,触发编写的shell脚本,更新网站目录 ...
- after() 和 remove() 实现替换
<div class="replacedDiv">this is the replaced div</div> <script> ...
- JavaScript 二维数组排列组合2
<html> <head> <title>二维数组排列组合</title> </head> <body> <div id= ...
- Angular的生命周期钩子
没有什么不能用一张图来解决.
- 为什么canvas宽高要设置在标签内>>宽高设置在style和设置在canvas的区别
一直很困惑为什么canvas标签和其他标签不一样,宽高需要设置在canvas标签里,设置在style里就会有问题. 纯粹个人理解,有错误欢迎指出. > 结论写在头 设置在style里有问题其实是 ...
- GTX650Ti,GT610安装黑苹果之经验与步骤
安装这两个显卡的黑苹果都是10.9以上的版本,一个是10.9.2,一个是10.9.4,最后都完美.主板一个是Z77,一个是H61. 1. 开始安装完以后,显卡不工作,能够安全模式进去. 2. 删除Ap ...
- 任务十五:零基础JavaScript编码(三)
任务目的 在上一任务基础上继续JavaScript的体验 接触一下JavaScript中的高级选择器 学习JavaScript中的数组对象遍历.读写.排序等操作 学习简单的字符串处理操作 任务描述 参 ...
- AdvStringGrid入门使用
仅仅把数据从数据库中显示到AdvStringGrid中 procedure TForm1.btnQueryClick(Sender: TObject); var i, j: Integer; begi ...
- 【NLP_Stanford课堂】拼写校正
在多种应用比如word中都有拼写检查和校正功能,具体步骤分为: 拼写错误检测 拼写错误校正: 自动校正:hte -> the 建议一个校正 建议多个校正 拼写错误类型: Non-word Err ...