Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > соединение компов через модемы


Автор: KKNull 30.1.2006, 07:53
Здравтвуйте уважаемые программисты.
Можно попросить у вас помощи. smile
Мне дано задание которое заключается в следующем:

"Необходимо соединить два модема телефонных кабелем и написать программу-терминал для работы с аналоговым модемом (взаимодействие с модемом реализовать, напрямую, через COM порт). В программе реализовать передачу файла с одного компьютера на другой (в Windows), для контрольной суммы кадра использовать CRC 32, так же должно быть реализована функция чата. В программе предусмотреть возможность выбора COM порта. Модемы считать Hayes-совместимые. Пример программы реализующие данные функци – HyperTerminal"
То есть по сути реализовать свой HyperTerminal.
Эту программу необходимо реализовать в Visual Studio 6.0.(VC++6.0)
Даже не знаю с чего начать. Опыта работы с VC++ у меня нет.
Я просмотрел некоторые примеры работы с com портом- smile ужас- столько настроек, ничего не понять.
Если есть готовые программы с исходниками, прошу дать сцылку. smile б а также любые примеры работы с модемами(Windows VC++) будут очень полезны.

Автор: chaos 30.1.2006, 08:41
поищи книгу
Фролов А., Фролов Г. Программирование модемов (Библиотека системного программиста. Том 4)

Автор: takedo 30.1.2006, 12:03
chaosKKNull Вдруг найдете ссылку, поделитесь адресочком?

Автор: Dreamer_0x01 30.1.2006, 12:40
Цитата(KKNull @ 30.1.2006, 07:53 Найти цитируемый пост)

Я просмотрел некоторые примеры работы с com портом-  ужас- столько настроек, ничего не понять.


А что конкретно по настройкам не понятно? Может быть, я чем-то смогу помочь?
Кое-какой опыт работы с портами есть.

Автор: chaos 30.1.2006, 13:56
вот госопда пользуйтесь!!! smile
http://xammep.nm.ru/doc/bsp/index.html
Добавлено @ 13:58
да кстати KKNull глянь еще 16 том

Автор: KKNull 30.1.2006, 16:32
Эти книги я уже смотрел.
только функция открытия порта OpenComm в VC++ неработает
компилятор говорит что эта ф-ция не определена.
может какую библиотеку подключить нада?
P.S.
to Dreamer_0x01 опыта работы с портами у меня, к сожалению,нет

Автор: Dreamer_0x01 30.1.2006, 18:52
Что тебе нужно? Открыть порт, настроить скорость и послать туда что-то, а потом дождаться получения?

Автор: KKNull 31.1.2006, 14:52
Я тут набросал такой код, который посылает команды модему и принимает их:
#include "stdafx.h"
#include "afxwin.h"
#include "windows.h"
#include "stdio.h"
#include "string.h"
#include "conio.h"

void main()
{
HANDLE hCOM = CreateFile(
"COM2",
GENERIC_WRITE | GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
0,
NULL);

DCB dcb;//Инициализация порта

GetCommState(hCOM, &dcb);//Получаем настройки порта

//Меняем часть настроек на свои
dcb.BaudRate = 2400; //Скорости в бодах
dcb.ByteSize = 8; //Байты информации
dcb.Parity = NOPARITY; //Четность
dcb.StopBits = ONESTOPBIT; //Кол-во стоп. битов

SetCommState(hCOM, &dcb); //Устанавливаем новые настройки

COMMTIMEOUTS CommTimeouts;
GetCommTimeouts(hCOM,&CommTimeouts);

CommTimeouts.ReadIntervalTimeout = 50;
CommTimeouts.ReadTotalTimeoutMultiplier = 1;
CommTimeouts.ReadTotalTimeoutConstant = 50;
CommTimeouts.WriteTotalTimeoutMultiplier = 1;
CommTimeouts.WriteTotalTimeoutConstant = 50;
SetCommTimeouts(hCOM,&CommTimeouts);

FlushFileBuffers(hCOM); //Очистка буфера

if( hCOM!=INVALID_HANDLE_VALUE )
{
printf( "Ok Open COM1\n" );
// char buffer[25];
// memset( buffer, 0, sizeof( buffer ) );
// strcpy( buffer, "ATE1" );

char rec[400];
char answer[512];
DWORD iBytesRead;
OVERLAPPED ov;

char buff[10];

while(1)
{
printf("To exit press - 1\n");
scanf("%s", &buff);
if( buff[0] == (int)'1') break;
int g = strlen(buff);
buff[g++] = (char)13;
buff[g] = '\0';

WriteFile( hCOM, (LPVOID)buff, strlen(buff)+1, &iBytesRead, NULL );
Sleep(100);

ReadFile( hCOM, (LPVOID) rec, 512, &iBytesRead, NULL );

for( int i=0; i<(int)iBytesRead; i++) // Веделение ответа модема
{
if( (int)rec[i+1]==10 )
{
int k = i;
for( int j=0; j<((int)iBytesRead-k-2); j++ )
{
answer[j] = rec[i+2];
i++;
}
answer[j] = '\0';
} // if( (int)rec[i+1]==10 )

} // for( int i=0; i<(int)iBytesRead; i++)

printf(answer);
} // wlile
CloseHandle(hCOM);
} // if( hCOM!=INVALID_HANDLE_VALUE )

else printf( "Error Open\n" );
}

Меня интересует, что делать дальше? Как организовать передачу данных,(файл с CRC32) между компьютерами.

Автор: Dreamer_0x01 31.1.2006, 15:39
Я не помню команды модемов,нужно смотреть, как с помощбю них передаются данные друг для друга, но это все должно быть в справочнике по командам модема. А дальше просто - открываешь файл, из него вытаскиваешь порцию символов, вызываешь нужную тебе команду мдема, которая эту последовательность символов отошлет...Ну и то же самое при приеме - опрашиваешь модем командой, выясняющей, есть лиданные для приема, если есть, генерируешь команду приема, выкачиваешь эти символы и сохраняешь в файл.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)