Отличия в работе с ком портом в PC и PPC

Средства разработки, технические вопросы, отвечает (по мере сил) Отдел Разработок
Закрыто
Евгений_С
Новенький (0 lvl)
Сообщения: 12
Зарегистрирован: Сб июн 28, 2003 14:03

Отличия в работе с ком портом в PC и PPC

Сообщение Евгений_С » Ср июл 09, 2003 18:13

Добрый день.
Собственно сабж.
Дело в том, что у меня есть некое устройство, с которого надо считать данные на PPC. Я написал класс для работы с этим устройством(на EVC), но проблема в том, что если я через этот класс работаю на ПК (программа скомпилированна на VC++ 6.0), то все работает нормально, а вот после компиляции на EVC ничего не работает...

Таймауты и структуру DCB вроде устанавливаю коректно, но увы

Может у PPC есть какие нибуть особенности (за исключением отсутствия асихронного чтения/записи) ?

Вот куски кода установки параметров порта

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

bool CComPort::Connect()
{
	if (Connected()) return true;
	m_hPort = CreateFile(m_PortName,GENERIC_READ|GENERIC_WRITE,0,0,
		                OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
	if (Connected()) 
	{
		COMMTIMEOUTS tm;
		tm.ReadIntervalTimeout=1;
		tm.ReadTotalTimeoutConstant=1;
		tm.ReadTotalTimeoutMultiplier=1;
		tm.WriteTotalTimeoutConstant=10;
		tm.WriteTotalTimeoutMultiplier=0;
		if (SetCommTimeouts(m_hPort,&tm))
			return true;
		else
			Disconnect();
	}
	return false;
}

bool CComPort::SetDCB(DCB & dcb)
{
	return (Connected() && SetCommState(m_hPort,&dcb));
}

// Multical - наследник CComPort

bool Multical::SetReadParams()
{
	if (!Connected()) return false;
	DCB dcb;
	ZeroMemory(&dcb,sizeof(DCB));
	dcb.ByteSize = 7;
	dcb.DCBlength=sizeof(DCB);
	dcb.fBinary=true;
	dcb.fParity=true;
	dcb.Parity=EVENPARITY;
	dcb.fRtsControl=RTS_CONTROL_ENABLE;
	dcb.StopBits=TWOSTOPBITS;
	dcb.fDtrControl=DTR_CONTROL_ENABLE;	
	dcb.BaudRate = 1200;
	return SetDCB(dcb);
}
Примечание: таймауты такие маленькие потому что я в цикле читаю

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

int CComPort::ReadData(void * buf, int len)
{
	char * ch = (char *)buf;
	if (!Connected()||(len<0))
		return -1;
	DWORD t = GetTickCount(), Readed = 0;
    DWORD NotReaded=(DWORD)len;
	while ((GetTickCount() - t) < (DWORD)m_InputTimeout) 
	{
		ReadFile(m_hPort,ch,NotReaded,&Readed,0);
		if (Readed!=0)
		{
			ch=ch+Readed;
			NotReaded=NotReaded-Readed;
			if (NotReaded==0) return len;
			t=GetTickCount();
		}
	}
	return (len-NotReaded);
}
ЗЫ PPC - это MITAC MIO 338
Как бы не было плохо, всегда может стать еще хуже

Theta
Доктор (4 lvl)
Сообщения: 255
Зарегистрирован: Ср июн 04, 2003 15:03

Сообщение Theta » Ср июл 09, 2003 20:30

Попробуй по каждому поводу выводить окошко с ключевой информацией. Может быть найдёшь, что какие-то вещи не удалось проинициализировать. Попробуй создать лог (в файл) с трассировкой. Что конкретно не работает?
\Theta

Евгений_С
Новенький (0 lvl)
Сообщения: 12
Зарегистрирован: Сб июн 28, 2003 14:03

Сообщение Евгений_С » Ср июл 09, 2003 21:54

Нет, все функции работают, запрос устройству отправляется просто оно(устройство) не отвечает и все...
Как бы не было плохо, всегда может стать еще хуже

Theta
Доктор (4 lvl)
Сообщения: 255
Зарегистрирован: Ср июн 04, 2003 15:03

Сообщение Theta » Чт июл 10, 2003 12:50

Евгений_С писал(а):Нет, все функции работают, запрос устройству отправляется просто оно(устройство) не отвечает и все...
Тогда можно подключить КПК к обычному компу и запустить на нём терминалку. Возможно просто провод не подходящий.
\Theta

Евгений_С
Новенький (0 lvl)
Сообщения: 12
Зарегистрирован: Сб июн 28, 2003 14:03

Сообщение Евгений_С » Чт июл 10, 2003 21:46

С проводом все в порядке, через него с другого устройства все нормально считывается...
В принципе, сначало грешили на питание. Там на конце провода оптоголовка висит, которая некий ток с PPC потребляет, но через эту же оптоголовку с другого устройства все читается

Да, "другое устройство" - это устройство друго типа, хотя и очень похожего на проблемное устройство..
Как бы не было плохо, всегда может стать еще хуже

Евгений_С
Новенький (0 lvl)
Сообщения: 12
Зарегистрирован: Сб июн 28, 2003 14:03

Сообщение Евгений_С » Ср июл 30, 2003 21:21

проблема решена.
Если кому интресно(чем черт не шутит ;-)), дело было в аппаратной проблемме.. Как известно сом порт имеет напряжние для лог. нуля +3-+12В для лог единице -3 - -12В. Но это в теории, но приктике у нас всегда считали что напряжние на порте -12 - +12В и все всегда работало , но это на десктопе.. А вот КПК как оказалость выдают только 6В.. У нас этого напряжения нехватало чтобы отпереть какой то там диод, ну и в результате нефига не работало...
Так что разработчики устройств - будте внимательны!!!! :-)
Как бы не было плохо, всегда может стать еще хуже

Закрыто

Вернуться в «Программирование для КПК»