有一个C的类:
//---------------------------------------------------------------------------
TComm::TComm(int is, int ir)
{
    iSerial = is;
    BaudRate = ir;    Terminated = false;    dwError = CE_FRAME|CE_IOE|CE_TXFULL|CE_RXPARITY|CE_RXOVER;    CommOk = Initalize();
}
//---------------------------------------------------------------------------
TComm::~TComm()
{
    Terminate();
}
//---------------------------------------------------------------------------
bool TComm::Initalize(void)
{
    char *pSerial[] = {"COM1", "COM2", "COM3", "COM4" };    hCom = CreateFile( pSerial[iSerial - 1],
                       GENERIC_READ | GENERIC_WRITE,
                       0,
                       NULL,
                       OPEN_EXISTING,
                       0,
                       NULL
                       );    if (hCom == INVALID_HANDLE_VALUE)
    {
        MessageBox(NULL, (AnsiString(pSerial[iSerial - 1]) + "¶Ë¿Ú²»ÄÜ´ò¿ª!").c_str(), "´íÎó", MB_ICONSTOP|MB_OK);
        return false;
    }
    else
    {
        if( ! SetupComm (hCom, RXQUEUE, TXQUEUE) )
        {
            MessageBox(NULL, "ÉèÖÃÊäÈëÊä³ö»º³åÇø³ö´í!", "´íÎó", MB_ICONSTOP|MB_OK );
            return false;
        }        DCB dcb;        if( ! GetCommState(hCom,&dcb) )
        {
            MessageBox(NULL, "»ñÈ¡¶Ë¿ÚDCB¿éÐÅÏ¢³ö´í!", "´íÎó", MB_ICONSTOP|MB_OK );
            return false;
        }        dcb.BaudRate = BaudRate;
        dcb.ByteSize = 8;
        dcb.Parity = NOPARITY;
        dcb.StopBits = ONESTOPBIT;        if ( ! SetCommState(hCom, &dcb) )
        {
           MessageBox (NULL, "ÉèÖö˿ÚDCB¿éÐÅÏ¢³ö´í!", "´íÎó", MB_ICONSTOP|MB_OK);
           return false;
        }        if(! GetCommTimeouts(hCom, &timeOuts))
        {
            MessageBox (NULL, "GetCommTimeouts Error!", "´íÎó", MB_ICONSTOP|MB_OK);
            return false;
        }        // Set Reading And Writing Timeout!
        timeOuts.ReadIntervalTimeout = 0;
        timeOuts.ReadTotalTimeoutMultiplier = 500;
        timeOuts.ReadTotalTimeoutConstant = 0;
        if(! SetCommTimeouts(hCom, &timeOuts))
        {
            MessageBox (NULL, "SetCommTimeouts Error!", "´íÎó", MB_ICONSTOP|MB_OK);
            return false;
        }
        return  true;
    }
}
//---------------------------------------------------------------------------
void TComm::Terminate(void)
{
    Terminated = TRUE;
    Sleep(500);
    PurgeComm(hCom,PURGE_RXABORT);
    PurgeComm(hCom,PURGE_TXABORT);
    PurgeComm(hCom,PURGE_RXCLEAR);
    PurgeComm(hCom,PURGE_TXCLEAR);    CloseHandle(hCom);
}
//---------------------------------------------------------------------------
//---------------Ïò¶Ë¿Ú·¢ËÍÊý¾Ý------------------------
void TComm::Send (BYTE cmdCode)
{
    if (!CommOk)
        return;
     PurgeComm (hCom, PURGE_TXCLEAR); // Çå³ý·¢ËÍ»º³åÇø
     if (WriteFile(hCom, &cmdCode, 1, &dwWrcn, NULL) == FALSE )
     {
        ClearError();
//        ShowMessage ("д¶Ë¿Ú´íÎó") ;
     }
//     else
}
//---------------------------------------------------------------------------
//---------------¶Á¶Ë¿ÚÊý¾Ý------------------------
byte TComm::Recieve()
{
    if (!CommOk)
        return 0;
    DWORD count(1);
    byte key;
    if (ReadFile(hCom, &key, 1, &count, NULL) == false)
    {
        ClearError();
//        ShowMessage ("¶Á¶Ë¿Ú´íÎó") ;
    }
    return key;
}
//---------------------------------------------------------------------------
void TComm::ClearError()
{
     ( ClearCommError( hCom, &dwError, &comStat) <= 0 );
//         ShowMessage("CLEAR FAILUER");
}
//---------------------------------------------------------------------------

解决方案 »

  1.   

    你可找对人了,不要忘记给分哟!
    1.打开串口:代入串口号,返回串口名柄
    function OpenCommPort(Port:Byte):THandle;
    var
      S  : array [0..6] of char;
    begin
        BaudRate := Rate;
        FillChar(S,7,0);
        StrCopy(@S[0],'COM');
        if Port>9 then begin
          S[3]:=chr(Port div 10+48);
          S[4]:=chr(Port mod 10+48);
        end
        else
          S[3]:=chr(Port+48);    Result := CreateFile(@S[0], GENERIC_READ or GENERIC_WRITE, 0, nil,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,
        0);      
    end;
    2。关闭串口:代入串口名柄
    procedure CloseCommPort(hPort:THandle);
    begin
      if (hPort <> INVALID_HANDLE_VALUE) and (hPort <> 0) then
        CloseHandle(hPort);
    end;
    3.读串口数据
       Right := ReadFile(hPort,Buf,读多少字节 ,Num,@lpol);
       if not Right and (GetLastError() = ERROR_IO_PENDING) then
            Right := WaitForSingleObject(post_Event,TIMEOUT) = WAIT_OBJECT_0;
    4.写数据到串口
      Right := WriteFile(hPort,Buf,StrLen(Cmd),Num,@lpol);
      Num := GetLastError();
      if not Right and (Num = ERROR_IO_PENDING) then
         Right := WaitForSingleObject(post_Event,TIMEOUT) = WAIT_OBJECT_0;在写读写函数很复杂,这里不够详细,想进一少了解,请邮
    [email protected]