Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.06.2008, 16:10   #1
mdrake
 
Регистрация: 14.05.2008
Сообщений: 5
Вопрос Обращение к COM-порту из обработчика системного таймера (приложение WinForm)

Есть проблема с описанием работы последовательного порта в прерывании по системному таймеру при работе приложения оконной формы Visual Studio 2005 C++. Таймер Windows, имеющийся в инструментарии оконной формы, не может генерировать прерывания чаще, чем раз в 55 мс. Для обмена через COM-порт с частотой 20 мс описал класс системного таймера и обработчик его прерываний. Теперь никак не получается создать понятное обработчику описание структуры или класса последовательного порта из System::IO::Ports::SerialPort. Пытался описать встроенный класс SysTimer и внешний по отношению к оконной форме – обработчик не понимает. Попытка создать ещё класс serialPort тоже ни к чему не привела. Может, кто-нибудь подскажет тонкости описания подобных вещей? В MFC, API не писал. Был только опыт работы с Borland C++ в MS-DOS.

Фрагмент программы:

Код:
namespace WinForm {
	using namespace System;
	using namespace System::ComponentModel;
	using namespace System::Collections;
	using namespace System::Windows::Forms;
	using namespace System::Data;
	using namespace System::Drawing;
	using namespace System::IO::Ports;
	using namespace System::Timers;

public ref class Form1 : public System::Windows::Forms::Form
	{
	public:
		Form1(void)
		{
		 . . .
	 	 SysTimer::SysT();// инициализация элементов класса SysTimer;
		. . .
		};

		ref class SysTimer : public System::Timers::Timer
		{
		 public: 
		   System::IO::Ports::SerialPort ^ serialPort2;
		 static void SysT()
		 {
		  System::Timers::Timer^ SysTimer1 = gcnew System::Timers::Timer;
		  SysTimer1->Elapsed += gcnew System::Timers::ElapsedEventHandler(SysTimer::SysTimer1_Tick1);
		 }
		 private: 
		 static void SysTimer1_Tick1(System::Object^  sender, System::Timers::ElapsedEventArgs ^ e) 
		 {
		  Tick_Count++;
// проверка состояния порта
		  if (!serialPort2->IsOpen)//(!Flag.f.Port_Opened)			// не понимает описание – требует класс serialPort2
		  {
		   . . .
		  }
		   . . .

Последний раз редактировалось merax; 16.06.2008 в 16:59.
mdrake вне форума Ответить с цитированием
Старый 17.06.2008, 06:41   #2
merax
Форумчанин
 
Регистрация: 27.12.2006
Сообщений: 955
По умолчанию

А вообще я бы рекомендовал тебе бросить .NET и делать ето в С++ Builder или студии как я делал , таймер на Builder есть нормальный, а на студии легко программируется. А вот кусочек кода из моей проги для работы с COM....

Код:
#include "stdafx.h"
#include "windows.h"
#include "iostream"
#include "conio.h"

using namespace std;

int main()
{
	HANDLE  hCOM = CreateFile("COM1",GENERIC_WRITE,0,NULL,
		OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

	if (hCOM != INVALID_HANDLE_VALUE)
	{
		cout << " Ok Open COM1" << endl;
		CloseHandle(hCOM);
	}
	else 
	{
		cout << "Error Open" << endl;
	}     
	getch();
}
А вот для .NET, но так как вашего кода не достает для полного уяснения того, что вы хотите, то я интуитивно предположил


Код:
	ref class Systaim : public System::Timers::Timer
		{
			private: 
					static System::Timers::Timer ^m_Timer;
					static System::IO::Ports::SerialPort ^serialPort1;
			
			public:
			
			static void TimerSet()
			{
			     m_Timer = gcnew System::Timers::Timer( );

				 m_Timer->Elapsed += gcnew ElapsedEventHandler( Systaim::OnTimeEvent );
	     
				 m_Timer->Interval = 22;
      
				 m_Timer->Enabled = true;

		   }

			private:

			static void OnTimeEvent( Object ^source, ElapsedEventArgs ^e )
			{
				if( !serialPort1 )
				{
					MessageBox::Show("No !!!");
				}
				else
				{
					MessageBox::Show("Yes ???");
				}				
			}
		
		};

Последний раз редактировалось merax; 17.06.2008 в 13:26.
merax вне форума Ответить с цитированием
Старый 17.06.2008, 12:55   #3
mdrake
 
Регистрация: 14.05.2008
Сообщений: 5
Подмигивание

Спасибо за подсказку merax !
С описанием всё получилось. Теперь добиваюсь нужной частоты. Почему-то при указанном интервале 20 мс в действительности выходит около 32. Ещё появились проблемы с выводом в оконную форму из обработчика системного таймера, но, в крайнем случае, без этого можно обойтись.
mdrake вне форума Ответить с цитированием
Старый 17.06.2008, 13:12   #4
merax
Форумчанин
 
Регистрация: 27.12.2006
Сообщений: 955
По умолчанию

Ну проблемы с выводом, это то, что функии в классе статические и не могут использовать нестатические методы. А интервал на разных компах все равно разный будет...

Пы.Сы. Кодом-с поделитесь для пополния форума и раздела в часности....

Последний раз редактировалось merax; 18.06.2008 в 02:07.
merax вне форума Ответить с цитированием
Старый 18.06.2008, 09:36   #5
mdrake
 
Регистрация: 14.05.2008
Сообщений: 5
Подмигивание

Насчёт того, что интервал на разных компах будет разный – вообще-то разница должна быть в каких-то разумных пределах – ну процентов 10, но не 50 же.
По вашей просьбе прилагаю полностью текущий код (Form1.h в архиве rar)
Вложения
Тип файла: rar Form1.rar (16.0 Кб, 34 просмотров)
mdrake вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
добавление обработчика OnPaint в TPanel Mixasik Общие вопросы Delphi 2 23.07.2008 17:36
Организация обработчика OnClick 8alig8 Помощь студентам 1 03.06.2008 05:11
получение системного времени Alex_Pro Общие вопросы C/C++ 1 21.05.2008 20:31
Динамик системного блока Михаил Юрьевич Общие вопросы Delphi 4 28.01.2008 18:31