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

 
 
> Пропадет первый байт при приеме
krik
сообщение Apr 1 2010, 17:52
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 29-08-05
Пользователь №: 8 044



Пересылаю массивы байт от COM1 в COM2 через нульмодемный кабель на одном компе. Использую прямой доступ к порту -Giveio ( или UserPort) с одной стороны, и терминалка с другой. В обоих случаях при приеме в программке с прямой доступом к порту пропадает самый первый байт на скорости 115кбит. На меньших скоростях-нормально, при приеме одного байта -нормально. Как только переходишь на 115200 -принятый массив начинается со второго байта.
Кто нибудь сталкивался с чем-то подобным?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SFx
сообщение Apr 1 2010, 19:24
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 758
Регистрация: 11-07-05
Из: Понаехал (Мск)
Пользователь №: 6 688



а управление потоком какое стоит? все настройки в студи, телепаты в отпуске.
Go to the top of the page
 
+Quote Post
krik
сообщение Apr 2 2010, 15:35
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 29-08-05
Пользователь №: 8 044



Цитата(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 абонентами.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Apr 2 2010, 15:40
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(krik @ Apr 2 2010, 21:33) *
вот и весь кусок. Используется UserPort


Кошмарsmile.gif Вы отключили FIFO, и надеетесь, что успеете всё принять по опросу? Это Агуров так советует? smile.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 2 2010, 15:58
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(AHTOXA @ Apr 2 2010, 18:40) *
Вы отключили FIFO, и надеетесь, что успеете всё принять по опросу?

Да и с FIFO sad.gif принципиально не изменится ничего. Полное отсутствие системного подхода и непонимание даже того простого факта, что дивный цикл опроса в приложении спокойно может быть прерван и на очень долго. Про то, насколько этот тупой опрос ВПУСТУЮ грузит систему тоже у Автора нет представления.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Apr 2 2010, 16:57
Сообщение #6


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(zltigo @ Apr 2 2010, 21:58) *
Да и с FIFO sad.gif принципиально не изменится ничего. Полное отсутствие системного подхода и непонимание даже того простого факта, что дивный цикл опроса в приложении спокойно может быть прерван и на очень долго. Про то, насколько этот тупой опрос ВПУСТУЮ грузит систему тоже у Автора нет представления.


FIFO + мультимедийный таймер + реалтайм приоритет процесса - можно добиться приемлемых результатов, почти сравнимых с грамотной работой через WinAPI smile.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
krik
сообщение Apr 2 2010, 17:18
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 29-08-05
Пользователь №: 8 044



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


FIFO + мультимедийный таймер -поясните если можно.(например как обходиться с FIFO).
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Apr 2 2010, 18:00
Сообщение #8


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(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 всё равно не выйдет.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- krik   Пропадет первый байт при приеме   Apr 1 2010, 17:52
|- - zltigo   Цитата(krik @ Apr 2 2010, 18:33) // вот и...   Apr 2 2010, 15:36
||- - ASN   krik Если за 100 млсек надо успеть обменяться с 8-...   Apr 2 2010, 16:51
|||- - krik   Цитата(ASN @ Apr 2 2010, 20:51) krik Если...   Apr 2 2010, 19:26
|||- - zltigo   Цитата(krik @ Apr 2 2010, 22:26) Но вообщ...   Apr 2 2010, 20:35
|- - krik   Цитата(AHTOXA @ Apr 2 2010, 19:40) Кошмар...   Apr 2 2010, 16:39
- - zltigo   Цитата(krik @ Apr 1 2010, 20:52) Использу...   Apr 1 2010, 19:33
|- - XVR   Цитата(zltigo @ Apr 1 2010, 23:33) Цитата...   Apr 2 2010, 05:54
|- - krik   Цитата(zltigo @ Apr 1 2010, 23:33) остало...   Apr 2 2010, 15:07
|- - zltigo   Цитата(krik @ Apr 2 2010, 18:07) А затем ...   Apr 2 2010, 15:18
|- - ASN   krik На скорости 115200 при практически постоянном...   Apr 2 2010, 15:24
- - DpInRock   Работа с последовательным портом - стандартная. И ...   Apr 2 2010, 21:06
|- - zltigo   Цитата(DpInRock @ Apr 3 2010, 00:06) Могу...   Apr 2 2010, 21:32
- - DpInRock   А затем, что это проще. Чтобы использовать апи в ...   Apr 3 2010, 13:28
|- - zltigo   Цитата(DpInRock @ Apr 3 2010, 16:28) А за...   Apr 3 2010, 13:58
- - firstvald   http://asm.shadrinsk.net/uroki.htm При этом огран...   Apr 3 2010, 13:45
- - DpInRock   Только заставлять человека изучать АПИ (а тут одн...   Apr 3 2010, 15:00
|- - XVR   Цитата(DpInRock @ Apr 3 2010, 19:00) Толь...   Apr 3 2010, 17:05
- - DpInRock   Давайте засечем время. Напишем терминалку на дель...   Apr 3 2010, 18:05
- - zltigo   Цитата(DpInRock @ Apr 3 2010, 21:05) У ме...   Apr 3 2010, 18:47
- - XVR   Цитата(DpInRock @ Apr 3 2010, 22:05) Напи...   Apr 3 2010, 19:05


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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 19:21
Рейтинг@Mail.ru


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