工业控制-串口通讯方法(精)_第1页
工业控制-串口通讯方法(精)_第2页
工业控制-串口通讯方法(精)_第3页
工业控制-串口通讯方法(精)_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

工业控制-串口通讯方法(WINAPI实现)介绍介绍工业控制领域利用串口和外围设备进行通讯。正文前言:总所周之,利用串口进行数据通讯在在通讯通讯领域重占有着重要的地位。利用RS232-RS485进行数据信号的采集和传递是VC编程的又一大热点。串口通讯在通讯软件重有着十分广泛的应用。如电话、传真、视频和各种控制等。在各种开发工具中间,VC由于功能强大和灵活,同时也得到了Microsoft的最大支持,所以在一般进行涉及硬件操作的通讯编程重,大都推荐使用VC作为开发工具。然而工业控制串口通讯这个又不同于一般的串口通讯程序,因为控制外围设备传送的大都是十六进制数据(BYTE类型),所以,为了提高程序的运行稳定性,我们在编写程序进行通讯时可以不考虑传送BYTE类型数据的工作。串口通讯目前流行的方法大概有两种:一是利用Microsoft提供的CMSCOMM控件进行通讯,不过现在很多程序员都觉应该放弃这种方式。二是利用WINAPI函数进行编程,这种编程的难度最高,要求你要掌握很多的API函数。三是利用现在网络上面提供的一些串口通讯控件进行编写,比如CSerial类等。程序实现:我在经过许多的项目的开发和实践中发现,采用WINAPI函数进行串口的开发能够给程序员很大的控件,并且程序运也很稳定。所以我将与串口接触的函数进行封装,然后在各个工程中进行调用,效果还是比较好的,现将各个函数和调用方法列举出来,希望对各位有所帮助。一、设置串口相关工作#defineMAXBLOCK2048#defineXON0x11#defineXOFF0x13BOOLSetCom(HANDLE&m_hCom,constchar*m_sPort,intBaudRate,intDatabit,CStringparity,CStringstopbit{COMMTIMEOUTSTimeOuts;///串口输出时间超时设置DCBdcb;///与端口匹配的设备m_hCom=CreateFile(m_sPort,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL;//以重叠方式打开串口if(m_hCom==INVALID_HANDLE_VALUE{AfxMessageBox("设置串口部分,串口打开失败";///〃重叠方式异步通信(INVALID_HANDLE_VALUE)函数失败。returnFALSE;}SetupComm(m_hCom,MAXBLOCK,MAXBLOCK;//设置缓冲区memset(&TimeOuts,0,sizeof(TimeOuts;TimeOuts.ReadIntervalTimeout=MAXDWORD;//把间隔超时设为最大,把总超时设为0将导致ReadFile立即返回并完成操作TimeOuts.ReadTotalTimeoutMultiplier=0;//读时间系数TimeOuts.ReadTotalTimeoutConstant=0;//读时间常量TimeOuts.WriteTotalTimeoutMultiplier=50;//总超时=时间系数*要求读/写的字符数+时间常量TimeOuts.WriteTotalTimeoutConstant=2000;//设置写超时以指定WriteComm成员函数中的SetCommTimeouts(m_hCom,&TimeOuts;//GetOverlappedResult函数的等待时间*/if(!GetCommState(m_hCom,&dcb////串口打开方式、端口、波特率与端口匹配的设备{AfxMessageBox("GetCommStateFailed";returnFALSE;}dcb.fParity=TRUE;//允许奇偶校验dcb.fBinary=TRUE;if(parity=="NONE"dcb.Parity=NOPARITY;if(parity=="ODD"dcb.Parity=ODDPARITY;if(parity=="EVEN"dcb.Parity=EVENPARITY;if(stopbit=="l"〃设置波特率dcb.StopBits=ONESTOPBIT;〃if(stopbit=="0"〃设置波特率//dcb.StopBits=NONESTOPBIT;if(stopbit=="2"〃设置波特率dcb.StopBits=TWOSTOPBITS;BOOLm_bEcho=FALSE;///intm_nFlowCtrl=0;BOOLm_bNewLine=FALSE;///dcb.BaudRate=BaudRate;//波特率dcb.ByteSize=Databit;//每字节位数//硬件流控制设置dcb.fOutxCtsFlow=m_nFlowCtrl==1;dcb.fRtsControl=m_nFlowCtrl==1?RTS_CONTROL_HANDSHAKE:RTS_CONTROL_ENABLE;//XON/XOFF流控制设置(软件流控制!)dcb.fInX=dcb.fOutX=m_nFlowCtrl==2;dcb.XonChar=XON;dcb.XoffChar=XOFF;dcb.XonLim=50;dcb.XoffLim=50;if(SetCommState(m_hCom,&dcbreturnTRUE;////com的通讯口设置else{AfxMessageBox("串口已打开,设置失败";returnFALSE;}}二、读串口操作:intReadCom(HANDLEhComm,BYTEinbuff[],DWORD&nBytesRead,intReadTime{DWORDlrc;///纵向冗余校验DWORDendtime;/////////jiesuostaticOVERLAPPEDol;intReadNumber=0;intnumCount=0;//控制读取的数目DWORDdwErrorMask,nToRead;COMSTATcomstat;ol.Offset=0;///相对文件开始的字节偏移量ol.OffsetHigh=0;///开始传送数据的字节偏移量的高位字,管道和通信时调用进程可忽略。ol.hEvent=NULL;///标识事件,数据传送完成时设为信号状态ol.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL;endtime=GetTickCount(+ReadTime;//GetTickCount(取回系统开始至此所用的时间(毫秒for(inti=0;i<2000;i++inbuff[i]=0;Sleep(ReadTime;ClearCommError(hComm,&dwErrorMask,&comstat;nToRead=min(2000,comstat.cbInQue;if(int(nToRead<2gotoLoop;if(!ReadFile(hComm,inbuff,nToRead,&nBytesRead,&ol{if((lrc=GetLastError(==ERROR_IO_PENDING{///////////////////endtime=GetTickCount(+ReadTime;//GetTickCount(取回系统开始至此所用的时间(毫秒while(!GetOverlappedResult(hComm,&ol,&nBytesRead,FALSE〃该函数取回重叠操作的结果{if(GetTickCount(>endtimebreak;}}}return1;Loop:return0;}三、写串口命令intWriteCom(HANDLEhComm,BYTEOutbuff[],intsize,intbWrite[]{DWORDnBytesWrite,endtime,lrc;staticOVERLAPPEDol;DWORDdwErrorMask,dwError;COMSTATcomstat;ol.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL;ol.Offset=0;ol.OffsetHigh=0;ol.hEvent=NULL;///标识事件,数据传送完成时,将它设为信号状态ClearCommError(hComm,&dwErrorMask,&comstat;if(!WriteFile(hComm,Outbuff,size,&nBytesWrite,&ol{if((lrc=GetLastError(==ERROR_IO_PENDING{endtime=GetTickCount(+1000;while(!GetOverlappedResult(hComm,&ol,&nBytesWrite,FALSE{dwError=GetLastError(;if(GetTickCount(>endtime{AfxMessageBox("写串口时间过长,目前串口发送缓冲区中的数据数目为空";break;}if(dwError=ERROR_IO_INCOMPLETEcontinue;//未完全读完时的正常返回结果else{//发生错误,尝试恢复!ClearCommError(hComm,&dwError,&comstat;break;}}}}FlushFileBuffers(hComm;PurgeComm(hComm,PURGE_TXCLEAR;bWrite=0;return1;}四、调用方法很简单,只需要将你的串口参数进行简单的设置就可以了。比如:BOOLMain_OpenCom(〃设置COM{intBoundrate=9600;〃波特率CStringStopBits="1";//停止位intDataBits=8;〃数据位CStringParity="ODD";〃奇偶校验CStringm_Port="COM1";returnSetCom(m_hCom1,m_Port,Boundrate,DataBits,Parity,StopBits;}voidMain({intSIZE;DWORDBytestoRead=52*Count+6;〃要11个字节intBWRI

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论