Интернет-магазин

Просмотр корзины
В корзине:

товаров - 0 шт.



§ 27. Программа для выполнения звонка по указанному номеру.

Дмитрий Иванов, Январь 2007
Статья впервые опубликованна 14 Мая 2014

Файлы к статье скачать

Итак, продолжаем. Настало время перейти от HyperTerminal`a к нашей собственной программе, ведь именно такой способ управления телефоном Вас, наверное, и интересует. Давайте напишем Windows приложение в MFC в Microsoft Viual C++ 6.0. Конечно, в качестве примера гораздо удобнее писать консольные приложения - минимум лишнего кода, все понятно и прозрачно в отличие от MFC, но переодически некоторые читатели удивляются, почему приложения консольные и спрашивают, нельзя ли что-нибудь под Windows.


Далее, наверное, я уже многим надоел, что подробно рассказываю, как поместить edit-окошко на форму диалога или как создать обработчик на нажатие кнопки. Поэтому, в статьях этого цикла проекты программ можно будет скачать готовыми, а в статье я буду рассказывать только по работе кода. Поэтому, скачиваем файлы к этой стаье и запускаем расположенный там проект программы. Внешне окно программы виглядит так:

Принцип работы с ней следующий: в 1-ое edit-окошко вводится номер COM порта, к которому подключен телефон. Нажимается кнопка Open Port, при этом, я думаю, понятно что происходит. Если порт открыт успешно, во 2-ое edit-окошко вводится номер телефона, на который нужно позвонить и нажимается кнопка Zvonok. Вот такое вот простенькое, но очень занятное приложение. Теперь давайте посмотрим, а что же там происходит в нутри.

Сначала, некоторая подготовительная работа. В описании класса диалога надо добавить переменную m_hFile, в которую будет помщен handle на открытый порт. Далее, с помощью ClassWizard`a надо создать две переменные для edit-окошек: m_COMport типа int для 1-го и m_TelNumber типа CString для 2-го.

class CTelefonDlg : public CDialog
{
// Construction
public:
	CTelefonDlg(CWnd* pParent = NULL);	// standard constructor
	HANDLE m_hFile;

Подготовительная работа сделана. Займемся обработчиками кнопок. Первым посмотрим обработчик кнопки для открытия порта OnOpenPort(). С помощью вызова функции UpdateData() с параметром true содержимое из edit-окошек перекочевывает в переменные, ассоциированные с ними. sprintf() формирует полное название порта, ведь в 1-ом окошке мы вводим только номер порта, а нужно еще слово COM. В добавок, еще необходим префикс \\\\.\\. Его наличие просто необходимо, если номер порта превышает 10. Вызов CreateFile() открывает порт. Если открытие прошло успешно, проводится настройка порта с выдачей информации об успешности открытия.

void CTelefonDlg::OnOpenPort() 
{
	// TODO: Add your control notification handler code here
	UpdateData(true);
	
	char COM_string[100];
	DCB dcb;	
	
	sprintf(COM_string,"\\\\.\\COM%d", m_COMport);	
	m_hFile = CreateFile(COM_string, GENERIC_READ|GENERIC_WRITE, 0, NULL,
	    OPEN_EXISTING, 0,NULL);

	if(m_hFile!=INVALID_HANDLE_VALUE)
	{	
		GetCommState(m_hFile, &dcb);

		dcb.BaudRate = CBR_9600;      
		dcb.ByteSize = 8;            
		dcb.Parity = NOPARITY;        
		dcb.StopBits = ONESTOPBIT;    

		COMMTIMEOUTS CommTimeOuts;
		CommTimeOuts.ReadIntervalTimeout=MAXDWORD;
		CommTimeOuts.ReadTotalTimeoutMultiplier=0;
		CommTimeOuts.ReadTotalTimeoutConstant=0;
		CommTimeOuts.WriteTotalTimeoutMultiplier=0;
		CommTimeOuts.WriteTotalTimeoutConstant=1000;
		SetCommTimeouts(m_hFile, &CommTimeOuts) ;

		SetCommState(m_hFile, &dcb);
		MessageBox("Порт успешно открыт", "Info", MB_ICONINFORMATION);
	}
	else 
	{
		MessageBox("Ошибка! Порт не открыт.", "Info", MB_ICONERROR);
	}	
}

После того как порт открыт, можно делать звонки. Смотрим обработчик второй кнопки. Опять идет UpdateData. Затем формируется полная строка команды для выполнения звонка. Ее полный вид следующий: ATD[Номер телефона];\r\n, где \r\n - специальные символы возрата каретки и перехода на новую строку (так по протоколу положено). После того как команда сформирована, ее надо послать в порт, но функция WriteFile() для отправки данных в порт не понимает что такое CString, она уважает только char*. Тут придется немного "похимичить" и с помощью вызова функции GetBuffer() класса CString "скопировать" содержимое буфера строки s1 в переменную pBuffer. После этого WriteFile() отправит в телефон сформированную команду и он (сотовый) начнет набор номера, введенного во 2-ое edit-окошко.

void CTelefonDlg::OnZvonok() 
{
	// TODO: Add your control notification handler code here
	UpdateData(true);
	CString s1;
	s1="ATD";
	s1+=m_TelNumber;
	s1+=";\r\n";

	char* pBuffer = s1.GetBuffer(20);
	
	DWORD lpdwBytesWritten;
	WriteFile(m_hFile, pBuffer, strlen(pBuffer), &lpdwBytesWritten, NULL);	
	s1.ReleaseBuffer();
}


© Дмитрий Иванов
Январь 2007
http://www.kernelchip.ru



© KERNELCHIP 2006 - 2017