реклама на сайте
подробности

 
 
> Работа с COM-портом
CSB
сообщение Feb 2 2007, 17:11
Сообщение #1


Частый гость
**

Группа: Новичок
Сообщений: 100
Регистрация: 9-03-06
Пользователь №: 15 088



Тема не раз поднималась, но все таки остались вопросы.
Есть датчик, который посылает на ПК некие промежуточные результаты. На ПК все нормально принимается и обсчитывется конечный результат. Пакеты по 8 байт. Скорость UART 115200 kbps. Использую ReadFile() и CPort ( В CPort тоже используется ReadFile() ). Но как только частота передачи возрастает до 1000 посылок в секунду, то в винде начинатся проблемы: приходят неполные пакеты, часто приходит только заголовок пакета, а остальная часть нули или заголовок может оказаться в середине пакета. Увеличение приемного буфера в винде не решило проблемы. При отключении графики и прочего пакеты иногда принимаются нормально. Но без отображения результатов никак.

ЗЫ
В Terminal все принимается нормально - там есть возможность записать в лог принимаемые байты.
Пробовал DLPortIО, но так и не понял как подружить COM с этим драйвером.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
immelstorm
сообщение Feb 4 2007, 22:45
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 24
Регистрация: 8-10-06
Пользователь №: 21 094



В принципе, можно попробовать работать с портом напрямую.
Я писал прогу, работающую как цифровой осциллограф, у меня получились следующие результаты:

Погрешность измерения временных интервалов:
На частоте до 1 кГц: не более 1%;
На частоте 1-10 кГц: не более 10%;
На частоте 10-50 кГц: не более 50%;

Вот кусок кода, отвечающий за доступ к порту:

//Маска битов для определения линии запуска
WaitMask:=$0;
if CTS_Start.Checked then WaitMask:=WaitMask or $10;
if DSR_Start.Checked then WaitMask:=WaitMask or $20;
if RI_Start.Checked then WaitMask:=WaitMask or $40;
if DCD_Start.Checked then WaitMask:=WaitMask or $80;

//Настройка порта
with SPort do begin
OpenDriver;
WriteByte(Base+3,$83);
WriteWord(Base,$0001);
WriteByte(Base+3,$3);
end;

HoldByte:=0;
WR:=SPort.ReadByte(Base+4);
SPort.WriteByte(Base+4,WR and $FC);
if HoldRTS.Checked then HoldByte:=HoldByte or $02;
if HoldDTR.Checked then HoldByte:=HoldByte or $01;

//Зарядка конденсатора, ожидание переходных процессов.
StartTimer.Enabled:=true;
While StartTimer.Enabled and (Aborted = false) do begin
//Держать сигналы
WR:=SPort.ReadByte(Base+4);
SPort.WriteByte(Base+4,WR or HoldByte);
Application.ProcessMessages;
end;

//Ожидание первого импульса.
D:=SPort.ReadByte(Base+6) and WaitMask;
//D1:=D and WaitMask;

repeat
Application.ProcessMessages;

WR:=SPort.ReadByte(Base+4);
SPort.WriteByte(Base+4,WR or HoldByte);

D1:=SPort.ReadByte(Base+6);
D1:=D1 and WaitMask;
until (D<>D1) or Aborted;

//Байт для удержания RTS и/или DTR
WR:=SPort.ReadByte(Base+4);
SPort.WriteByte(Base+4,WR or $02);

//Включение таймеров
HighResTimer1.Enabled:=true;
HighResTimer1.StartTimeMeasure;
STime:=GetTickCount;

while ((GetTickCount-STime)<MeasureTime) and (not Aborted) do begin
//RTS / DTR
SPort.WriteByte(Base+4,WR);
//Сигналы
D:=SPort.ReadByte(Base+6);
if D<>D1 then begin
HighResTimer1.StopTimeMeasure;
Time:=HighResTimer1.GetTimeDifference;
HighResTimer1.StartTimeMeasure;
SetLength(Data, I+1);
Data[I,0]:=Time+Data[I-1,0];
Data[I,1]:=D;
D1:=D;
Inc(I);
end;
end;

EndTime:=GetTickCount;

HighResTimer1.StopTimeMeasure;


Разумеется, нужно знать спецификации UART.
Сразу предупреждаю: в windows работа с железками в реальном времени возможна только из RING 0. Всё остальное - разные степени приближения.


--------------------
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- CSB   Работа с COM-портом   Feb 2 2007, 17:11
- - beer_warrior   А каким образом вызывается ReadFile()? По событию,...   Feb 3 2007, 00:37
- - CSB   В потоке   Feb 3 2007, 02:28
- - beer_warrior   А portmonом его? Такое впечетление, что принимаетс...   Feb 3 2007, 04:07
- - CSB   Дык, я ж говорю, что терминальной программой все н...   Feb 3 2007, 12:24
- - lolikandr   ReadFile() вызывается в отдельном потоке по какому...   Feb 3 2007, 12:45
- - CSB   Сегодня выяснилось, что и в Terminal приходят обры...   Feb 3 2007, 16:05
|- - Andrew2000   Цитата(CSB @ Feb 3 2007, 16:05) Попробую ...   Feb 3 2007, 22:25
- - _Sam_   Может в паузе между байтами или пакетами?   Feb 3 2007, 22:38
- - CSB   ЦитатаСкорость чего? Ваши 8 байт раз в 1мс только ...   Feb 4 2007, 00:43
|- - Andrew2000   Цитата(CSB @ Feb 4 2007, 00:43) Скорость ...   Feb 4 2007, 01:33
- - CSB   ЦитатаМожет в паузе между байтами или пакетами? Не...   Feb 4 2007, 00:53
- - CSB   ЦитатаБит? т.е. без контроля - тока старт и стоп. ...   Feb 4 2007, 12:13
- - _Sam_   С байтами понятно вы их не затираете. Между пакета...   Feb 4 2007, 16:03
- - CSB   Пакет обрамлен стартовыми и оконечными байтами (пр...   Feb 4 2007, 18:24
- - _Sam_   ЦитатаПакет обрамлен стартовыми и оконечными байта...   Feb 5 2007, 23:53
- - CSB   Байт стаффинг не используется: пакет-то обрамлен с...   Feb 6 2007, 09:32
- - lolikandr   Была такая же бага (потери кусков данных), когда ч...   Feb 6 2007, 09:52
- - Joy   Цитата(CSB @ Feb 2 2007, 16:11) Тема не р...   Feb 6 2007, 10:44
- - CSB   Цитататерминальной программой все нормально приним...   Feb 6 2007, 16:25
- - _Sam_   ЦитатаТут на форуме читал, что ReadFile() весьма м...   Feb 6 2007, 20:39
- - AndrewKirs   По-моему, надо использовать асинхронный режим IO (...   Feb 9 2007, 17:41
- - Georgy   А ни слова про длительность и амплитуду импульсов....   Feb 23 2007, 02:08
- - amw   Убедится в наличии паузы по сигналу Rx между пакет...   Feb 26 2007, 19:15


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 23:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.02529 секунд с 7
ELECTRONIX ©2004-2016