Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Пропадет первый байт при приеме
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Интерфейсы
krik
Пересылаю массивы байт от COM1 в COM2 через нульмодемный кабель на одном компе. Использую прямой доступ к порту -Giveio ( или UserPort) с одной стороны, и терминалка с другой. В обоих случаях при приеме в программке с прямой доступом к порту пропадает самый первый байт на скорости 115кбит. На меньших скоростях-нормально, при приеме одного байта -нормально. Как только переходишь на 115200 -принятый массив начинается со второго байта.
Кто нибудь сталкивался с чем-то подобным?
SFx
а управление потоком какое стоит? все настройки в студи, телепаты в отпуске.
zltigo
Цитата(krik @ Apr 1 2010, 20:52) *
Использую прямой доступ к порту -Giveio ( или UserPort)...

осталось узнать зачем???
XVR
Цитата(zltigo @ Apr 1 2010, 23:33) *
Цитата
Использую прямой доступ к порту -Giveio ( или UserPort)...

осталось узнать зачем???
Видимо, что бы пропадал первый байт rolleyes.gif
krik
Цитата(zltigo @ Apr 1 2010, 23:33) *
осталось узнать зачем???

А затем что обычным образом через функции WINAPI работает медленнее в разы.
zltigo
Цитата(krik @ Apr 2 2010, 18:07) *
А затем что обычным образом через функции WINAPI работает медленнее в разы.

1.Да ну? Не успевает 115200 smile.gif
2.Вообще-то к портам RS232, в отличие от LPT, и так штатно доступ открыт.
3.Еще одно наслоение виде giveio только вносит дополнительное торможение.
ASN
krik
На скорости 115200 при практически постоянном потоке работали сутками. Через стандартный WINAPI не пропадало НИ ОДНОГО байта. А задач на ПК "крутиться" много (одних COM штук 6). Не тормозит.
С Linux через TTY точно такая же ситуация.
krik
Цитата(SFx @ Apr 1 2010, 23:24) *
а управление потоком какое стоит? все настройки в студи, телепаты в отпуске.


// вот и весь кусок. Используется UserPort
double dltt=0;
unsigned char buf[64]={0};
unsigned char*pbuf=buf;
unsigned char*str="HiTerminal!";
int c; int i=0;

// установки СОМ порта
outportb(BRH,0);//запрет прерываний

outportb(LCR,0x80);//bit DLAB=1

outportb(PORT1,0x1);//115200 bit

outportb(BRH,0);//

outportb(LCR,0x03);// 8 бит, 1-стоп, без контроля четности

outportb(FIFO,0);//запрет FIFO

outportb(MCR,0);//запрет modem

//======== ВЫВОД====================//
while (*str!=0)
{
outportb(PORT1,*str++);
do
{c=inportb(PORT1+5)&0x40;}
while(c==0);
}

//======== ВВОД====================//
while(1)
{
while((c=inportb(PORT1+5)&0x01)!=0x01) ;
buf[i]=inportb(PORT1);
i++; //число принятых байт
if ( buf[i-1]==0x30)// символ конца посылки
break;// выход из цикла опроса

}

.............................................
hUserPort = CreateFile("\\\\.\\UserPort", GENERIC_READ, 0, NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
CloseHandle(hUserPort); // Activate the driver
............................................................................
pz = StartUpIoPorts(PORT1, true, hParWind);// hParentWnd); //

...............................................
void outportb(UINT portid, BYTE value)
{
__asm mov edx,portid
__asm mov al,value
__asm out dx,al
}

BYTE inportb(UINT portid)
{
unsigned char value;

__asm mov edx,portid
__asm in al,dx
__asm mov value,al
return value;
}





Цитата(zltigo @ Apr 2 2010, 19:18) *
1.Да ну? Не успевает 115200 smile.gif
2.Вообще-то к портам RS232, в отличие от LPT, и так штатно доступ открыт.
3.Еще одно наслоение виде giveio только вносит дополнительное торможение.


См. например книжку Агурова" Последовательные интерфейсы ПК" стр.207.

Цитата(ASN @ Apr 2 2010, 19:24) *
krik
На скорости 115200 при практически постоянном потоке работали сутками. Через стандартный WINAPI не пропадало НИ ОДНОГО байта. А задач на ПК "крутиться" много (одних COM штук 6). Не тормозит.
С Linux через TTY точно такая же ситуация.


Пропадает то не на WINAPI. С WINAPI просто меделнно. За 100 млсек надо успеть обменяться с 8-9 абонентами.
zltigo
Цитата(krik @ Apr 2 2010, 18:33) *
// вот и ...

Простите, но это чистое безумие sad.gif
AHTOXA
Цитата(krik @ Apr 2 2010, 21:33) *
вот и весь кусок. Используется UserPort


Кошмарsmile.gif Вы отключили FIFO, и надеетесь, что успеете всё принять по опросу? Это Агуров так советует? smile.gif
zltigo
Цитата(AHTOXA @ Apr 2 2010, 18:40) *
Вы отключили FIFO, и надеетесь, что успеете всё принять по опросу?

Да и с FIFO sad.gif принципиально не изменится ничего. Полное отсутствие системного подхода и непонимание даже того простого факта, что дивный цикл опроса в приложении спокойно может быть прерван и на очень долго. Про то, насколько этот тупой опрос ВПУСТУЮ грузит систему тоже у Автора нет представления.
krik
Цитата(AHTOXA @ Apr 2 2010, 19:40) *
Кошмарsmile.gif Вы отключили FIFO, и надеетесь, что успеете всё принять по опросу? Это Агуров так советует? smile.gif


Агуров ничего здесь не советует. А что кроме опроса здесь может быть?
ASN
krik
Если за 100 млсек надо успеть обменяться с 8-9 абонентами , то удобней и проще подключить к ПК специальный коммуникационный контроллер (к примеру на МК), которые собирает данные с удалённых абонентов и пересылает подготовленные результаты в ПК для отображения. Windows так же как и Linux - это не ОСРВ, попытка использования их в этом режиме оборачивается сплошными проблемами.
Как верно заметил zltigo - отсутствие системного подхода (видимо у Вашего руководства).
Разделение задач на сбор информации и отображение сэкономит Вам массу времени и нервов.
AHTOXA
Цитата(zltigo @ Apr 2 2010, 21:58) *
Да и с FIFO sad.gif принципиально не изменится ничего. Полное отсутствие системного подхода и непонимание даже того простого факта, что дивный цикл опроса в приложении спокойно может быть прерван и на очень долго. Про то, насколько этот тупой опрос ВПУСТУЮ грузит систему тоже у Автора нет представления.


FIFO + мультимедийный таймер + реалтайм приоритет процесса - можно добиться приемлемых результатов, почти сравнимых с грамотной работой через WinAPI smile.gif
krik
Цитата(AHTOXA @ Apr 2 2010, 20:57) *
FIFO + мультимедийный таймер + реалтайм приоритет процесса - можно добиться приемлемых результатов, почти сравнимых с грамотной работой через WinAPI smile.gif


FIFO + мультимедийный таймер -поясните если можно.(например как обходиться с FIFO).
AHTOXA
Цитата(krik @ Apr 2 2010, 23:18) *
FIFO + мультимедийный таймер -поясните если можно.(например как обходиться с FIFO).


Про FIFO - читайте там же, где вычитали как его отключать.
Про мультимедийный таймер:
Using Multimedia Timers.
Вот пример (Дельфи):
Код
var
    MmTimer         : MMResult;
    MmTimerInterval : integer;

// эта процедура будет вызываться по мультимедиа таймеру:
procedure MmTimerProc(uTimerID, uMessage: UINT; dwUser, dw1, dw2: DWORD); pascal;far;
begin
    timeKillEvent(CksTimer);  // шлепнем событие
    try
        // делаем что-то полезное (достаём данные из FIFO)
    finally
        // зарядим таймер на следущий раз
        MmTimer:=timeSetEvent(MmTimerInterval,0,@MmTimerProc,0,TIME_ONESHOT)
    end;
end;

// начальный запуск таймера:
procedure StartMMTimer;
var TC: TTimeCaps;
begin
    if timeGetDevCaps(@tc, sizeof(TTIMECAPS)) = TIMERR_NOERROR then
    begin
        MmTimerInterval :=TC.wPeriodMin*3;  // период (обычно wPeriodMin = 1мс, берём втрое больше)
        timeBeginPeriod(MmTimerInterval);
        MmTimer:=timeSetEvent(MmTimerInterval,0,@MmTimerProc,0,TIME_ONESHOT);
        if MmTimer=0 then raise Exception.Create('Can''t start MmTtimer');
    end
    else
        raise Exception.Create('Can''t get MmTimer caps');
end;


Но ещё раз повторюсь, лучше чем грамотно написанное приложение с использованием WinAPI всё равно не выйдет.
krik
Цитата(ASN @ Apr 2 2010, 20:51) *
krik
Если за 100 млсек надо успеть обменяться с 8-9 абонентами , то удобней и проще подключить к ПК специальный коммуникационный контроллер (к примеру на МК), которые собирает данные с удалённых абонентов и пересылает подготовленные результаты в ПК для отображения. Windows так же как и Linux - это не ОСРВ, попытка использования их в этом режиме оборачивается сплошными проблемами.
Как верно заметил zltigo - отсутствие системного подхода (видимо у Вашего руководства).
Разделение задач на сбор информации и отображение сэкономит Вам массу времени и нервов.


ОСРВ-денег стоит, насчет отсутствия системного подхода у нашего руководства- Вы сто раз правы, только это слабое утешение. Отдельный коммуникационный контроллер прицепить не могу- штатный комп в формате PC104-туда не так просто что-то прицепить. Я даже в DOS уйти не могу- отлаживаться с аппаратурой приходится через переходник USB-COM MOXA, который про DOS ничего не знает. Но вообще то я спрашивал про возможные причины пропадания байта.
zltigo
Цитата(krik @ Apr 2 2010, 22:26) *
Но вообще то я спрашивал про возможные причины пропадания байта.

Все изначально задумано делать и сделано через заднепроходное отверстие. Частности не интересны.
Цитата
Я даже в DOS уйти не могу- отлаживаться ...

Совершенно не нужно отлаживать Win программы под DOS.
Цитата
Отдельный коммуникационный контроллер прицепить не могу- штатный комп в формате PC104-туда не так просто что-то прицепить.

Вот вместо этой самой
Цитата
переходник USB-COM MOXA

и цепляете.
Цитата
ОСРВ-денег стоит,

Если действительно, в чем я совершенно не уверен, обслуживание UART по времени не укладывается, то многие проблемы реального времени можно разрулить на уровне собственного, а не штатного драйвера COM порта. Но в Вашем случае, Вы явно создаете себе проблемы сами, виду крайне поверхностных представлений sad.gif. Начните банально с WinAPI. Для этого вся информация есть, как ни странно, на сайте Microsoft.
DpInRock
Работа с последовательным портом - стандартная. И нет никакого смысла использовать giveio.
Могу рекомендовать Async Professional библиотеку для Дельфи 7. Удобная и быстрая (гугл отыщет).

Наблюдение фенолога. Запустите свою программу и посмотрите процент загрузки в таск менеджере. Вот если там цифирка отличается от 0 - вы неправильно написали программу.
zltigo
Цитата(DpInRock @ Apr 3 2010, 00:06) *
Могу рекомендовать Async Professional библиотеку для Дельфи 7. Удобная и быстрая (гугл отыщет).

Господи, ну зачем вся эта муть "библиотеки" с "компонентами" sad.gif образующие нафиг ненужную надстройку над API. Впрочем, насколько мне помнится, MOXA на FTDI работает, посему можно для спрямления выкинуть эмуляцию виртуального COM порта с еще и дополнительной виндозной надстройкой и работать через Direct Drivers.
DpInRock
А затем, что это проще.
Чтобы использовать апи в чистом виде, надо слегка нагрузиться MSDN.
А лишние знания всегда требуют лишнего времени.

Да и всегда можна спросить - а зачем эта дурацкая надстройка над оборудованием в виде апи. С чего, собственно, человек и начал.
firstvald
http://asm.shadrinsk.net/uroki.htm

При этом ограничиться синхронным приемом.

Про потери байт надо посмотреть : не выполняется ли в этот момент файловая операция. С большим интересом обнаруживал , что под досом при выполнении файловых операций приемник терял байты на скоростях начиная с 57600. Получалось, что при записи на диск запрещались все прерывания и соответственно падал обмен на больших скоростях.
zltigo
Цитата(DpInRock @ Apr 3 2010, 16:28) *
А затем, что это проще.

Любая задача имеет простое, понятное, но неправильное решение. Вынужден напомнить, что Автор озаботился не поиском визарда с кнопкой "приляпать "библиотеку" и получить не думая чего-нибудь", а борьбой за скорость.
Цитата
Да и всегда можна спросить - а зачем эта дурацкая надстройка над оборудованием в виде апи.

API это в данном случае интерфейс Операционной системы. Отработанный-минимально-универсально-достаточный.
Наличие операционной системы, между прочим, не противоречит созданию собственного драйвера для железа для обеспечения большей
заточенности под конкретную задачу, о чем уже писал.
DpInRock
Только заставлять человека изучать АПИ (а тут одними функциями компорта не обойтись) ради простой операции - садизм. Вот потихоньку изучать АПИ - интересоваться, то есть - это нормально.

Вот честно скажу. Рабочий комп у меня - древний. Prescott 2.8. Ни на каких скоростях не было никогда потерь байтов.
При этом - абсолютное правило - у меня параллельно всегда крутится Южный парк на втором экране (ATI 9600), который берет мультик с внешнего USB диска.
К слову, большая часть COM портов - это мосты Silabs. И только один - родной.
XVR
Цитата(DpInRock @ Apr 3 2010, 19:00) *
Только заставлять человека изучать АПИ (а тут одними функциями компорта не обойтись) ради простой операции - садизм.
Для работы с COM портом из API понадобятся 7 функций. Если делать Overlapped IO, то еще 4. Мне не кажется, что изучить 11 функций это 'садизм' rolleyes.gif Тем более, что работа с COM портом достаточно подробно расписанна в MSDN ( http://msdn.microsoft.com/en-us/library/aa...v=VS.85%29.aspx )
DpInRock
Давайте засечем время.
Напишем терминалку на дельфях и тоже самое с апи.
У меня уйдет на это минуты 2. У человека, который первый раз этот компонент видит - минут 5.
У вас - который уже сто раз писал такое - только на набивку текста уйдет 10 минут (11 функций, с офигенно длинными типами...). И еще 20 - на поиск - чего-то не подключил, что не компилируется...
Ну, и кроме того, в такой программе не одни только вызовы апи. Еще, собственно, и процессы описывать как-то надо...
zltigo
Цитата(DpInRock @ Apr 3 2010, 21:05) *
У меня уйдет на это минуты 2.

Самое главное, не сочтите за труд незамедлительно вывалить "это" в Интернет, дабы неоскудели образчики борлондячего "творчества" из 2х минутных программ и 3x строчных "библиотек" сделанных 4мя движениями мышки.
То, чем пользуетесь, в данном случае OS Windows, нужно знать. И использовать оптимально не загромождая ее, по причине собственного непонимания, ни вульгарными прибамбасами над системой, ни ломовыми заплатками ломающими систему.
XVR
Цитата(DpInRock @ Apr 3 2010, 22:05) *
Напишем терминалку на дельфях и тоже самое с апи.
А давайте не будем писать терминалку - их уже и так как собак нерезанных rolleyes.gif Давайте писать программу ТС 'за 100 млсек надо успеть обменяться с 8-9 абонентами'
Цитата
У меня уйдет на это минуты 2. У человека, который первый раз этот компонент видит - минут 5.
А сколько времени уйдет на доработку напильником компонента под такую задачу? И каких размеров напильник потребуется? cranky.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.