基于ARM9嵌入式微处理器的远程仓库管理系统-张晓东_第1页
基于ARM9嵌入式微处理器的远程仓库管理系统-张晓东_第2页
基于ARM9嵌入式微处理器的远程仓库管理系统-张晓东_第3页
基于ARM9嵌入式微处理器的远程仓库管理系统-张晓东_第4页
基于ARM9嵌入式微处理器的远程仓库管理系统-张晓东_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

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

文档简介

图6.6所示。数据打印需要打印机的支持,本系统的打印模块是基于失眠上的标准串口打印机设计的,理论上可以兼容市面上的任何标准串口打印机。图STYLEREF1\s5.SEQ图\*ARABIC\s112打印预览对话框参考文献张冬泉.WindowsCE实用开发技术[M].北京:电子工业出版社,2007.周立功.ARM&WinCE实验与实践[M].北京:北京航空航天大学出版社,2007.汪兵.EVC高级编程及其应用开发[M].北京:中国水利水电出版社,2007.求是科技.SQLServer2000数据库开发技术与工程实践[M].北京:人民邮电出版社,2004.广州致远电子有限公司.SQLServerMobile数据库编程示例.产品应用笔记.2008广州致远电子有限公司.Web串口远程控制示例.产品应用笔记.2008串口驱动程序代码SerialObject.h文件源代码#defineQUEUE_SIZE51200/*接收队列缓冲区大小*/#defineBUFFER_SIZE1024/*从串口驱动读取数据的接收缓冲区大小*/typedefstruct_SERIALCFG{BYTEbBaudSel;/*波特率序号*/BYTEbDataBitSel;/*数据位序号*/BYTEbStopBitSel;/*停止位序号*/BYTEbParitySel;/*校验类型序号*/}SERIALCFG;/*定义串口配置情况结构体*/classCSerialObject/*定义串口对象类*/{public:SERIALCFGm_SerialCfg;/*用于传出串口已配置情况*/public:DWORDRead(PBYTEpRcvBuffer,DWORDdwToReadLen);BOOLWrite(PBYTEpSndBuffer,DWORDdwLength);voidClose();BOOLIsOpen();BOOLOpen(BYTEbPort,BYTEbBaudRate,BYTEbDataBit,BYTEbStopBit,BYTEbParity);CSerialObject();virtual~CSerialObject();private:staticDWORD__stdcallRecvThread(LPVOIDpParam);HANDLEm_hComm;/*串口流驱动文件句柄*/PBYTEm_pQueueBuf;/*接收队列缓冲区指针*/DWORDm_dwQueueIndexIn;/*接收队列追加数据点序号*/DWORDm_dwQueueIndexOut;/*接收队列取数据点序号*/DCBm_dcb;/*串口设备控制块结构体,包含串口配置信息*/CRITICAL_SECTIONm_csQueue;/*接收队列临界对象*/staticvoidCALLBACKCommRecv(LPVOIDpParam,PBYTEpBuf,DWORDdwLen);};#endif//!defined(AFX_SEIALOBJECT_H__1D103668_E3B1_4DB0_8A73_36DAD26D9C68__INCLUDED_)

SerialObject.cpp文件源代码*****************************************************************************************///SerialObject.cpp:implementationoftheCSerialObjectclass.#include"stdafx.h"#include"SerialObject.h"#defineUBOUND(name,type)(sizeof(name)/sizeof(type))/*用于计算数组元素个数*/constTCHAR*g_szCommPortTbl[]={_T("COM1:"),_T("COM2:"),_T("COM3:"),_T("COM4:")};/*串口文件名表*/constintg_nBaudRateTbl[]={110,300,600,1200,2400,4800,9600,14400,19200,38400,56000,57600,115200};/*串口波特率表*/constintg_nDataBitTbl[]={5,6,7,8};/*串口数据位表*/constintg_nStopBitTbl[]={0,1,2};/*串口停止位表*/constintg_nParityTbl[]={NOPARITY,ODDPARITY,EVENPARITY,MARKPARITY,SPACEPARITY};/*串口校验类型表*//********************************************************************************************Functionname:CSerialObject::CSerialObject()**Descriptions:串口对象类构造函数**Inputparameters:无**Outputparameters:无**Returnedvalue:无******************************************************************************************/CSerialObject::CSerialObject(){m_hComm=INVALID_HANDLE_VALUE;m_pQueueBuf=NULL;m_dwQueueIndexIn=0;m_dwQueueIndexOut=0;memset(&m_SerialCfg,0,sizeof(SERIALCFG));InitializeCriticalSection(&m_csQueue);}/********************************************************************************************Functionname:CSerialObject::CSerialObject()**Descriptions:串口对象类析构函数**Inputparameters:无**Outputparameters:无**Returnedvalue:无******************************************************************************************/CSerialObject::~CSerialObject(){Close();DeleteCriticalSection(&m_csQueue);}/********************************************************************************************Functionname:CSerialObject::Open()**Descriptions:打开串口**Inputparameters:bPort:串口序号**bBaudRate:波特率序号**bDataBit:数据位序号**bStopBit:停止位序号**bParity:校验类型序号**Outputparameters:无**Returnedvalue:TRUE:成功FALSE:失败******************************************************************************************/BOOLCSerialObject::Open(BYTEbPort,BYTEbBaudRate,BYTEbDataBit,BYTEbStopBit,BYTEbParity){BOOLbRet=TRUE;COMMTIMEOUTSctoTimeOut;if(IsOpen())returnFALSE;/*判断是否已打开了*/if(bPort>=UBOUND(g_szCommPortTbl,constTCHAR*)||bBaudRate>=UBOUND(g_nBaudRateTbl,constint)||bDataBit>=UBOUND(g_nDataBitTbl,constint)||bStopBit>=UBOUND(g_nStopBitTbl,constint)||bParity>=UBOUND(g_nParityTbl,constint)){/*判断传入参数是否有越界*/returnFALSE;}m_hComm=CreateFile(g_szCommPortTbl[bPort],GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);if(m_hComm==INVALID_HANDLE_VALUE)returnFALSE;GetCommState(m_hComm,&m_dcb);/*读取串口的DCB*/m_dcb.BaudRate=g_nBaudRateTbl[bBaudRate];/*波特率设置*/m_dcb.ByteSize=g_nDataBitTbl[bDataBit];/*数据位设置*/m_dcb.StopBits=g_nStopBitTbl[bStopBit];/*停止位设置*/m_dcb.Parity=g_nParityTbl[bParity];/*奇偶校验设置*/m_dcb.fParity=(m_dcb.Parity!=NOPARITY);m_dcb.fBinary=TRUE;m_dcb.fOutX=FALSE;/*禁止软件流控制。fOutX:收到Xoff后停止发送*/m_dcb.fInX=FALSE;/*禁止软件流控制。fInX:缓冲区接收满后发送Xoff*/m_dcb.fTXContinueOnXoff=FALSE;/*禁止软件流控制。fInX事件之后,发送是否继续运行*//**设置状态参数*//*串口事件:接收到一个字符*/SetupComm(m_hComm,16384,16384);/*设置接收与发送的缓冲区大小*/if(!SetCommState(m_hComm,&m_dcb)){/*设置串口的DCB*/CloseHandle(m_hComm);m_hComm=INVALID_HANDLE_VALUE;returnFALSE;}PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);GetCommTimeouts(m_hComm,&ctoTimeOut);ctoTimeOut.ReadIntervalTimeout=10;/*接收字符间最大时间间隔*/ctoTimeOut.ReadTotalTimeoutMultiplier=1;ctoTimeOut.ReadTotalTimeoutConstant=10;/*读数据总超时常量*/SetCommTimeouts(m_hComm,&ctoTimeOut);EnterCriticalSection(&m_csQueue);if(!m_pQueueBuf){/*未申请除列缓冲区则进行申请*/bRet=((m_pQueueBuf=newBYTE[QUEUE_SIZE])!=0);}LeaveCriticalSection(&m_csQueue);if(bRet){DWORDdwId;HANDLEhThread=CreateThread(NULL,0,RecvThread,this,0,&dwId);/*创建接收线程*/CloseHandle(hThread);m_SerialCfg.bBaudSel=bBaudRate;m_SerialCfg.bDataBitSel=bDataBit;m_SerialCfg.bStopBitSel=bStopBit;m_SerialCfg.bParitySel=bParity;}else{CloseHandle(m_hComm);m_hComm=INVALID_HANDLE_VALUE;}returnbRet;}/********************************************************************************************Functionname:CSerialObject::IsOpen()**Descriptions:判断串口是否已经打开**Inputparameters:无**Outputparameters无**Returnedvalue:TRUE:是FALSE:否******************************************************************************************/BOOLCSerialObject::IsOpen(){return(m_hComm!=INVALID_HANDLE_VALUE);}/********************************************************************************************Functionname:CSerialObject::Close()**Descriptions:关闭串口**Inputparameters:无**Outputparameters:无**Returnedvalue:无******************************************************************************************/voidCSerialObject::Close(){if(IsOpen()){SetCommMask(m_hComm,0);PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);CloseHandle(m_hComm);m_hComm=INVALID_HANDLE_VALUE;}EnterCriticalSection(&m_csQueue);if(m_pQueueBuf){delete[]m_pQueueBuf;/*释放申请的接收队列缓冲区*/m_pQueueBuf=NULL;}LeaveCriticalSection(&m_csQueue);}/********************************************************************************************Functionname:CSerialObject::Write()**Descriptions:发送数据**Inputparameters:pSndBuffer:发送数据缓冲区**dwLength:要发送数据长度**Outputparameters:无**Returnedvalue:TRUE:成功FALSE:失败******************************************************************************************/BOOLCSerialObject::Write(PBYTEpSndBuffer,DWORDdwLength){DWORDdwActLen;COMSTATcomstatTest;DWORDdwErrorFlags;if(!IsOpen()||(pSndBuffer==NULL)||(dwLength<1))returnFALSE;ClearCommError(m_hComm,&dwErrorFlags,&comstatTest);WriteFile(m_hComm,pSndBuffer,dwLength,&dwActLen,NULL);returnTRUE;}/********************************************************************************************Functionname:CSerialObject::Read()**Descriptions:从接收队列读取数据**Inputparameters:dwToReadLen:要读取数据长度**Outputparameters:pRcvBuffer:接收缓冲区,将向接收缓冲区写入接收到的数据**Returnedvalue:实际读取的数据字节数******************************************************************************************/DWORDCSerialObject::Read(PBYTEpRcvBuffer,DWORDdwToReadLen){DWORDdwIndex=0;PBYTEpQueueBuf=0;DWORDdwQueueDataSize=0;EnterCriticalSection(&m_csQueue);dwIndex=m_dwQueueIndexOut;pQueueBuf=m_pQueueBuf+dwIndex;dwQueueDataSize=m_dwQueueIndexIn>=m_dwQueueIndexOut?m_dwQueueIndexIn-m_dwQueueIndexOut:m_dwQueueIndexIn+QUEUE_SIZE-m_dwQueueIndexOut;dwToReadLen=dwToReadLen<dwQueueDataSize?dwToReadLen:dwQueueDataSize;for(DWORDi=0;i<dwToReadLen;i++){/*从循环队列读取数据*/*pRcvBuffer++=*pQueueBuf++;dwIndex++;if(dwIndex>=QUEUE_SIZE){dwIndex=0;pQueueBuf=m_pQueueBuf;}}m_dwQueueIndexOut=dwIndex;LeaveCriticalSection(&m_csQueue);returndwToReadLen;}/********************************************************************************************Functionname:CSerialObject::CommRecv()**Descriptions:接收数据回调函数**Inputparameters:pParam:线程传入参数**pBuf:接收缓冲区指针**dwLen:接收数据长度**Outputparameters:无**Returnedvalue:实际读取的数据字节数******************************************************************************************/voidCSerialObject::CommRecv(LPVOIDpParam,PBYTEpBuf,DWORDdwLen){CSerialObject*pObj=(CSerialObject*)pParam;DWORDdwQueueFree=0;if(pObj->m_pQueueBuf){EnterCriticalSection(&pObj->m_csQueue);dwQueueFree=pObj->m_dwQueueIndexIn>=pObj->m_dwQueueIndexOut?pObj->m_dwQueueIndexOut+QUEUE_SIZE-pObj->m_dwQueueIndexIn:pObj->m_dwQueueIndexOut-pObj->m_dwQueueIndexIn;if(dwQueueFree>1){/*循环队列最后一个空位不能使用*/dwLen=(dwLen<dwQueueFree-1)?dwLen:(dwQueueFree-1);/*能够容纳的数据长度*/DWORDdwIndex=pObj->m_dwQueueIndexIn;PBYTEpQueueBuf=pObj->m_pQueueBuf+dwIndex;for(DWORDi=0;i<dwLen;i++){/*将接收的数据填入循环队列中*/*pQueueBuf++=*pBuf++;dwIndex++;if(dwIndex>=QUEUE_SIZE){dwIndex=0;pQueueBuf=pObj->m_pQueueBuf;}}pObj->m_dwQueueIndexIn=dwIndex;}LeaveCriticalSection(&pObj->m_csQueue);}}/*********************

温馨提示

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

评论

0/150

提交评论