|
|
|
Alsou93 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
xvr |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
CloseHandle не очищает COM порт - он закрывает handle, по которомы вы пытаетесь в дальнейшем общаться с портом. Результат предсказуем - ничего не работает. Для очистки порта используется функция PurgeComm
Добавлено через 2 минуты PS. За такую реализацию how2timer надо расстреливать из рогатки. Чем вам не угодила Sleep(5000) ? |
|||
|
||||
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |