Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как обновить данные в буфере com-порта? 
:(
    Опции темы
Alsou93
Дата 5.3.2014, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В этой программе я считываю данные с 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;

}


Присоединённый файл ( Кол-во скачиваний: 0 )
Присоединённый файл  Ke_USB24R_1__7_.rar 114,59 Kb
PM MAIL   Вверх
xvr
Дата 5.3.2014, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



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

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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




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


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

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