基于VC++的串口通信服务的开发(5)

2019-03-22 10:05

无线传感网络课程论文

初始化还有串口是该串口是否可用否下一串口是入队列否结束 图 4初始化工作流程

相关代码:

for(i=1;i<=ComCount;i++) { }

sprintf(buf,\

if (com.EPortAvailable==com.CheckPort(buf))

ComQueue.Push(i); //串口入队列

服务工作线程ServiceThread由Run函数实现:

ServiceThread由函数ServerMain打开,开始完成实际服务任务的工作线程,该线程执行服务的具体任务。该函数绑定服务器地址后监听本地端口等待客户端的连接,当客户端连接上后,创建子线程,由子线程来处理这个连接,函数继续监听本地端口。子线程处理完链接后关闭链接套接字退出。

图 5 服务工作线程流程

相关代码:

sockaddr_in service;

16

无线传感网络课程论文

service.sin_family=AF_INET;

service.sin_addr.s_addr=INADDR_ANY; //ip地址 service.sin_port=htons(2501); //端口号

bind(m_socket,(SOCKADDR*)&service,sizeof(service)); listen(m_socket,20); //监听连接

while (m_bIsRunning) { //直到服务停止运行

AcceptSocket=SOCKET_ERROR; while(AcceptSocket==SOCKET_ERROR) { }

AcceptSocket=accept(m_socket,NULL,NULL);//接收连接

//创建子线程处理该连接

CreateThread(NULL,NULL,AnswerThread,(LPVOID)AcceptSocket,0,&TId); }

服务子线程:

由类的静态成员函数作为线程函数。在线程中,首先判断服务器是否还有剩余串口可分配,也就是判断串口队列中是否为空。若为空,则提示用户服务器串口已使用完毕,请稍后在试,断开同客户端的连接。否则串口队列出队列一个串口,分配给该客户使用,接下来就是打开串口,配置串口参数,开启串口监听线程,等待客户端发送的数据。直到客户端断开连接,串口重新进入队列,等待下次的分配。服务子线程退出。

串口队列为空是提示信息开启监听线程否串口出队列打开串口配置串口参数退出串口入队列关闭串口是链接断开否接收客户端发送数局从串口发送除去

图 6 服务子线程工作流程

相关代码:

17

无线传感网络课程论文

{ }

if(!ComQueue.IsEmpty()) //判断队列是否为空 { } Else

//发送提示信息到客户端

send(ClientSocket,szBuffer,strlen(szBuffer),0); closesocket(ClientSocket);//断开连接

com=ComQueue.Pop(); //出队列 sprintf(buf,\//打开串口配置默认通信参数

Serial.Open(buf,ClientSocket,1024,1024); Serial.StartListener(); //开启监听线程 while(bytesRecv) //连接是否断开 { }

Serial.StopListener(); //停止监听子线程 Serial.Close(); //关闭串口 ComQueue.Push(com); //串口入队列

while(bytesRecv==SOCKET_ERROR) {

//接受客户端的数据

bytesRecv=recv(ClientSocket,recvbuf,1024,0); }

Serial.Write(recvbuf,&Len); //写串口

服务的安装

要使用服务,首先应进行安装。安装过程使SCM知道有这项服务存在,让SCM把它添加到服务列表中。通过调用函数OpenSCManager,打开一个到服务控制管理器的连接。然后调用函数CreateService在SCM数据库中安装服务。函数CreateService的调用中使用了打开SCM的指针,服务名,识别符以及一族填充其他值的基本参数。服务名是指在scm内部使用的服务的名字,删除服务时指定改名字可删除该服务,识别符是指在“控制面板”的“服务”中表示服务项的识别符。最后关闭服务控制管理器的连接。

18

无线传感网络课程论文

打开SCM的连接CreateService创建服务关闭SCM的连接 图 7 服务安装流程

服务的卸载

卸载服务时,同样需要先打开一个到服务控制管理器的连接。然后查询该服务当前是否是被停止,若还未停止,则调用函数ControlService尝试停止该服务。这样做有利于卸载服务项:如果服务在删除过程中继续运行,则“控制面板”中”服务“将保留与服务的连接,实际上服务可以继续运行;当有人试图停止该“孤儿”服务时,“服务”可能就会抗议。先停止服务再删除它,就可以避免该问题。服务停止后,调用函数DeleteService删除该服务。

打开SCM连接服务是否停止是否删除服务关闭服务 图 8 服务卸载流程

4.3 串口通信

串行口在Win 32中是作为文件来进行处理的,而不是直接对端口进行操作。在Win32环境下,可以把串口看作由文件系统访问的设备。使用标准的CreateFile()函数打开端口,再使用ReadFile()和WriteFile()函数读写数据,就如同端口只是一个文件对象一样。对于串行通信,Win 32提供了相应的文件I/O函数与通信函数,使用这些函数,可以编制出符合不同需要的通信程序。

通常实现串行通信的步骤如下:

1.按协议的设置初始化并打开串行口,这样做就是通知Windows本应用程序需要这个串口,并封锁其他应用程序使它们不能使用此串口。

2.配置这个串行口。

3.在串口上往返地传输数据,并在传输过程中进行校验

4.不需要此串口时,关闭串口,即释放串口以供其它应用程序使用。 在这四个步骤中,主要的程序代码集中在第3步。

打开串口配置串口传输数据关闭串口

图 9 串口通信流程

19

无线传感网络课程论文

串口通信直接使用Windows API函数封装成类。应用API函数进行串口编程时,步骤如下:

1.打开串口:CreateFile函数。

2.建立串口通信事件:CreateEvent函数。

3.初始化串口,设置串口参数:SetCommState函数。

4.建立读数据的线程:建立线程简单程序中并非需要,需要用到的函数较多,如ReadFile。

5.写数据:用WriteFile函数。

6.结束时关闭串口:若程序中打开了其他线程,则先终止线程。停止WaiteCommEvent的等待以及关闭串口CloseHandle,平时程序会停留在WaiteCommEvent的等待中,当要终止线程的时候,程序必须 从WaitCommEvent中退出来,然后用CloseHandle关闭串口。

相关代码如下: 串口的打开:

// Open COM port

m_hFile = ::CreateFile(lpszDevice,

GENERIC_READ|GENERIC_WRITE, 0, 0,

OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);

串口的关闭: // Close COM port ::CloseHandle(m_hFile);

GetCommState(m_hFile,&dcb);//获得串口当前参数 dcb.BaudRate = DWORD(eBaudrate); //重新配置串口参数 dcb.ByteSize = BYTE(eDataBits); dcb.Parity = BYTE(eParity); dcb.StopBits = BYTE(eStopBits); dcb.fParity = (eParity != EParNone);

SetCommState(m_hFile,&dcb);//设置新的串口参数

设置串口参数:

读写串口:

20


基于VC++的串口通信服务的开发(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:铅锌矿床成矿理论和找矿方法

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: