0 / 0 / 0
Регистрация: 19.11.2013
Сообщений: 33

Как очистить буфер com-порта?

04.03.2014, 02:25. Показов 8042. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В этой программе я считываю данные с lpt-порта и в зависимости от полученных значений, посылаю данные в com-порт, куда подключен микроконтроллер. Проблема в том, что в процессе работы программы com-порт лишь принимает первые данные, а остальные игнорирует, т.е микроконтроллер только один раз замыкает реле, а размыкать он их не размыкает. И теперь я не знаю как очистить буфер com-порта, для того чтобы можно было отправлять новые команды com-порту. Испробовала несколько функций( они в комментариях к программе), но все безуспешно, может я как то их не так использую?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#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;
 
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.03.2014, 02:25
Ответы с готовыми решениями:

Как очистить буфер клавиатуры?
Есть меню в котором я двигаю стрелочку кнопками вверх и вниз и нажимаю ентер. while (true) { if (ti &gt; 0) ti--; ...

Как вывести в поле Edit буфер, полученный с com-порта?
как вывести в поле Edit буффер полученный с ком порта? в Label выводится как Label1-&gt;Caption=((char*)Buffer); в Edit не получается....

Очистить буфер сокета
имеется клиент-сервер,клиент отправляет сообщение принятое std::cin и пересылает серверу,тот в свою очередь выводит его на экран,так вот в...

1
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,450
04.03.2014, 10:06
Цитата Сообщение от Alsou93 Посмотреть сообщение
не так
методом ломки проблемы можно попробовать
C++
1
2
3
4
5
    PurgeComm
    (
        h,
        PURGE_RXABORT | PURGE_TXABORT | PURGE_RXCLEAR | PURGE_TXCLEAR
    );
C++
1
ClearCommError(h, errors, 0);
C++
1
ClearCommBreak(h);
или повторно открыть порт
а вообще не ясно почему данные вдруг начинают игнорироваться и требуется "встряхивание" порта
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.03.2014, 10:06
Помогаю со студенческими работами здесь

Полностью очистить буфер ввода
Требуется, в конце программы, сделать небольшое ожидания для чтения того как отработала программа Написал: ...

Как очистить буфер..?
Извините, за вопрос из облатси VBA, но там в конфе глухо, да и проблема не только VBA'шная... Вчера я спросил о включении NumLock, не...

Как очистить буфер scanf() ?
Мне нужно, чтобы scanf() вызывался до тех пор, пока не будет введено целое число, но происходит зацикливание. while...

Как очистить буфер обмена?
вот собственно и весь вопрос Заранее спасибо

Как очистить буфер обмена (clipboard)?
сабж, собственно


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

Новые блоги и статьи
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru