MicroCHIP.RU
Главная Документация Отладочные средства Справочник Поиск Ссылки
 Новости   Конференция   Контакты 
 

Delphi & Com port

 Нoвaя темa  |  Наверх  |  Перейти к теме  |  Поиск  |  Правила  |  Вход 

ВНИМАНИЕ!
Вы просматриваете архив форума.

Этот форум работает только в режиме просмотра и поиска.

Действующий форум переведен на новый движок и
находится по адресу www.microchip.su

 Delphi & Com port
Автор: DmitryV. ()
Дата:   26/04/2004 14:45

Может и не по адресу. Вопрос скорее к программистам. Помогите, пожалуйста! Надо получить данные с
сом порта. Полазил по инету - понял: надо на API функциях писать, примеров накачал и попытался..
.;( Ерунда какая то получается, а информации мало;(, справка - аглицкая. Теперь решил компонент
ы разные поюзать. А вообще вопрос такой: как мне получить данные в формате простой последовательн
ости бит, а то читаются данные в формате char. Ситуация такая: подключено устройство к порту -
контакт DCD(1 нога), надо чтобы постоянно на RTS была 1 (конструктивно). Считываем со скоростью
38400б/с данные в формате "011010", по мере прихода этих данных на порт. Как их считать? Помог
ите кто чем может,а то уже совсем замучился 8-(.


 
 Вообще-то я делал это в C++ Builder.
Автор: Bill ()
Дата:   26/04/2004 15:04

Но функции одни и те же.
	strcpy(PortName, (PortRadioGrp->Items->Strings[PortRadioGrp->ItemIndex]).c_str());
	if (PortHandle != NULL)
		{
		SetCommState(PortHandle, &SaveDCB);
		CloseHandle(PortHandle);
		}
	if ((PortHandle = CreateFile(PortName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
NULL)) == INVALID_HANDLE_VALUE)
		{
		MMSave->Enabled	= false;
		ErrorMsg("Нет доступа к порту " + AnsiString(PortName));
		return;
		}
	GetCommState(PortHandle, &PortDCB);
	if (SaveDCB.DCBlength == 0)
		SaveDCB	= PortDCB;
//
// Setup hardware interface
//
	PortDCB.fDtrControl	= DTR_CONTROL_DISABLE;
	PortDCB.BaudRate	= CBR_2400;
	PortDCB.StopBits	= ONESTOPBIT;
	PortDCB.ByteSize	= 8;
	PortDCB.Parity		= NOPARITY;
	PortDCB.fParity		=
	PortDCB.fDsrSensitivity	=
	PortDCB.fInX		=
	PortDCB.fAbortOnError	=
	PortDCB.fNull		= false;
	PortDCB.EvtChar		= 'Z';
	SetCommState(PortHandle, &PortDCB);
//
//	Set timeouts
//
	PortTimeouts.ReadIntervalTimeout		= 50;
	PortTimeouts.ReadTotalTimeoutMultiplier		=
	PortTimeouts.ReadTotalTimeoutConstant		= 0;
	PortTimeouts.WriteTotalTimeoutMultiplier	=
	PortTimeouts.WriteTotalTimeoutConstant		= 0;
	SetCommTimeouts(PortHandle, &PortTimeouts);
	SetupComm(PortHandle, 32, 32);		// Setup communication buffers size
	SetCommMask(PortHandle, EV_RXFLAG);

И функция чтения из порта
//
// Read the data block from the communication port
//
static bool GetBlock(void)
	{
	BOOL result;
	DWORD numRead;

	result = ReadFile(PortHandle, PortData, 16, &numRead, NULL);
	return result && numRead == 16;
	}




 
 Ну мож вопрос не по COM port ;)
Автор: patton ()
Дата:   26/04/2004 15:05

чем чар-то не устраивает например char v = '3' == 0x30 == 0x00110000( правда винда не знаю как
в битовом виде понимает ). В чём проблем?


 
 Может и не по сом;). Поэтому и по Delphi
Автор: DmitryV. ()
Дата:   26/04/2004 15:19

Понимаю, что char можно и побитно разложить, но как винда их понимает. Какой формат? Еще старт-б
иты, стоп-биты, четность всякая... ужас. А мне всё это не надо, мне бы только битики получить, и
ладно. На API функциях писать - сложно как то, да и ошибок кучу наделаешь. Мне с порта нужны тол
ько биты. Эх, ну и задачка...


 
 Всё проще
Автор: patton ()
Дата:   26/04/2004 15:27

то что Вы считаете с порта это и будет Ваш байт, никаких стартов и стопов Вы с него не
получите, это всё аппаратно, компонет вернёт готовый к употреблению чар те байт


 
 Вот ещё глядим что же за строка там нужна
Автор: patton ()
Дата:   26/04/2004 15:34

http://www.microchip.ru/phorum/read.php?f=2&i=50033&t=50006#reply_50033
но конечно грамотно если то надо эти строки по-другом перебирать, но здесь прокатит и так, это
если надо на все случаи жизни, всех возможных скажем под 9х 256-и портов.


 
 Re: Delphi & Com port
Автор: DmitryV. ()
Дата:   26/04/2004 15:36

Спасибо, но можно ли, не мучаясь особо, переводя char в биты, получать сразу битики. Комп то име
нно ими и получает.


 
 пусть тебя не волнует что комп получает, не ищи проблем где их нет
Автор: patton ()
Дата:   26/04/2004 15:39

тебе будет готовый байт очищенный от шелухи старта и стопа


 
 www.RS232.ru
Автор: Troll ()
Дата:   26/04/2004 16:30

Там компоненты есть СОМ-портовые и RS232 Pro оттуда же рекомендую


 
 Re: Delphi & Com port
Автор: DmitryV. ()
Дата:   27/04/2004 09:31

Всем спасибо. Вопрос можно считать закрытым. Дальше надо мучить программистов:).
Хотя нет. Когда читаем из порта, то с какой ноги компьютер ждет информации - с DCD или с другой
какой, если второй вариант (худший), то как его направить на путь истиный?


 
 Немного непонятен вопрос.
Автор: Bill ()
Дата:   27/04/2004 10:05

Вообще-то, обмен данными через COM порт осуществляется по линиям RxD и TxD. Но для облегчения
установления связи могут мспользоваться дополнительные сигналы: RTS, DTS и т.д. И посмотрите по
ссылке, которую Вам дали. Там есть обстоятельная статья, которая даст Вам ответы на многие,
интересующие Вас, вопросы.
http://www.rs232.ru/doc002.html


 
 Re: Delphi & Com port
Автор: remix ()
Дата:   27/04/2004 22:58

Есть готовый компонент для работы с портом из дельфи. Прислать?
Работать с ним так:
ComDriver.BaudRate := 19200;
ComDriver.OnReceiveData := GetComData;// Процедура обработки принятых данных
ComDriver.Parity := pNone;
ComDriver.ByteSize := sz_8;
ComDriver.ClearTxBuffer;
ComDriver.ClearRxBuffer;
ComDriver.StopBits := sb1_0;
result:=ComDriver.StartComm; // открыть порт
ComDriver.WriteCommData(PChar(s),length(msg));
ComDriver.StopComm;// Закрыть порт

Если надо, пиши на rremix@mail.ru
ИМХО, проще не бывает :

Вечные тормоза и закон равновесия позволяют надеются на изобретение вечного двигателя...