Вверх ↑
Этот топик читают: Гость
Разработчик
Ответов: 26149
Рейтинг: 2127
#16: 2011-05-18 19:47:39 ЛС | профиль | цитата
Леонид писал(а):
а схема принимает максимум 128 байт в секунду, не прочитанные данные вместе с запланированным разделителем уходят в небытиё, отсюда и Ваши неприятности

Да ладно, а куда пропал буфер UART Это же не RealTime драйвер. Все принятые данные лежат в буфере и от скорости чтения никак не зависят. Мне без проблем удавалось читать побайтно на скорости 19200, и никуда ничего не пропадало.
Неужели вы думаете, что на скорости 115200 и выше у вас драйвер успеет обработать информацию от устройства и отдать ее по запросу не имея буфера, вся передача информации и заполнение буфера организована на аппаратном уровне
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#17: 2011-05-18 20:11:46 ЛС | профиль | цитата
Леонид, а если прокомментировать каждую строку ? И подавать 2048 (буфер то SetLength(Buffer,256);)
procedure THICOM._work_doRead;
var
Received: DWORD;
Len:cardinal;
Buffer:string;
begin
len := ToInteger(_Data);
SetLength(Buffer,256);
if hFile <> INVALID_HANDLE_VALUE then
if ReadFile(hFile, Buffer[1], Len, Received, nil) then
begin
SetLength(Buffer,Received);
_hi_OnEvent(_event_onRead,Buffer)
end
else _hi_OnEvent(_event_onRead,string('));
end;
А кто придумал передавать и принимать по одному байту ? Прекрасно хавает строки разной длины.

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 5446
Рейтинг: 323
#18: 2011-05-18 20:29:26 ЛС | профиль | цитата
MagistrTot, логика схемы несколько странная. Я бы делал так:
code_24019.txt

а потом читал всё время 1ю строку StrList-а и удалял её.
[offtop] Жаль, мой компонент StackEx (очередь) не попал в пакет... [/offtop]
карма: 1

0
файлы: 1code_24019.txt [3.5KB] [322]
Разработчик
Ответов: 26149
Рейтинг: 2127
#19: 2011-05-18 21:10:25 ЛС | профиль | цитата
iarspider писал(а):
а потом читал всё время 1ю строку StrList-а и удалял её

Как-то так должен выглядеть компонент на дискретных жлементах

code_24020.txt
карма: 22

0
файлы: 1code_24020.txt [1.1KB] [185]
Ответов: 8926
Рейтинг: 823
#20: 2011-05-18 21:34:03 ЛС | профиль | цитата
nesco писал(а):
Все принятые данные лежат в буфере и от скорости чтения никак не зависят
так и я про то же данные поступают со скоростью, предположим, 600 байт/сек, а считываются со скоростью 120 байт/сек, происходит заполнение буфера до верха и старые не прочитанные данные "переваливаются" через верх и пропадают
карма: 19

0
Разработчик
Ответов: 26149
Рейтинг: 2127
#21: 2011-05-18 21:36:07 ЛС | профиль | цитата
Леонид писал(а):
данные поступают со скоростью, предположим, 600 байт/сек, а считываются со скоростью 120 байт/сек, происходит заполнение буфера до верха и старые не прочитанные данные "переваливаются" через верх и пропадают

Если идут непрерывным потоком, без пауз, то да, будут пропадать
карма: 22

0
Ответов: 10
Рейтинг: 0
#22: 2011-05-18 21:54:20 ЛС | профиль | цитата
Для GPS больше интересны более свежие данные, чем хранящиеся в конце памяти, поэтому на них даже можно не обращать внимания.
карма: 0

0
Ответов: 8926
Рейтинг: 823
#23: 2011-05-18 22:06:09 ЛС | профиль | цитата
MagistrTot, тогда надо обрабатывать строку не по окончанию
MagistrTot писал(а):
<CR><LF>
а искать блок начало--окончание, в этом случае повторов не будет, да их и не будет, если считывать строку бОльшей длины, чем возможно самая длинная передаваемая строка.
карма: 19

0
Ответов: 10
Рейтинг: 0
#24: 2011-05-18 22:18:13 ЛС | профиль | цитата
в моем случае блок начало--окончание будет выглядеть так "$GPRMC или $GPGGA или $GPGSA или $GPGSV,(данные)<CR><LF>"
общее у них будет $GP, т е первые три символа и собственно <CR><LF>. примерная длина самой длиной строки 79 Байт.
карма: 0

0
Ответов: 5446
Рейтинг: 323
#25: 2011-05-18 23:44:33 ЛС | профиль | цитата
nesco писал(а):

Как-то так должен выглядеть компонент на дискретных жлементах

Ага. Только вопрос: зачем там doClear делается при пустой очереди?


С поиском блоков даже проще получается:
code_24022.txt
карма: 1

0
файлы: 1code_24022.txt [3KB] [285]
Разработчик
Ответов: 26149
Рейтинг: 2127
#26: 2011-05-18 23:49:40 ЛС | профиль | цитата
iarspider писал(а):
Только вопрос: зачем там doClear делается при пустой очереди?

А хз, зачем я его туда воткнул (даже не помню, с чем связано), это копия рабочего блока. Не нравится, можно убрать
карма: 22

0
Ответов: 10
Рейтинг: 0
#27: 2011-05-19 18:50:17 ЛС | профиль | цитата
iarspider, твоя схема работает идеально, только мне вот интересно, какую функцию должен выполнять MultiElementEx, я его удалил и с этого же выхода дальше обрабатываю строки.
карма: 0

0
Ответов: 5446
Рейтинг: 323
#28: 2011-05-19 19:21:51 ЛС | профиль | цитата
MagistrTot, это очередь (queue) NMEA-предложений, чтобы разделить приём и обработку. Методом doPop получаешь либо очередную строку на onPop, либо сигнал "очеред пуста" на onEmpty.
карма: 1

0
Ответов: 10
Рейтинг: 0
#29: 2011-05-19 22:45:47 ЛС | профиль | цитата
лично я разделенные строки сортирую по заголовку. Достаточно использовать StrPart и Case, а дальше с помощью MultiStrData полностью раскладываем строки разделяя по запятой, благо что каждый тип данных имеет фиксированный набор переменных.
карма: 0

0
Ответов: 5446
Рейтинг: 323
#30: 2011-05-19 23:32:04 ЛС | профиль | цитата
MagistrTot, тут уж дело хозяйское.
карма: 1

0
30
Сообщение
...
Прикрепленные файлы
(файлы не залиты)