Модераторы: Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Простай программа для работы с СОМ-портом, Прошу помощи с объяснением 
V
    Опции темы
cambit
Дата 17.2.2012, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 15.2.2012

Репутация: нет
Всего: нет



Спасибо, Уважаемый! В понедельник попробую и отпишусь - сегодня в командировке. Еще раз спасибо!!!!
PM MAIL   Вверх
cambit
Дата 20.2.2012, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 15.2.2012

Репутация: нет
Всего: нет



Чегото ничего не слышно... Подавал логические "1" и "0" на входа CTS и DSR - звука никакого небыло. В процессах com2beep есть. Что делать? Или может надо на оба входа сразу подать?

Это сообщение отредактировал(а) cambit - 20.2.2012, 16:42
PM MAIL   Вверх
borisbn
Дата 20.2.2012, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 11
Всего: 135



Цитата(cambit @  20.2.2012,  16:41 Найти цитируемый пост)
Что делать?

вставить вместо PlaySound
Код
MessageBox( 0, "Triggered !!!", "com2beep caption", MB_OK );

Если сообщение выводится, то проблема в параметрах PlaySound, если нет - то Вы просто не получаете события.
Если Вы написали свою программу, то выкладывайтё её сюда, если же взяли от t_gran и ничего не изменяли - то не нужно, она и так здесь есть.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
cambit
Дата 20.2.2012, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 15.2.2012

Репутация: нет
Всего: нет



Использовал ту, что прислали. НО! Где в коде "PlaySound"?
Я видел только 
Код

Beep(1000, 100);

PM MAIL   Вверх
borisbn
Дата 20.2.2012, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 11
Всего: 135



Цитата(cambit @  20.2.2012,  17:24 Найти цитируемый пост)
НО! Где в коде "PlaySound"?

смотрел по диагонали... ну, замените этот Beep на MessageBox. Важно узнать, что не отрабатывает - перехват сигналов с порта или реакция на этот перехват.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
cambit
Дата 20.2.2012, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 15.2.2012

Репутация: нет
Всего: нет



М-Да.... Открыл прилагаемый файл com2beep.c в VC++ 6.0 нажал создать .ехе получил 5 ошибок и 5 предупреждений. Вот они:
com2beep.c
D:\Boock\com2beep\com2beep.c(14) : error C2275: 'HANDLE' : illegal use of this type as an expression
        c:\program files\microsoft visual studio\vc98\include\winnt.h(207) : see declaration of 'HANDLE'
D:\Boock\com2beep\com2beep.c(14) : error C2146: syntax error : missing ';' before identifier 'handle'
D:\Boock\com2beep\com2beep.c(14) : error C2065: 'handle' : undeclared identifier
D:\Boock\com2beep\com2beep.c(15) : warning C4047: '=' : 'int ' differs in levels of indirection from 'void *'
D:\Boock\com2beep\com2beep.c(17) : warning C4047: 'return' : 'void *' differs in levels of indirection from 'int '
D:\Boock\com2beep\com2beep.c(90) : error C2275: 'HANDLE' : illegal use of this type as an expression
        c:\program files\microsoft visual studio\vc98\include\winnt.h(207) : see declaration of 'HANDLE'
D:\Boock\com2beep\com2beep.c(90) : error C2146: syntax error : missing ';' before identifier 'handle'
D:\Boock\com2beep\com2beep.c(90) : warning C4047: '=' : 'int ' differs in levels of indirection from 'void *'
D:\Boock\com2beep\com2beep.c(93) : warning C4047: '!=' : 'int ' differs in levels of indirection from 'void *'
D:\Boock\com2beep\com2beep.c(99) : warning C4022: 'Disconnect' : pointer mismatch for actual parameter 1
Error executing cl.exe.

com2beep.exe - 5 error(s), 5 warning(s)

Что-то не так сделал?
Я так полагаю, этот код вставлять нужно в созданный ранее проект?

Это сообщение отредактировал(а) cambit - 20.2.2012, 18:30
PM MAIL   Вверх
t_gran
Дата 20.2.2012, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

Репутация: 33
Всего: 37



Тестируйте. Сам отпишусь только завтра, ибо у нас уже за полночь, а завтра на работу. :-(

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  com2beep.7z 4,40 Kb


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
t_gran
Дата 21.2.2012, 05:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

Репутация: 33
Всего: 37



Всё, можете забирать. Прикрутил я звук и протестировал. У меня работает на УРА.
Код

#include <windows.h>
#include <shlwapi.h>
#include <stdio.h>
#include <stdlib.h>

#define SOUND_NAME "melody.wav"

TCHAR* serviceName = "com2sound";
SERVICE_STATUS serviceStatus;
SERVICE_STATUS_HANDLE serviceStatusHandle = 0;
HANDLE stopServiceEvent = 0;

//----------------------------------------------//
HANDLE Connect(BYTE number)
{
   TCHAR name[16];
   sprintf(name, "\\\\.\\COM%u", number);

   HANDLE handle = CreateFile(name, GENERIC_READ | GENERIC_WRITE, 0, NULL,
                              OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

   return handle;
}
//----------------------------------------------//
void Disconnect(HANDLE handle)
{
   if (handle != INVALID_HANDLE_VALUE)
   {
      CloseHandle(handle);
      handle = INVALID_HANDLE_VALUE;
   }
}
//----------------------------------------------//
void WINAPI ServiceControlHandler(DWORD controlCode)
{
   switch (controlCode)
   {
      case SERVICE_CONTROL_INTERROGATE:
         break;
      case SERVICE_CONTROL_SHUTDOWN:
      case SERVICE_CONTROL_STOP:
         serviceStatus.dwCurrentState = SERVICE_STOP_PENDING;
         SetServiceStatus(serviceStatusHandle, &serviceStatus);
         SetEvent(stopServiceEvent);
         return;
      case SERVICE_CONTROL_PAUSE:
         break;
      case SERVICE_CONTROL_CONTINUE:
         break;
      default:
      {
         break;
      }
   }
   SetServiceStatus(serviceStatusHandle, &serviceStatus);
}
//----------------------------------------------//
void GetSoundName(LPTSTR pszName)
{
   TCHAR path[_MAX_PATH];
   GetModuleFileName(NULL, path, sizeof(path));
   PathRemoveFileSpec(path);
   sprintf(pszName, "%s\\%s", path, SOUND_NAME);
}
//----------------------------------------------//
DWORD WINAPI Sounder(LPVOID lpParameter)
{
   TCHAR sndname[_MAX_PATH];
   GetSoundName(sndname);
   
   DWORD lpEvtMask = 0;
   HANDLE handle = (HANDLE)lpParameter;
   while (WaitForSingleObject(stopServiceEvent, 200) == WAIT_TIMEOUT)
   {
      if (GetCommModemStatus(handle, &lpEvtMask) && lpEvtMask)
      {
         PlaySound(sndname, NULL, SND_SYNC | SND_FILENAME);
      }
   }
   return 0;
}
//----------------------------------------------//
void WINAPI ServiceMain(DWORD argc, TCHAR* argv[])
{
   serviceStatus.dwServiceType = SERVICE_WIN32;
   serviceStatus.dwCurrentState = SERVICE_STOPPED;
   serviceStatus.dwControlsAccepted = 0;
   serviceStatus.dwWin32ExitCode = NO_ERROR;
   serviceStatus.dwServiceSpecificExitCode = NO_ERROR;
   serviceStatus.dwCheckPoint = 0;
   serviceStatus.dwWaitHint = 0;
   serviceStatusHandle = RegisterServiceCtrlHandler(serviceName, ServiceControlHandler);
   if (serviceStatusHandle == 0)
   {
      return;
   }
   serviceStatus.dwCurrentState = SERVICE_START_PENDING;
   SetServiceStatus(serviceStatusHandle, &serviceStatus);
   stopServiceEvent = CreateEvent(0, FALSE, FALSE, 0);
   serviceStatus.dwControlsAccepted |= (SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN);
   serviceStatus.dwCurrentState = SERVICE_RUNNING;
   SetServiceStatus(serviceStatusHandle, &serviceStatus);

   HANDLE handle = Connect(1);

   if (handle != INVALID_HANDLE_VALUE)
   {
      CreateThread(0, 0, (LPTHREAD_START_ROUTINE)Sounder, (LPVOID)handle, 0, 0);
      WaitForSingleObject(stopServiceEvent, INFINITE);
   }
   Disconnect(handle);

   serviceStatus.dwCurrentState = SERVICE_STOP_PENDING;
   SetServiceStatus(serviceStatusHandle, &serviceStatus);
   CloseHandle(stopServiceEvent);
   stopServiceEvent = 0;
   serviceStatus.dwControlsAccepted &= ~(SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN);
   serviceStatus.dwCurrentState = SERVICE_STOPPED;
   SetServiceStatus(serviceStatusHandle, &serviceStatus);
}
//----------------------------------------------//
void RunService()
{
   SERVICE_TABLE_ENTRY serviceTable[] =  {{serviceName, ServiceMain},
                                          { 0, 0 }};
   StartServiceCtrlDispatcher(serviceTable);
}
//----------------------------------------------//
void InstallService()
{
   SC_HANDLE serviceControlManager = OpenSCManager(0, 0, SC_MANAGER_CREATE_SERVICE);
   if (serviceControlManager)
   {
      TCHAR path[_MAX_PATH + 1];
      if (GetModuleFileName(0, path, sizeof(path) / sizeof(path[0])) > 0)
      {
         SC_HANDLE service = CreateService(serviceControlManager,
                                           serviceName, serviceName,
                                           SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
                                           SERVICE_AUTO_START, SERVICE_ERROR_IGNORE, path,
                                           0, 0, 0, 0, 0);
         if (service)
         {
            CloseServiceHandle(service);
         }
      }
      CloseServiceHandle(serviceControlManager);
   }
}
//----------------------------------------------//
void UninstallService()
{
   SC_HANDLE serviceControlManager = OpenSCManager(0, 0, SC_MANAGER_CONNECT);
   if (serviceControlManager)
   {
      SC_HANDLE service = OpenService(serviceControlManager,
                                      serviceName, SERVICE_QUERY_STATUS | DELETE);
      if (service)
      {
         SERVICE_STATUS serviceStatus;
         if (QueryServiceStatus(service, &serviceStatus))
         {
            if (serviceStatus.dwCurrentState == SERVICE_STOPPED)
            {
               DeleteService(service);
            }
         }
         CloseServiceHandle(service);
      }
      CloseServiceHandle(serviceControlManager);
   }
}
//----------------------------------------------//
int main(int argc, char** argv)
{
   if (argc > 1 && strcmp(argv[1], "install") == 0)
   {
      InstallService();
   }
   else if (argc > 1 && strcmp(argv[1], "uninstall") == 0)
   {
      UninstallService();
   }
   else
   {
      RunService();
   }
   return 0;
}

Как протестируете, отпишитесь.

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  com2sound.7z 88,03 Kb


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
cambit
Дата 27.2.2012, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 15.2.2012

Репутация: нет
Всего: нет



Извините, господа, некоторое время отсутствовал. Прогу попробовал - работает на УРА! Спасибо огромное!!!!     
И даже не надо делать защиту от дребезга контактов - прога ждет окончания воспроизведения файла. А вот дальше  - снова воспроизводит тот же файл по кругу, пока не отпущу кнопку. А надо бы чтобы один раз - и все... Что и, главное, куда дописать?

Это сообщение отредактировал(а) cambit - 27.2.2012, 17:55
PM MAIL   Вверх
t_gran
Дата 28.2.2012, 04:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

Репутация: 33
Всего: 37



Цитата

А надо бы чтобы один раз - и все...

Не вопрос, сделаем. Только уточните, мелодия должна полностью проиграть, или играть до тех пор, пока кнопка нажата? 


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
cambit
Дата 5.3.2012, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 15.2.2012

Репутация: нет
Всего: нет



Вы имеете ввиду, если кнопка отпущена раньше? До конца файла, конечно.

Это сообщение отредактировал(а) cambit - 5.3.2012, 10:47
PM MAIL   Вверх
t_gran
Дата 5.3.2012, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

Репутация: 33
Всего: 37



cambit, забирайте. Не забудьте пометить тему как решённую.


Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  archive.7z 87,05 Kb


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
cambit
Дата 5.3.2012, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 15.2.2012

Репутация: нет
Всего: нет



Упс... извините. Инсталирую службу, захожу в администрирование - службы, пытаюсь стартовать службу - стартует и сразу останавливается, т.к. говорит "... нечего делать..." Все предыдущие запускались нормально...
PM MAIL   Вверх
t_gran
Дата 5.3.2012, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

Репутация: 33
Всего: 37



cambit, прошу меня извинить. Т.к. у меня нет физически подключенного устройства, я использовал для тестирования эмулятор, ну и скомпилировал программу с ориентацией на 10-ый com-порт.   Можете посмотреть, в исходниках там видно. Ну вот, исправленная версия.


Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  com2sound.7z 87,05 Kb


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
cambit
Дата 13.3.2012, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 15.2.2012

Репутация: нет
Всего: нет



Cпасибо, Уважаемый ! Все работает. Благодарю за помощь!!!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0713 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.