Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > 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 портом, вы разделом явно ошиблись ![]() |