1:串口通讯几种方法?
2:我怎样实现?比较简单的

解决方案 »

  1.   

    一般有三种:
    1.MSCOMM 这时Ms的控件,比较容易,但不是很灵活,需要注册!
    2.API的CreateFile,readFile,WriteFile 比较灵活,难度中等!
    3.C+汇编这个一般使用高级用户,难度较大。给你我的一个项目的API:
    // TSerial.cpp: implementation of the TSerial class.
    //
    //////////////////////////////////////////////////////////////////////#include "stdafx.h"
    #include "ECS.h"
    #include "TSerial.h"#ifdef _DEBUG
    #undef THIS_FILE
    static char THIS_FILE[]=__FILE__;
    #define new DEBUG_NEW
    #endif//////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////
    TSerial::TSerial()
    {
        m_bOpened=false;
    }TSerial::~TSerial()
    {}
    bool TSerial::Open(int nPort,int nBand,int nByteSize)
    {
    if(m_bOpened)
        return true;
    char szPort[15];
    CString Er;
    DCB dcb;
    wsprintf(szPort,"COM%d",nPort);
    m_hCommDev=CreateFile(szPort,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL);
    if(m_hCommDev==NULL)
    return false;
    memset(&m_OverlappedRead,0,sizeof(OVERLAPPED));
    memset(&m_OverlappedWrite,0,sizeof(OVERLAPPED));
    COMMTIMEOUTS CommTimeOuts;
    CommTimeOuts.ReadIntervalTimeout=0xFFFFFFFF;
        CommTimeOuts.ReadTotalTimeoutMultiplier=0;
    CommTimeOuts.ReadTotalTimeoutConstant=0;
    CommTimeOuts.WriteTotalTimeoutConstant=1000;
    CommTimeOuts.WriteTotalTimeoutMultiplier=0;
    SetCommTimeouts(m_hCommDev,&CommTimeOuts); m_OverlappedRead.hEvent=CreateEvent(NULL,true,false,NULL);
    m_OverlappedWrite.hEvent=CreateEvent(NULL,true,false,NULL); dcb.DCBlength=sizeof(DCB);
    GetCommState(m_hCommDev,&dcb);
    dcb.BaudRate=nBand;
    dcb.ByteSize=nByteSize;
    if(!SetCommState(m_hCommDev,&dcb)||!SetupComm(m_hCommDev,10000,10000)||m_OverlappedRead.hEvent==NULL||m_OverlappedWrite.hEvent==NULL)
    {
            DWORD dwError=GetLastError();
    if(m_OverlappedRead.hEvent!=NULL) CloseHandle(m_OverlappedRead.hEvent);
    if(m_OverlappedWrite.hEvent!=NULL) CloseHandle(m_OverlappedWrite.hEvent);
    CloseHandle(m_hCommDev);
    Er.Format("%d",dwError);
            MessageBox(NULL,Er,"提示",MB_OK);
    return false;
    }
    m_bOpened=true;
    return m_bOpened;
    }
    DWORD TSerial::ReadData(void *buffer,DWORD dwBytesRead)
    {
        if(!m_bOpened||m_hCommDev==NULL) return 0;
    BOOL bReadStat;
    DWORD dwErrorFlags;
    COMSTAT ComStat; ClearCommError(m_hCommDev,&dwErrorFlags,&ComStat);
    if(!ComStat.cbInQue) return 0;
    dwBytesRead=min(dwBytesRead,(DWORD)ComStat.cbInQue);
    bReadStat=ReadFile(m_hCommDev,buffer,dwBytesRead,&dwBytesRead,&m_OverlappedRead);
    if(!bReadStat)
    {
    if(GetLastError()==ERROR_IO_PENDING)
    {
    WaitForSingleObject(m_OverlappedRead.hEvent,2000);
    return dwBytesRead;
    }
    return 0;
    }
    return dwBytesRead;
    }
    DWORD TSerial::SendData(const char *buffer,DWORD dwBytesWritten)
    {
       if(!m_bOpened||m_hCommDev==NULL)
       return 0;
       BOOL bWriteStat;
       bWriteStat=WriteFile(m_hCommDev,buffer,dwBytesWritten,&dwBytesWritten,&m_OverlappedWrite);
       if(!bWriteStat)
       {
       if(GetLastError()==ERROR_IO_PENDING)
       {
                    WaitForSingleObject(m_OverlappedWrite.hEvent,1000);
                    return dwBytesWritten;
       }
        return 0;
       }
      return dwBytesWritten;}
    int TSerial::InBufferCount()
    {
    if(!m_bOpened||m_hCommDev==NULL)
    return 0;
    DWORD dwErrorFlags;
    COMSTAT ComStat;
    ClearCommError(m_hCommDev,&dwErrorFlags,&ComStat);
    return (int)ComStat.cbInQue;
    }
     /*
        char buffer[1000]={""};               //一定要让他初始化!!!!!
        UpdateData(true);
    for(int i=0;i<m_Send.GetLength();i++)
    buffer[i]=m_Send[i];
    if(MyCom.Open(1,9600))
    MyCom.SendData(buffer,m_Send.GetLength());
    if(MyCom2.Open(2,9600))
    {
    MyCom2.ReadData(buffer,m_Send.GetLength());
    m_Rec=CString(buffer);
    UpdateData(false);
    }   */void TSerial::Conv17_26(char T[17],int Number,char Result[26])
    {
                            //T[17]是头子,既是data[] 以前的数据,
                            //Number 是填写的数据,对于D0003 就是通道数,对于D0001就是采集数,
                            //对于M0000,则是置1还是复0                        //Result 是最后结果。
       int p=0;
       char D[3]={""};
       char data[4]={""};
    /*   if(Number<10)
       {
        data[0]='\x30';
        data[1]='\x30'+Number;
       }
       else
       {
         if(Number<16)
         {
           data[0]='\x30';
           data[1]='\x40'+Number-9;
         }
         else
         {
          data[0]='\x31';
          data[1]='\x30'+Number-16;
         }
       }
    */
       if(Number<10)
       {
        data[0]='\x30';
        data[1]='\x30'+Number;
       }
       else
       {
         if(Number<16)
         {
           data[0]='\x30';
           data[1]='\x40'+Number-9;
         }
         else if(Number<26)
         {
          data[0]='\x31';
          data[1]='\x30'+Number-16;
         }
         else if(Number<32)
         {
          data[0]='\x31';
          data[1]='\x40'+Number-25;
         }
         else if(Number<42)
         {
           data[0]='\x32';
           data[1]='\x30'+Number-32;
         }
         else if(Number<48)
         {
           data[0]='\x32';
           data[1]='\x40'+Number-41;
         }
         else if(Number<58)
         {
           data[0]='\x33';
           data[1]='\x30'+Number-48;
         }
         else if(Number<64)
         {
           data[0]='\x33';
           data[1]='\x40'+Number-57;
         }
         else if(Number<74)
         {
           data[0]='\x34';
           data[1]='\x30'+Number-64;
         }
         else if(Number<80)
         {
           data[0]='\x34';
           data[1]='\x40'+Number-73;
         }
         else if(Number<90)
         {
           data[0]='\x35';
           data[1]='\x30'+Number-80;
         }
         else //if(Number<96)
         {
           data[0]='\x35';
           data[1]='\x40'+Number-89;
         }
       }
       Result[0]=T[0];
       for(int i=1;i<17;i++)
       {
        Result[i]=T[i];
        p+=T[i];
       }   p+=data[0];
       p+=data[1];
       sprintf(D,"%x",p);
       p=CharToInt(D[1]);
       p>9?data[2]=('\x40'+p-9):data[2]=('\x30'+p);   p=CharToInt(D[2]);
       p>9?data[3]=('\x40'+p-9):data[3]=('\x30'+p);   for(i=0;i<4;i++)
       {
         Result[17+i]=data[i];
       }
       Result[21]='\x06';
       Result[22]='\x30';
       Result[23]='\x30';
       Result[24]='\x46';
       Result[25]='\x46';
    }
    int TSerial::CharToInt(char p)
    {
        if(p<='9'&&p>='0') 
    return (int)(p-'0');
    else if(p>='A'&&p<='F') 
    return (int)(10+p-'A');
        else 
    return (int)(10+p-'a'); 
    }希望对你有用!
      

  2.   

    See the link below, several samples there , useful :http://www.codeproject.com/system/#Hardware programming