dedecms织梦内容管理系统      
首页 | 51单片机 | 休闲娱乐 | 手工乐园 | 免费软件 | 理财专区 | 串口通信 | UNIX/LINUX | TurboC | 专题 | 会员中心 | 支持论坛
  当前位置:主页>串口通信 >文档内容
一个实用的串口类(一)[串口通信 初入]
来源: 作者: 发布时间:2007-07-04  
你会看到这个提示,那是因为你的系统无法识别某栏目的模型信息,或者你新建模型后,没为这个模型设计单独的模板。不同模型的文档浏览页的模板为:article_模型名字标识.htm 如“article_article.htm”,更多的信息你可以在频道模型管理的地方查看。
body  

这是一个通过计算机串口发送和接收数据的类,是一个不成熟的类,现在我没有再使用它了,但它却把串口的API操作全用到了,如果你对这很熟了,我想你可以不用再花时间了看了,代码编写和你心中想的一样“rubbsh”,因为这段代码还完成了其它功能,不是一个单独的模块。
    其实,这样一段代码,早想把它DELETE掉,但又舍不得,它必竟是一个回忆...


//**********************************************************************************//
/**
                                                                   
 File Name(文件名):   SaimIO.h: interface for the CSaimIO class.
      Author(作者):   Wenjin Hu   胡文晋 (eg. Saimen Hu)  
     Version(版本):   1.0
    Date(完成日期):   2000.10.10
 Description(介绍):   用于 COM 口的读写类,完成对COM 口的选取,COM口的初始化。
                  对COM口的读写操作。

 

       typedef struct tagIOINFO
       {
        HANDLE        idComDev;
        BYTE          bPort;
        BOOL          fConnected,fXonXoff;
        BYTE          bByteSize,bFlowCtrl,bParity,bStopBits;
        DWORD         dwBaudRate;
        OVERLAPPED    osWrite,osRead;
       }IOINFO;                  

                            配置串口通信的数据结构

                         HANDLE       idComDev          为串口句柄
       BYTE         bPort             为串口号
       BOOL         fConnected        为是否连接
       BYTE         bByteSize         为字节数
       BYTE         bFlowCtrl         流量控制
       BYTE         bParity           校检类型
       BYTE         bStopBits         停止位
                         DWORD        dwBaudRate        波特率
                         OVERLAPPED   osWrite,osRead    读写事件及时限
                                                                                   **/
//***********************************************************************************//

// Flow control flags  流量控制类型
//

#define FC_DTRDSR       0x01
#define FC_RTSCTS       0x02
#define FC_XONXOFF      0x04

// ascii definitions  流量控制字符
//
#define ASCII_XON       0x11
#define ASCII_XOFF      0x13


typedef struct tagIOINFO
{
 HANDLE        idComDev;
 BYTE          bPort;
 BOOL          fConnected,fXonXoff;
 BYTE          bByteSize,bFlowCtrl,bParity,bStopBits;
 DWORD         dwBaudRate;
 OVERLAPPED    osWrite,osRead;
}IOINFO;

//////////////////////////////////////////////////////////////////////

#if !defined(AFX_SAIMIO_H__A2648CC2_9DBF_11D4_96BD_E54AFA740DAA__INCLUDED_)
#define AFX_SAIMIO_H__A2648CC2_9DBF_11D4_96BD_E54AFA740DAA__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#define MSG_NEW_IODATA WM_USER+100

class CSaimIO : public CFile 
{
public:
 CSaimIO();
 virtual ~CSaimIO();
public:
 void ResumeThread();
 void SuspandThread();
 BOOL ConnectCom(LPTSTR initStr);
 BOOL EndListern();
 BOOL BeginListen();
 void ClearIObuffer();
 CString HexToStr(unsigned char *lpDataBuffer,int Total);
 void StrToHex(unsigned char *lpBuffer,int *Total);
 void InitaiseIO();
 void SetIO(IOINFO SetIoInfo);
 BOOL DisConnect();
 DWORD GetData(unsigned char *DataBuffer,DWORD DataLength);
 BOOL SendData(unsigned char *lpCommand,DWORD CmdLength);
 BOOL Connect();


 IOINFO      IoInfoData;

protected:

 // 监听线程数据
private:
 BOOL         ThreadIsRun();
 HANDLE       hListenThread;
 DWORD        dwThreadID;
//    DWORD WINAPI ListenThread(LPVOID lpParameter);
};

//  监听线程
DWORD WINAPI ListenThread(LPVOID lpParameter);


#endif // !defined(AFX_SAIMIO_H__A2648CC2_9DBF_11D4_96BD_E54AFA740DAA__INCLUDED_)

 //**********************************************************************************//
/**
                                                                   
 File Name(文件名):   SaimIO.cpp: implementation of the CSaimIO class.
      Author(作者):   Wenjin Hu   胡文晋 (eg. Saimen Hu)  
     Version(版本):   1.0
    Date(完成日期):   2000.10.10
 Description(介绍):   用于 COM 口的读写类,完成对COM 口的选取,COM口的初始化。
                  对COM口的读写操作。

  Other(其它备注):    完成对串口的读写有两种情况:1.计算机之间通信
                                                  2.计算机和其它设备通信
    对于这两种情况要注意在初始化COM的DCB结构时,成员不同的值对通信产后不
    同的效果,也许是非常严重的。例下面:

    如果把下面两个成员的值赋为以下情况

                dcb.fDtrControl = DTR_CONTROL_ENABLE ;

                dcb.fRtsControl = RTS_CONTROL_ENABLE ;

    此时不能完成计算机和其它设备之间通信。

    改为以下值就可以完成和其它设备能信。

                dcb.fDtrControl = DTR_CONTROL_DISABLE ;
    
                dcb.fRtsControl = RTS_CONTROL_ENABLE ;


Funtion List(主要函数):
             1.     void InitaiseIO()
                用来对串口IOINFO 数据结构初始化为默认值
             2.     void SetIO(IOINFO SetIoInfo)
                调用该函数用来修改IOINFO数据结构,配置串口
            说明:该函数在 CONNECT 之前调用。
    3.     BOOL Connect()   
                用来连接串口,使用IOINFO中的数据结构,如果成功返回 TRUE;
            不成功返回 FALSE;
    4.     BOOL DisConnect()
                关闭对串口的连接,成功返回: TRUE 否则返回:FALSE
    5.     BOOL SendData(unsigned char *lpCommand,DWORD CmdLength)
                向串口发送数据,数据长度为 CmdLength,lpCommand 为指向该命令的指针。
    6.     BOOL GetData(unsigned char *Databuffer,int DataLength)
                读取串口缓冲中的数据。
                         

    History(修改记录):
             1.Date:           2000.10.11
               Author:         胡文晋 (EG. Saim Hu)
               Modification: 
      添加函数:   CString CSaimIO::HexToStr(unsigned char *lpDataBuffer)    
      功    能:   将入口参数unsigned char * DataBuffer 转换为CString 字符串


             2.Date:           2000.11.10
      Author:         胡文晋 (EG. Saim Hu)
      Modifcation:

                                                                                **/
//*******************************************************************************//
///////////////////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "SaimIO.h"


#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

extern BOOL  KillListenThread ;

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CSaimIO::CSaimIO()
{
    InitaiseIO();
 hListenThread = NULL;
}

CSaimIO::~CSaimIO()
{

}
// 以默认方式初始化串口
void CSaimIO::InitaiseIO()
{
 IoInfoData.idComDev = 0 ;
 IoInfoData.bByteSize = 8 ;
 IoInfoData.fConnected = FALSE;
 IoInfoData.bPort = 1 ;
 IoInfoData.dwBaudRate  = CBR_4800;
 IoInfoData.bFlowCtrl = FALSE; //FC_XONXOFF; //  FC_RTSCTS; //FC_XONXOFF;
 IoInfoData.bParity = EVENPARITY ; //MARKPARITY ; SPACEPARITY; ODDPARITY;
 IoInfoData.bStopBits = ONESTOPBIT;  //ONE5STOPBITS; TWOSTOPBITS
 IoInfoData.osWrite.Offset = 0;
 IoInfoData.osWrite.OffsetHigh = 1024;
 IoInfoData.osRead.Offset = 0;
 IoInfoData.osRead.OffsetHigh = 1024;
 IoInfoData.osRead.hEvent = NULL;
 IoInfoData.osWrite.hEvent = NULL;
}

//  修改串口数据结构
void CSaimIO::SetIO(IOINFO SetIoInfo)
{
 IoInfoData.idComDev = SetIoInfo.idComDev ;
 IoInfoData.bByteSize = SetIoInfo.bByteSize ;
 IoInfoData.fConnected = SetIoInfo.fConnected;
 IoInfoData.bPort = SetIoInfo.bPort ;
 IoInfoData.dwBaudRate  = SetIoInfo.dwBaudRate;
 IoInfoData.bFlowCtrl = SetIoInfo.bFlowCtrl;
 IoInfoData.bParity = SetIoInfo.bParity;
 IoInfoData.bStopBits = SetIoInfo.bStopBits;
 IoInfoData.osWrite.Offset = SetIoInfo.osWrite.Offset;
 IoInfoData.osWrite.OffsetHigh = SetIoInfo.osWrite.OffsetHigh;
 IoInfoData.osRead.Offset = SetIoInfo.osRead.Offset;
 IoInfoData.osRead.OffsetHigh = SetIoInfo.osRead.OffsetHigh;
}

//  Connect IO before use it.
//  打开串开
BOOL CSaimIO::Connect()
{
   BOOL       fRetVal ;
   BYTE       bSet ;
   DCB        dcb ;
   char       szPort[10];

   memset(szPort,0,10);

   wsprintf(szPort,"COM%d:",IoInfoData.bPort);


   IoInfoData.idComDev = CreateFile(szPort,GENERIC_READ|GENERIC_WRITE,
                                 0,
                     NULL,
                     OPEN_EXISTING,
                     FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
                     NULL);

   if( !IoInfoData.idComDev )
      return FALSE;

   if(!SetCommMask(IoInfoData.idComDev,EV_RXFLAG)) // EV_RXCHAR))
   return FALSE;

   // Alloc the buffer for Read and Write.
   if( SetupComm(IoInfoData.idComDev,4096,4096) == 0 )
      return FALSE;


   //Setup for overlapped I/O
   COMMTIMEOUTS CommTimesOuts;

   CommTimesOuts.ReadIntervalTimeout = 100;
   CommTimesOuts.ReadTotalTimeoutMultiplier = 20;
   CommTimesOuts.ReadTotalTimeoutConstant = 1000 ;

   CommTimesOuts.WriteTotalTimeoutMultiplier = 2*CBR_9600 / IoInfoData.dwBaudRate ;
   CommTimesOuts.WriteTotalTimeoutConstant = 1000;

   SetCommTimeouts(IoInfoData.idComDev,&CommTimesOuts);


   // Initise the com port.
   dcb.DCBlength = sizeof( DCB ) ;

   GetCommState( IoInfoData.idComDev, &dcb ) ;

   dcb.BaudRate = IoInfoData.dwBaudRate ;
   dcb.ByteSize = IoInfoData.bByteSize ;
   dcb.Parity = IoInfoData.bParity ;
   dcb.StopBits = IoInfoData.bStopBits ;

   // setup hardware flow control

   bSet = (BYTE) ((FC_RTSCTS & FC_DTRDSR) != 0) ;
   dcb.fOutxDsrFlow = bSet ;

   dcb.fDtrControl = DTR_CONTROL_DISABLE ;   //给予提供电源 , 新的 485 就不需要提供
   dcb.fRtsControl = RTS_CONTROL_ENABLE ;

   bSet = (BYTE) FC_RTSCTS ;
 dcb.fOutxCtsFlow = bSet ;


   // setup software flow control

   bSet = (BYTE)  FC_XONXOFF ;

   dcb.fInX = dcb.fOutX = bSet ;
   dcb.XonChar = ASCII_XON ;
   dcb.XoffChar = ASCII_XOFF ;
   dcb.XonLim = 100 ;
   dcb.XoffLim = 100 ;

   // other various settings

   dcb.fBinary = TRUE ;
   dcb.fParity = 1 ;  // Enalble Parity

   fRetVal = SetCommState( IoInfoData.idComDev, &dcb ) ;

   if( fRetVal != FALSE )
    IoInfoData.fConnected = TRUE;
   else
    return fRetVal;

   //Ceate I/O event used for overlapped reads / writes
   IoInfoData.osRead.hEvent = CreateEvent( NULL ,   //no security
                                        TRUE ,   //explicit reset req
             FALSE ,  //initial event reset
             NULL);   //no name

   if( IoInfoData.osRead.hEvent == NULL )
   {
    return FALSE;
   }

   IoInfoData.osWrite.hEvent = CreateEvent( NULL ,   //no security
                                         TRUE ,   //explicit reset req
              FALSE ,  //initial event reset
              NULL);   //no name
  
   if( IoInfoData.osWrite.hEvent == NULL )
   {
    CloseHandle( IoInfoData.osRead.hEvent );
    return FALSE;
   }

   // Clear Read and Send IO buffer

   if(PurgeComm(IoInfoData.idComDev,PURGE_RXCLEAR)== 0)
   return FALSE;
   if(PurgeComm(IoInfoData.idComDev,PURGE_TXCLEAR)== 0)
   return FALSE;

   // Set The DataSet is ready TO Get Data
   EscapeCommFunction(IoInfoData.idComDev,SETDTR|SETRTS);

   // set connected flag to TRUE

   IoInfoData.fConnected = TRUE ;

   return ( TRUE ) ;
}

//  Close IO when exit the program.
//  关闭串口
BOOL CSaimIO::DisConnect()
{
   if(IoInfoData.fConnected == FALSE )
     return TRUE;

   // Stop the Listen Thread
   EndListern();

   // set connected flag to FALSE
   IoInfoData.fConnected = FALSE ;

   // disable event notification and wait for thread
   // to halt
   SetCommMask( IoInfoData.idComDev , 0 ) ;

   // drop DTR
   EscapeCommFunction( IoInfoData.idComDev, CLRDTR | CLRRTS) ;

   // purge any outstanding reads/writes and close device handle
   if(PurgeComm( IoInfoData.idComDev, PURGE_TXABORT | PURGE_RXABORT |
                                   PURGE_TXCLEAR | PURGE_RXCLEAR )
           == 0 )
   return TRUE;
  
   CloseHandle(IoInfoData.osRead.hEvent);
   CloseHandle(IoInfoData.osWrite.hEvent);
   return CloseHandle( IoInfoData.idComDev ) ;

}

 

还可以到我的BLOG查看  http://blog.csdn.net/Saimen/archive/2001/10/03/10626.aspx

 


[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论:
  热点文档
·负数补码计算方法
·一个实用的串口类(二)[串口通信
  相关文档
·一个实用的串口类(二)[串口通信
·负数补码计算方法
  推荐文档
·负数补码计算方法

 Powered by 温柔老胡 System by www.dedecms.com