Как обновить данные в буфере com-порта?

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Alsou93
Сообщения: 3
Зарегистрирован: 04 мар 2014, 02:47

В этой программе я считываю данные с lpt-порта и в зависимости от полученных значений, посылаю данные в com-порт, куда подключен микроконтроллер. Хотя консольное окно показывает что все байты(команды) отправлены, в процессе работы программы, com-порт лишь принимает первые данные, а остальные игнорирует, т.е микроконтроллер только один раз замыкает реле, а размыкать он их не размыкает. И теперь не знаю как обновить данные в буфере com-порта, для того чтобы можно было отправлять новые команды com-порту. Попыталась использовать функцию UpdateData(true), но она не работает в консольном приложении. Может кто знает какие-нибудь функции по обновлению буфера порта?
Еще у меня есть программа(скачанная с сайта производителя) по управлению микроконтроллером, она на windows form, но мне нужно переделать его в консольное приложение. Большую часть программы по управлению микроконтроллером составляла в основном ориентируясь на это приложение. только почему то та программа работает, а моя нет, может быть причина не только в обновлении данных...... http://www.avineuro.ru/_fr/0/Ke-USB24R_1.rar (здесь программа по управлению микроконтроллером)

Код: Выделить всё

#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;
}
Ответить