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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Работа с 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
beer_warrior
сообщение Feb 3 2007, 00:37
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



А каким образом вызывается ReadFile()? По событию, таймеру, в отдельном потоке?


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
CSB
сообщение Feb 3 2007, 02:28
Сообщение #3


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

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



В потоке
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Feb 3 2007, 04:07
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



А portmonом его? Такое впечетление, что принимается оно правильно, а из буфера вынимается не в тот момент.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
CSB
сообщение Feb 3 2007, 12:24
Сообщение #5


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

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



Дык, я ж говорю, что терминальной программой все нормально принимается (то что она несколько зависает, то ничего - главное все пакеты целые). Дело именно в моей программе =)

Этим читаю:
Код
procedure InComm1(var i:byte;var IsIn:boolean);
var
bytes1:dword;
begin
     IsIn:=false;
     clearcommerror(hcom1,com_error,@stat1);

   if stat1.cbInQue>0
   then
    begin
       if  readfile(hcom1,databuf1,bufsize1,bytes1,nil)
       then
        begin
         i:=databuf1;
         IsIn:=true;
        end
       else
        showmessage('Ошибка приема');
    end;

end;


Читаю просто вызовом функции в потоке.
(та же проблема остается при использовании CPort310)
Go to the top of the page
 
+Quote Post
lolikandr
сообщение Feb 3 2007, 12:45
Сообщение #6


Участник
*

Группа: Свой
Сообщений: 56
Регистрация: 25-06-05
Пользователь №: 6 300



ReadFile() вызывается в отдельном потоке по какому событию? При помощи SetCommMask или еще как?
PS: Пока писал, ответ появился. Почитайте что-нибудь типа такого:
http://www.delphimaster.ru/articles/comport2/index.html
Сразу скажу, что лучше Overlapped режим.
Go to the top of the page
 
+Quote Post
CSB
сообщение Feb 3 2007, 16:05
Сообщение #7


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

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



Сегодня выяснилось, что и в Terminal приходят обрывки пакетов, реже чем в моей программе, но все-таки они есть. portmon показывает, что там приходят именно обрывки sad.gif Сейчас железо очередной раз перепроверяю. Попробую снизить скорость.

Блин, где же собака порылась ?

Сообщение отредактировал CSB - Feb 3 2007, 16:08
Go to the top of the page
 
+Quote Post
Andrew2000
сообщение Feb 3 2007, 22:25
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 421
Регистрация: 25-12-04
Пользователь №: 1 675



Цитата(CSB @ Feb 3 2007, 16:05) *
Попробую снизить скорость

Скорость чего? Ваши 8 байт раз в 1мс только на 115200 и пролезут (если я математику не забыл)
Go to the top of the page
 
+Quote Post
_Sam_
сообщение Feb 3 2007, 22:38
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 278
Регистрация: 18-01-05
Из: Санкт-Петербург
Пользователь №: 2 031



Может в паузе между байтами или пакетами?
Go to the top of the page
 
+Quote Post
CSB
сообщение Feb 4 2007, 00:43
Сообщение #10


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

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



Цитата
Скорость чего? Ваши 8 байт раз в 1мс только на 115200 и пролезут (если я математику не забыл)

Скорость передачи. Это тестовая задача, потому можно варьировать некоторыми параметрами. Просто буду снимать меньше показаний и все. Такое впечатление, что пакеты теряются по дороге к ПК, хотя если смотреть по JTAG'у, то все нормально.
Математика: 115200 kbps - это 11520 kBps (10 байт кадр). У меня получается 8 kBps. Поэтому остается некоторый запас.
Go to the top of the page
 
+Quote Post
CSB
сообщение Feb 4 2007, 00:53
Сообщение #11


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

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



Цитата
Может в паузе между байтами или пакетами?
Не понял что вы имели в виду. (Паузы между пакетами разные - зависят от воздействия на датчик.)

Ну путь винда как-то отделяет во времени пакеты, но теряться-то при этом они не должны, т.к. входного буфера должно вполне хватать.
Go to the top of the page
 
+Quote Post
Andrew2000
сообщение Feb 4 2007, 01:33
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 421
Регистрация: 25-12-04
Пользователь №: 1 675



Цитата(CSB @ Feb 4 2007, 00:43) *
Скорость передачи. ...

Я имел ввиду, что на 57600 уже не пролезет.

Цитата(CSB @ Feb 4 2007, 00:43) *
... (10 байт кадр). ...

Бит? т.е. без контроля - тока старт и стоп.

Обычно, хвосты теряются из-за ошибок передающей стороны - когда выдаете следующий байт не дождавшись "ухода" предыдущего в линию.
Go to the top of the page
 
+Quote Post
CSB
сообщение Feb 4 2007, 12:13
Сообщение #13


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

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



Цитата
Бит? т.е. без контроля - тока старт и стоп.

угу, конечно бит.

Цитата
Обычно, хвосты теряются из-за ошибок передающей стороны - когда выдаете следующий байт не дождавшись "ухода" предыдущего в линию.

Следующий байт записываю в регистр передачи только по окончанию передачи предыдущего байта.
Go to the top of the page
 
+Quote Post
_Sam_
сообщение Feb 4 2007, 16:03
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 278
Регистрация: 18-01-05
Из: Санкт-Петербург
Пользователь №: 2 031



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

Стартовый байт есть в пакете? Байт стаффинг или 9битный формат передачи для стартового байта используется?
Go to the top of the page
 
+Quote Post
CSB
сообщение Feb 4 2007, 18:24
Сообщение #15


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

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



Пакет обрамлен стартовыми и оконечными байтами (при таком обрамлении пакета мне проще онадизировать целостность пакета). Формат передачи: 10 бит, стартовый бит + 8 бит данных + 1 стоп-бит. Все стандартно.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th June 2025 - 05:25
Рейтинг@Mail.ru


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