Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Робота з COM-портом під Win XP 
:(
    Опции темы
_AMD_
Дата 14.1.2007, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 14.1.2007

Репутация: нет
Всего: нет



Не знаю як працювати з КОМ-портом під ХР. Під 98 знаю, а під ХР - ні. Допоможіть!!!
PM MAIL   Вверх
stmamont
Дата 14.1.2007, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 343
Регистрация: 13.3.2004
Где: влг

Репутация: 3
Всего: 3



Вот кое что
Код

//comport.h
#ifndef ComPortH
#define ComPortH

#include <Classes.hpp>
#include<string>

using std::string;

class ModemComPort
{
public:
    ModemComPort();
    ModemComPort(string CPName);
    ~ModemComPort();
    
    int Open();
    int Close();
    
    int getEofCode();
    
    int WriteString(string Str);
    string ReadString();
    
    string WriteAndRead(string Input);
    
    int setComPortName(string CPName);
    string getComPortName();
private:
    bool Opened;
    HANDLE hPort;
    string ComPortName;
};

#endif

Код

// ComPort.cpp
#include "ComPort.h"

string ModemComPort::WriteAndRead(string Input)
{
    WriteString(Input);
    return ReadString();
}

ModemComPort::~ModemComPort()
{
    Close();
}

int ModemComPort::WriteString(string Str)
{
    PurgeComm(hPort,PURGE_TXCLEAR | PURGE_RXCLEAR);
    Str = Str + "\r";
    DWORD dwError , dwNumBytesWritten;
    WriteFile(
        hPort,
        Str.c_str(),
        Str.length(),
        &dwNumBytesWritten,
        NULL);
    return (int)dwNumBytesWritten;
}

string ModemComPort::ReadString()
{
    string Out = "";
    DWORD dwCommModemStatus , dwBytesTransferred;
    BYTE Byte;
//    SetCommMask(hPort , EV_RXCHAR);
    WaitCommEvent(hPort , &dwCommModemStatus , 0);
    if(dwCommModemStatus & EV_RXCHAR || dwCommModemStatus & EV_RXFLAG)
    {
        do
        {
            ReadFile(hPort , &Byte , 1 , &dwBytesTransferred , 0);
            if(dwBytesTransferred == 1)
                Out = Out + (char)Byte;
        } while(dwBytesTransferred == 1);
    }
// óäàëÿåì ñíà÷àëà è ñ êîíöà \n
    int Start = 0 , End = 0;
    for(string::iterator i = Out.begin() ; i != Out.end() &&  (*i == '\n' || *i == '\r') ; ++ i , ++ Start);
    for(string::reverse_iterator i = Out.rbegin() ; i != Out.rend() &&  (*i == '\n' || *i == '\r') ; ++ i , ++ End);
    
    return Out.substr(Start , Out.length() - End - Start);
}

ModemComPort::ModemComPort()
{
}

ModemComPort::ModemComPort(string CPName)
    : ComPortName(CPName)
{
    
}

string ModemComPort::getComPortName()
{
    return ComPortName;
}

int ModemComPort::setComPortName(string CPName)
{
    ComPortName = CPName;
    return 1;
}

int ModemComPort::Open()
{
    hPort = CreateFile(
        ComPortName.c_str(),
        GENERIC_READ | GENERIC_WRITE,
        0,
        NULL,
        OPEN_EXISTING,
        0,
        NULL
        );
    if(hPort == INVALID_HANDLE_VALUE)
    {
        return 0;
    }
    DCB PortDCB;

    PortDCB.DCBlength = sizeof(DCB);


    GetCommState(hPort , &PortDCB);

    PortDCB.BaudRate = 9600;
    PortDCB.fBinary = true;  //!
    PortDCB.fParity = true;
    PortDCB.fOutxCtsFlow = false;
    PortDCB.fOutxDsrFlow = false;
    PortDCB.fDtrControl = DTR_CONTROL_ENABLE;

    PortDCB.fDsrSensitivity = false;
    PortDCB.fTXContinueOnXoff = false;
    PortDCB.fOutX = false;
    PortDCB.fInX = false;
    PortDCB.fErrorChar = true;
    PortDCB.fNull = false;
    PortDCB.fRtsControl = RTS_CONTROL_ENABLE;

    PortDCB.fAbortOnError = false;

    PortDCB.ByteSize = 8;
    PortDCB.Parity = NOPARITY;
    PortDCB.StopBits = ONESTOPBIT;
//    PortDCB.EofChar = '!';

    if(!SetCommState(hPort , &PortDCB))
    {
        return 0;
//        ShowMessage("Unable to configure the serial port");
    }

    COMMTIMEOUTS CommTimeouts;

    GetCommTimeouts(hPort,&CommTimeouts);



    CommTimeouts.ReadIntervalTimeout = 50;
    CommTimeouts.ReadTotalTimeoutMultiplier = 1;
    CommTimeouts.ReadTotalTimeoutConstant = 50;
    CommTimeouts.WriteTotalTimeoutMultiplier = 1;
    CommTimeouts.WriteTotalTimeoutConstant = 50;

    SetCommTimeouts(hPort,&CommTimeouts);
    FlushFileBuffers(hPort);
    Opened = true;
    return 1;
}

int ModemComPort::getEofCode()
{
    DCB PortDCB;

    PortDCB.DCBlength = sizeof(DCB);


    GetCommState(hPort , &PortDCB);
    return PortDCB.EofChar;
}

int ModemComPort::Close()
{
    if(Opened)
    {
        CloseHandle(hPort);
        Opened = false;
        return 1;
    }    
    else
        return 0;
}



--------------------
user posted image
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.2812 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.