Очень Срочно!!!!

Тема в разделе "C и С++ FAQ", создана пользователем Fixxxer, 2 дек 2004.

Статус темы:
Закрыта.
  1. Fixxxer

    Fixxxer Гость

    Люди помогите. Написал прогу которая ститывает с com порта, а она вместо символов которые ей посылаешь, выдает какую-то абракадабру. Если есть у кого-нибудь готовый рабочий листинг чтения с порта, пожалуйста выложите его, а то сроки горят и я уже запарился с этим портами. Только пожалуйста не надо ссылок на документацию или типа того "поищи, эта тема уже поднималась". По этому вопросу уже весь инет излазил и ничего нет. Я пишу на С++ Builder. На всякий случай даю свой листинг, может чего подскажите:


    DCB dcb;
    COMMTIMEOUTS ct;
    HANDLE port;
    DWORD mask;
    DWORD bc;
    char buf[101];

    dcb.DCBlength=sizeof(DCB);
    BuildCommDCB("baud=9600 parity=N data=8 stop=1",&dcB);
    dcb.fNull=TRUE;

    ct.ReadIntervalTimeout=10;
    ct.ReadTotalTimeoutMultiplier=ct.ReadTotalTimeoutConstant=0;
    ct.WriteTotalTimeoutMultiplier=ct.WriteTotalTimeoutConstant=0;

    port=CreateFile("COM2",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);

    SetCommState(port,&dcB);
    SetCommTimeouts(port,&ct);
    PurgeComm(port,PURGE_RXCLEAR);

    SetCommMask(port,EV_RXCHAR);
    WaitCommEvent(port,&mask,NULL);
    ReadFile(port,buf,100,&bc,NULL);

    CloseHandle(port);
     
  2. Fixxxer

    Fixxxer Гость

    Прошу прощения, форум какие то смайлики свтавил. Ещё раз только без смайлов:

    DCB dcb;
    COMMTIMEOUTS ct;
    HANDLE port;
    DWORD mask;
    DWORD bc;
    char buf[101];

    dcb.DCBlength=sizeof(DC;
    BuildCommDCB("baud=9600 parity=N data=8 stop=1",&dc;
    dcb.fNull=TRUE;

    ct.ReadIntervalTimeout=10;
    ct.ReadTotalTimeoutMultiplier=ct.ReadTotalTimeoutConstant=0;
    ct.WriteTotalTimeoutMultiplier=ct.WriteTotalTimeoutConstant=0;

    port=CreateFile("COM2",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);

    SetCommState(port,&dc;
    SetCommTimeouts(port,&ct);
    PurgeComm(port,PURGE_RXCLEAR);

    SetCommMask(port,EV_RXCHAR);
    WaitCommEvent(port,&mask,NULL);
    ReadFile(port,buf,100,&bc,NULL);

    CloseHandle(port);
     
  3. zubr

    zubr Гость

    Fixxer
    Извини, нет времени сейчас разбираться. недавно делал прогу по Dual-Up обмену данными, вот код, правда на Delphi:
    Код (Text):
    procedure Init_port;
    var
    s:string;
    dcb:_DCB;
    cto:TCommTimeOuts;
    begin
    FHandle:= CreateFile(PChar(com_port), GENERIC_READ or GENERIC_WRITE,
         0, nil, OPEN_EXISTING,
         FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED, 0);
    If FHandle=INVALID_HANDLE_VALUE then
    begin
    s:='ошибка при открытии порта '+com_port;
    Application.MessageBox(PChar(s), 'TelBDServer',
     MB_OK+MB_ICONERROR+MB_TOPMOST);
    exit;
    end;
    GetCommState(FHandle, dcb);
    dcb.EvtChar:='~';
    dcb.BaudRate:=speed_port;
    dcb.ByteSize:=8;
    dcb.Parity:=NOPARITY;
    dcb.StopBits:=TWOSTOPBITS;
    dcb.Flags:=(((((((((((((dcb.Flags and (not dcb_ParityCheck)) or dcb_OutxCtsFlow) and
    (not dcb_OutxDsrFlow)) or dcb_DtrControlEnable) and
    (not dcb_DtrControlHandshake)) and (not dcb_DsrSensivity)) or
    dcb_TXContinueOnXoff) and (not dcb_OutX)) and (not dcb_InX)) and
    (not dcb_ErrorChar)) and (not dcb_NullStrip)) or dcb_RtsControlEnable) and
    (not dcb_RtsControlHandshake)) and (not dcb_AbortOnError);
    SetCommState(FHandle, dcb);
    GetCommTimeouts(FHandle, cto);
    cto.ReadIntervalTimeout:=50;
    cto.ReadTotalTimeoutMultiplier:=1;
    cto.ReadTotalTimeoutConstant:=50;
    cto.WriteTotalTimeoutMultiplier:=1;
    cto.WriteTotalTimeoutConstant:=50;
    SetCommTimeOuts(FHandle, cto);
    SetupComm(FHandle, 1000, 1000);
    PurgeComm(FHandle, PURGE_TXCLEAR);
    PurgeComm(FHandle, PURGE_RXCLEAR);
    EscapeCommFunction(FHandle, CLRDTR);
    Sleep(10);
    EscapeCommFunction(FHandle, SETRTS);
    Sleep(100);
    end;

    procedure ReadFile;
    var
    nb:cardinal;
    buf1:array[1..100] of char;
    begin
    ReadFile(FHandle, buf1, 100, nb, @sob_read);
    GetOverlappedResult(FHandle, sob_read, nb, True);
    PurgeComm(FHandle, PURGE_TXCLEAR);
    PurgeComm(FHandle, PURGE_RXCLEAR);
    EscapeCommFunction(FHandle, SETDTR);
    end;
     
  4. Dr.Gigabit

    Dr.Gigabit Гость



    Нужно так: ReadFile(port,&buf,100,&bc,NULL);

    Ибо
    BOOL ReadFile(
    HANDLE hFile,
    LPVOID lpBuffer, // указатель на буфер(!)
    DWORD nNumberOfBytesToRead,
    LPDWORD lpNumberOfBytesRead,
    LPOVERLAPPED lpOverlapped
    );

    Все остальное вроде правильно
     
  5. Fixxxer

    Fixxxer Гость

    Спасибо за ответы. Я кое что подправил, а именно:

    DCB dcb;
    COMMTIMEOUTS ct;
    HANDLE port;
    DWORD mask;
    DWORD bc;
    char buf[100]; //был 101

    dcb.DCBlength=sizeof(DC;
    BuildCommDCB("baud=9600 parity=N data=8 stop=1",&dc;
    dcb.fNull=TRUE;

    ct.ReadIntervalTimeout=10;
    ct.ReadTotalTimeoutMultiplier=ct.ReadTotalTimeoutConstant=0;
    ct.WriteTotalTimeoutMultiplier=ct.WriteTotalTimeoutConstant=0;

    port=CreateFile("COM2",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);

    SetCommState(port,&dc;
    SetCommTimeouts(port,&ct);
    PurgeComm(port,PURGE_RXCLEAR);

    SetCommMask(port,EV_RXCHAR);
    WaitCommEvent(port,&mask,NULL);
    ReadFile(port,&buf,100,&bc,NULL); // одинаковые значения с char buf[100]; ну и &buf поставил

    CloseHandle(port);

    теперь принимать стал лучше, но все равно добавляет символы.
    Как сделать чтобы принимал 1:1 то что передают. Где касяк??
     
  6. Fixxxer

    Fixxxer Гость

    Всем большое спасибо. С предыдущими исправлениями все заработало.
     
  7. Dico

    Dico Гость

    CComPort::CComPort(CString& sComPort)
    {
    m_sComPort = sComPort;
    m_bPortReady = FALSE;
    } // конец конструктора CComPort

    CComPort::~CComPort()
    {

    } // конец деструктора CComPort

    //
    // инициализация COM порта
    //
    BOOL CComPort::Initialize()
    {
    DWORDdwRC;
    DWORDdwError;
    charsMsg[512];

    m_bPortReady = TRUE; // всё OK

    m_hCom = CreateFile(m_sComPort,
    GENERIC_READ | GENERIC_WRITE,
    0, // экслюзивно занимаем порт
    NULL, // no security
    OPEN_EXISTING,
    0, // no overlapped I/O
    NULL); // null template

    if (m_hCom == INVALID_HANDLE_VALUE)
    {
    m_bPortReady = FALSE;
    dwError = GetLastError();

    // обработка ошибки
    LPVOID lpMsgBuf;
    lpMsgBuf = NULL;
    dwRC = FormatMessage(
    FORMAT_MESSAGE_ALLOCATE_BUFFER |
    FORMAT_MESSAGE_FROM_SYSTEM |
    FORMAT_MESSAGE_IGNORE_INSERTS,
    NULL,
    dwError, // из GetLastError(),
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), //
    (LPTSTR) &lpMsgBuf,
    0,
    NULL);

    if (dwRC && lpMsgBuf)
    {
    sprintf(sMsg, "COM open failed: Port=%s Error=%d - %s",
    m_sComPort, dwError, lpMsgBuf);
    AfxMessageBox(sMsg);
    }
    else
    {
    sprintf(sMsg, "COM open failed: Port=%s Error=%d ",
    m_sComPort, dwError);
    AfxMessageBox(sMsg);
    } // end if
    if (dwRC && lpMsgBuf)
    {
    LocalFree( lpMsgBuf );
    } // end if

    } // end if

    if (m_bPortReady)
    {
    m_bPortReady = SetupComm(m_hCom,
    128, 128); // размер буфера
    if (!m_bPortReady)
    {
    dwError = GetLastError();
    sprintf(sMsg, "SetupComm failed: Port=%s Error=%d",
    m_sComPort, dwError);
    AfxMessageBox(sMsg);

    } // end if
    } // end if

    if (m_bPortReady)
    {
    m_bPortReady = GetCommState(m_hCom, &m_dcB);
    if (!m_bPortReady)
    {
    dwError = GetLastError();
    sprintf(sMsg, "GetCommState failed: Port=%s Error=%d",
    m_sComPort, dwError);
    AfxMessageBox(sMsg);
    } // end if
    } // end if

    if (m_bPortReady)
    {
    m_dcb.BaudRate = 9600;
    m_dcb.ByteSize = 8;
    m_dcb.Parity = NOPARITY;
    m_dcb.StopBits = ONESTOPBIT;
    m_dcb.fAbortOnError = TRUE;

    m_bPortReady = SetCommState(m_hCom, &m_dcB);
    if (!m_bPortReady)
    {
    dwError = GetLastError();
    sprintf(sMsg, "SetCommState failed: Port=%s Error = %d",
    m_sComPort, dwError);
    AfxMessageBox(sMsg);
    }
    } // end if

    if (m_bPortReady)
    {
    m_bPortReady = GetCommTimeouts (m_hCom, &m_CommTimeouts);
    if (!m_bPortReady)
    {
    dwError = GetLastError();
    sprintf(sMsg, "GetCommTimeouts failed: Port=%s Error = %d",
    m_sComPort, dwError);
    AfxMessageBox(sMsg);
    } // end if
    } // end if

    if (m_bPortReady)
    {
    m_CommTimeouts.ReadIntervalTimeout = 50;
    m_CommTimeouts.ReadTotalTimeoutConstant = 50;
    m_CommTimeouts.ReadTotalTimeoutMultiplier = 10;
    m_CommTimeouts.WriteTotalTimeoutConstant = 50;
    m_CommTimeouts.WriteTotalTimeoutMultiplier = 10;
    m_bPortReady = SetCommTimeouts (m_hCom, &m_CommTimeouts);
    if (!m_bPortReady)
    {
    dwError = GetLastError();
    sprintf(sMsg, "SetCommTimeouts failed: Port=%s Error = %d",
    m_sComPort, dwError);
    AfxMessageBox(sMsg);
    } // end if
    } // end if

    return m_bPortReady;
    } // end CComPort::Initialize


    //
    // освобождаем COM порт
    //
    void CComPort::Terminate()
    {
    CloseHandle(m_hCom);
    } /
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей