Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: COM/DCOM/ActiveX/ATL/CORBA > Как обновить данные в буфере com-порта?


Автор: Alsou93 5.3.2014, 00:05
В этой программе я считываю данные с lpt-порта и в зависимости от полученных значений, посылаю данные в com-порт, куда подключен микроконтроллер. Хотя консольное окно показывает что все байты(команды) отправлены, в процессе работы программы, com-порт лишь принимает первые данные, а остальные игнорирует, т.е микроконтроллер только один раз замыкает реле, а размыкать он их не размыкает. И теперь не знаю как обновить данные в буфере com-порта, для того чтобы можно было отправлять новые команды com-порту. Попыталась использовать функцию UpdateData(true), но она не работает в консольном приложении. Может кто знает какие-нибудь функции по обновлению буфера порта?
Еще у меня есть программа(скачанная с сайта производителя) по управлению микроконтроллером, она на windows form, но мне нужно переделать его в консольное приложение. Большую часть программы по управлению микроконтроллером составляла в основном ориентируясь на это приложение. только почему то та программа работает, а моя нет, может быть причина не только в обновлении данных...... 

#include "stdafx.h"
#include <Windows.h>
#include <iostream>
#include <ctime>   
#include <stdio.h>
#include <conio.h>
#include "h.h"
#define _WIN32_WINNT 0x0500
#include <fstream>
using namespace std;

HANDLE hSerial;

 
int VklRele()//функция включения контакта реле


    
    //UpdateData(true);..здесь пытаюсь обновить данные в буфере com-порта, но не получается
    PurgeComm(hSerial, PURGE_TXCLEAR);
    char data[] = "$KE,REL,1,1\r\n";
    DWORD dwSize = sizeof(data);
    DWORD dwBytesWritten;
    LPOVERLAPPED ov;


    BOOL iRet = WriteFile (hSerial,data,dwSize,&dwBytesWritten ,NULL);
    cout << dwSize << " Bytes in string. " << dwBytesWritten << " Bytes sended. " << endl;
    //UpdateData(true);

    //CloseHandle(hSerial);
    

    return 0;
}

int ViklRele()//функция выключения контакта реле

    
    //UpdateData(true);// и здесь пытаюсь обновить
    PurgeComm(hSerial, PURGE_TXCLEAR);
    char data[] = "$KE,REL,1,0\r\n";
    DWORD dwSize = sizeof(data);
    DWORD dwBytesWritten;
    LPOVERLAPPED ov;
    //PurgeComm(hSerial, PURGE_TXCLEAR);
    BOOL iRet = WriteFile (hSerial,data,dwSize,&dwBytesWritten ,NULL);

    cout << dwSize << " Bytes in string. " << dwBytesWritten << " Bytes sended. " << endl;

    //UpdateData(true);
    return 0;
    
}

    void how2timer(int ms) { // установка таймера на 5 сек
    int CLOCKS_PER_MSEC = CLOCKS_PER_SEC / 1000;   
    clock_t end_time = clock() + ms * CLOCKS_PER_MSEC ; 
    while (clock() < end_time) {}  
    cout << "5 seconds passed!!!\n";  
}

int _tmain(int argc, _TCHAR* argv[])

     LPCTSTR sPortName = L"COM3";  // инициализация com-порта

    hSerial = ::CreateFile(sPortName,GENERIC_READ | GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
    if(hSerial==INVALID_HANDLE_VALUE)
    {
        if(GetLastError()==ERROR_FILE_NOT_FOUND)
        {
            cout << "serial port does not exist.\n";
        }
        cout << "some other error occurred.\n";
    }
     // if(hSerial!= NULL)
     // CloseHandle(hSerial);

    DCB dcbSerialParams = {0};
    dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
    if (!GetCommState(hSerial, &dcbSerialParams))
    {
        cout << "getting state error\n";
    }
    dcbSerialParams.BaudRate=CBR_9600;
    dcbSerialParams.ByteSize=8;
    dcbSerialParams.StopBits=ONESTOPBIT;
    dcbSerialParams.Parity=NOPARITY;
    if(!SetCommState(hSerial, &dcbSerialParams))
    {
        cout << "error setting serial port state\n";
    }

    while(1){
  
  cout<<"Read data from DATA register.\n"<<endl;    

  int data;
  data = Inp32(888); //считывание данных с lpt-порта
  cout<<"10: "<<data<<endl;

  char number[20];//считывание данных с lpt-порта
  itoa(data,number,2);
  cout<<" 2: "<<number<<endl;
    
    if(number[0]=='1' && number[1]=='0' && number[2]=='0' && number[3]=='0' && number[4]=='0' && number[5]=='0' && number[6]=='0' && number[7]=='0')
    {//если сработает какой-нибудь определенный контакт lpt-порта, то
        VklRele(); //команда на включения реле микроконтроллера
        how2timer(5000);// ждем 5 сек
        ViklRele(); // выключаем реле микроконтроллера
    }
 }
  return 0;

}

Автор: xvr 5.3.2014, 12:24
Вы уж определитесь - вам данные принять нужно или выкинуть? (как в вашей предыдущей теме). PurgeComm вычистит всю очередь (т.е. данные не будут отправленны, а принятые будут убиты).

PS. COM в названии раздела не имеет ничего общего с COM портом, вы разделом явно ошиблись  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)