Поиск:

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


Новичок



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

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



В этой программе я считываю данные с lpt-порта и в зависимости от полученных значений, посылаю данные в com-порт, куда подключен микроконтроллер. Проблема в том, что в процессе работы программы com-порт лишь принимает первые данные, а остальные игнорирует, т.е микроконтроллер только один раз замыкает реле, а размыкать он их не размыкает. И теперь я не знаю как очистить буфер com-порта, для того чтобы можно было отправлять новые команды com-порту. Испробовала несколько функций( они в комментариях к программе), но все безуспешно, может я как то их не так использую?

#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() //включаю 
 

    LPCTSTR sPortName = L"COM3";  
 
    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";
    }
    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;
 
    
    //PurgeComm(hSerial, PURGE_TXCLEAR);//  эту команду пробовала использовать
        //PurgeComm(hSerial, PURGE_RXCLEAR);//  здесь пробовала параметр сменить
    //FlushFileBuffers(hSerial);// и эта тоже не работает...
    return 0;
    
}
 
int ViklRele()// выключаю

    LPCTSTR sPortName = L"COM3";  
 
    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";
    }
    char data[] = "$KE,REL,1,0\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;
 
    //PurgeComm(hSerial, PURGE_TXCLEAR);// вообщем те же самые попытки, что и в функции VklRele()
        //PurgeComm(hSerial, PURGE_RXCLEAR);//  
    //FlushFileBuffers(hSerial);//
 
    return 0;
    
}
//здесь я делаю таймер, чтобы использовать в main
 
void how2timer(int ms) { 
    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[])

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

Это сообщение отредактировал(а) Alsou93 - 4.3.2014, 01:37
PM MAIL   Вверх
xvr
Дата 4.3.2014, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 6984
Регистрация: 28.8.2007
Где: Химки, Московская обл

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



CloseHandle не очищает COM порт - он закрывает handle, по которомы вы пытаетесь в дальнейшем общаться с портом. Результат предсказуем - ничего не работает. Для очистки порта используется функция PurgeComm

Добавлено через 2 минуты
PS. За такую реализацию how2timer надо расстреливать из рогатки. Чем вам не угодила Sleep(5000) ?

PM MAIL   Вверх
Google
  Дата 23.5.2019, 02:52 (ссылка)  





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


 




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


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

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