![]() |
![]() |
![]() |
|
Работа с последовательным портом RS-232 из 1С (зацените мою статью) | ☑ | ||
---|---|---|---|---|
0
romix
06.02.06
✎
00:13
|
||||
1
Любитель XML
06.02.06
✎
00:23
|
респект. Статья очень понравилась.
|
|||
2
MikleV
06.02.06
✎
00:50
|
(0)Мне до такого ещё расти и расти:(.
|
|||
3
romix
модератор
06.02.06
✎
10:26
|
Апну разок (тут кто-то спрашивал код ВК).
|
|||
4
Иде я
06.02.06
✎
11:39
|
Респект - так вроде говорится ?
|
|||
5
Иде я
06.02.06
✎
11:42
|
Тока вот не очень понял - читает с "файла" каждые 500 мили секунд по строке ?
Т.е. файл буферизирует то, что идет в COM порт ? Если в порт будет чаще писаться -скажем каждые 200 мили секунд, то что будет ? |
|||
6
rsv
06.02.06
✎
11:50
|
(0) Может объяснишь мне когда я подрубаю сканер к COM порту и инициализирую штатную scanopos то проц у меня на 100 процентов :)
|
|||
7
romix
модератор
06.02.06
✎
11:59
|
(5) Нет, пытается читать. Если там ничего нет, то всякий раз будет прочитано 0 символов.
(6) Я не знаю че там в штатной (говорят, она глючная, а исходника, чтобы посмотреть - нет). Попробуй мою ВК, она действует аналогично (генерирует то же самое событие). |
|||
8
romix
модератор
06.02.06
✎
12:30
|
>Если в порт будет чаще писаться -скажем каждые 200 мили секунд, то что будет ?
Система Windows буферизует файловый ввод-вывод. Я проверял свою компоненту так: брал большой текстовый файл и непрерывно посылал его в COM-порт. Добился, чтобы работало. |
|||
9
vasinok
06.02.06
✎
12:57
|
стилистику критиковать можно?
|
|||
10
romix
модератор
06.02.06
✎
13:14
|
(9) угу.
|
|||
11
vasinok
06.02.06
✎
13:20
|
||||
12
romix
модератор
06.02.06
✎
13:24
|
(11) И что именно нарушено?
|
|||
13
vasinok
06.02.06
✎
13:25
|
"Интересно наблюдать, как автор, начавший писать от третьего лица ("Автор считает"), ко второй странице съезжает на "Мы будем использовать", а через еще пару абзацев, окончательно отчаявшись, говорит: "возьмите вот это и вызовите вон то".
|
|||
14
romix
модератор
06.02.06
✎
13:29
|
(13) Спасибо, позже зазырю что у меня получилось. :-)
Со статьей я отчасти не согласен: "русский прекрасно обойдется чем-то вроде "Это используется так-то и так-то". " Пассивные глаголы же запрещены? (С.Кинг). А вот модальные глаголы (повелительное наклонение) вполне, я думаю, рулят в техническом описании. |
|||
15
Иде я
06.02.06
✎
13:30
|
(8) Но если читать реже чам писать в порт, то какая то часть данных будет пропадать при переполнении буфера ?
|
|||
16
romix
модератор
06.02.06
✎
13:37
|
(15) Да, там буфер 64К кажется...
Отдельные куски тогда пропадут. Вообще, протокол RS-232 не страдает излишней надежностью, и может, например, искажать данные. |
|||
17
romix
модератор
06.02.06
✎
13:38
|
(+16) Искажает данные больших пакетов (рано или поздно сбивается синхронизация). Поэтому программист должен разбивать на пакеты разумной длины, и снабжать их контрольной суммой для проверки целостности.
|
|||
18
Иде я
06.02.06
✎
13:43
|
Это я все эхолот думаю прикрутить.
Так то с чтением проблем не возникло. Но если на природе подрубать - надо либо ноут армейский , либо... Это у меня идея вертится писать маршруты шлубин и потом рельеф 3D рисовать |
|||
19
РС232
06.02.06
✎
13:45
|
(17) При асинхронном режиме работы синхронизация не сбивается, если только не посылать мегабайты нулей или единиц. Ведь синхронизация приёмника и передатчика производится на каждом символе.
|
|||
20
romix
модератор
06.02.06
✎
13:48
|
(19) У меня сбивалась, когда я посылал длинный текст. После N килобайт нормального текста шли символы с нарушенной кодировкой. Причем это было так стабильно.
|
|||
21
MMF
06.02.06
✎
13:48
|
(0) про многопоточность - фигня какая-то написана. Ибо: 1) таймер к многопоточности никакогоотношения не имеет 2) в данном случае мьютексы вообще не в тему, так как предназначены для синхронизации межпроцессного взаимодействия.
Оформление кода не соответствует стандартам, мягко говоря. Ошибка: в Init создается cp:= T_ComPort.Create; в Done cp не разрушается, налицо утечка. В целом - молодец, но учиться на этой компоненте новичкам - не советую. |
|||
22
РС232
06.02.06
✎
13:50
|
(20) Не из-за сбоя синхро. Когда происходит сбой синхро, винда возвращает соответствующую ошибку. Ошибка буферирования или где-то ещё.
|
|||
23
romix
модератор
06.02.06
✎
13:52
|
(21) Спасибо.
А где стандарты оформления заценить? Я про них даже не слышал. Код вроде везде лесенкой, а что еще нужно? Почему новичкам нельзя? Это для них писано. Таймер для многопопточности имеет отношение!!! Ведь обработчик таймера - крутится в отдельном потоке, не так ли? У меня был сбой на длинных текстах (терялись куски текста), когда таймер уже сработал, а текст из порта еще не прочитался. Подозреваю, что там возник второй поток, и они параллельно начали выполняться. |
|||
24
romix
модератор
06.02.06
✎
13:56
|
Вот это что ли? Я думаю реально будет привести в соотв.
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=802&mode=print |
|||
25
romix
модератор
06.02.06
✎
13:58
|
(22) Ничего себе ошибка буферирования - буквы в абракадабру превращаются. :-)
Причем стабильно. |
|||
26
РС232
06.02.06
✎
14:00
|
(25) Значит, накосячил где-то :)))
При правильной настройке ком-порта ошибки синхронизации не возникают, если нет сбоев аппаратной части. Конечно, если не передавать мегабайты нулей или единиц, как я и писал. |
|||
27
MMF
06.02.06
✎
14:15
|
(23) Обычно используют стандарты Борланда, на русском чето похожее можно почитать тут: http://www.delphiplus.org/articles/delphi/source_code_standards/index.html
"Почему новичкам нельзя? Это для них писано." потому что написана криво и статья и компонента. |
|||
28
MMF
06.02.06
✎
14:31
|
(27+) TTimer - просто обертка вокруг SetTimer/KillTimer и WM_TIMER. Выполняется в том же потоке.
Кроме того: The WM_TIMER message is a low-priority message. The GetMessage and PeekMessage functions post this message only when no other higher-priority messages are in the thread's message queue. Запросто можешь терять данные из порта, WM_TIMER имеет приоритет как у WM_PAINT, кажись. |
|||
29
smaharbA
06.02.06
✎
14:46
|
(27)(28) А глобальный хук будет отслеживать эти события ?
|
|||
30
smaharbA
06.02.06
✎
14:48
|
+(29) не WM_TIMER конечно, а изменения в файле...
|
|||
31
romix
модератор
06.02.06
✎
15:02
|
(28) Я же не буду сканером 64 килобайта в порт писать? А это значит, что ЛЮБЫЕ штрихкоды будут прочитаны, даже при низком приоритете потока WM_TIMER, даже если комп будет длительное время загружен!!!
|
|||
32
romix
модератор
06.02.06
✎
15:05
|
(27)>потому что написана криво и статья и компонента
А ты сам не криво щас пишешь? Предлагаю на 100 баксов поспорить, что при 100% загруженности 1С в течение N минут штрихкод будет все равно получен, когда 1С освободится (возникнет Idle Time). |
|||
33
MMF
06.02.06
✎
15:14
|
(32) мне пох. Не реагируй столь бурно. Рекомендую все же почитать о нормальных методах работы с СОМ-портами, а не изобретать велосипед.
|
|||
34
romix
модератор
06.02.06
✎
15:17
|
(33) В буфер-то Windows читает с максимальным приоритетом (более того - через аппаратное прерывание)! А из буфера я могу забирать данные как угодно редко.
|
|||
35
romix
модератор
06.02.06
✎
15:28
|
(33) "Нормальные методы" - это приоритет потоку побольше поставить? На #$% я видел такие "нормальные методы" - они ведут к (6).
Поток и таймер в данном случае одно#$%ственны. В случае потока - приоритет надо ему выставить минимальный, и обязательно делать sleep(500) между чтениями. 500 - для примера, возможно другое значение слипа. |
|||
36
MMF
06.02.06
✎
15:33
|
(35) "Поток и таймер в данном случае одно#$%ственны" - в сад. Ты и в 1С пишешь по принципу: "у нас в документе не может быть больше десяти строчек, если будет - напишем другой модуль"? Переименуй тогда свою тему: "Работа с последовательным портом RS-232 из 1С (зацените мою статью) ТОЛЬКО ДЛЯ СКАНЕРА ШТРИХ-КОДА, В ДРУГИХ СЛУЧАЯХ БУДЕТ ГЛЮЧИТЬ"
|
|||
37
romix
модератор
06.02.06
✎
16:25
|
(36) Извини, но ты щас туфту городишь. Если я и сделаю потоком, как ты говоришь, то обязательно - с теми же паузами (sleep) по 500 мс, и с минимальным приоритетом.
А иначе подстава. Непрерывное чтение RS-232, да еще и с высоким приоритетом, ДЕЛАЮТ ТОЛЬКО ДЯТЛЫ (я это официально утверждаю и готов поспорить на бабки, что все будет работать, если конечно поток данных разумный для данного протокола, и не переполняет буфер 64К). |
|||
38
rsv
06.02.06
✎
16:28
|
Уважаемые. Если просто сканер то ставьте в разрыв. Дешево и сердито. В противногм случае многопоточность и степпинги с таймингами Вас затопчут :)
|
|||
39
romix
модератор
06.02.06
✎
16:28
|
(38) Дятлы клювом задолбят. Он у них железный. :-)
|
|||
40
romix
модератор
06.02.06
✎
16:30
|
(38) Сканер в разрыв - это зло, потому что пользователь будет всякий раз обращаться к клавиатуре, и нажимать лишнюю клавишу перед считыванием ш/к.
Это очень неудобно и в разы замедляет работу оператора, например, на складе. |
|||
41
rsv
06.02.06
✎
16:34
|
(40) А зачем ему обращаться к клавиатуре ? У меня курсор в поле ввода сам заново позиционируется после считывания . :)
|
|||
42
MMF
06.02.06
✎
16:38
|
(37) ты выясни наконец-то что такое таймер, а то, извини, туфту несешь.
"приоритет потоку побольше поставить", "Непрерывное чтение RS-232, да еще и с высоким приоритетом" - это ты изобрел сам, я такого не говорил. |
|||
43
Орк
06.02.06
✎
16:42
|
(16) С каких пор аппаратный интерфейс называется протоколом? И как он самый (т. е. интерфейс) может искажать данные?
|
|||
44
Иде я
06.02.06
✎
16:46
|
(43) А если кабель пяток метров использовать - наводки будут данные искажать ?
|
|||
45
Guk
06.02.06
✎
16:46
|
>>Сканер в разрыв - это зло, потому что пользователь будет всякий раз обращаться к клавиатуре, и нажимать лишнюю клавишу перед считыванием ш/к.
Мдя... |
|||
46
romix
модератор
06.02.06
✎
16:47
|
(42) Сорри я был не прав.
(43) Да, интерфейс. У меня искажал на больших объемах. Причем, стабильно. Как-не знаю. |
|||
47
Орк
06.02.06
✎
16:50
|
(44) Если на RS232 повесить преобразователь в RS485 то и на 2 км. наводок не будет. А комп будет видеть все тот-же неискажающий данные RS232.
|
|||
48
romix
модератор
06.02.06
✎
16:50
|
(42) Все равно события в 1С имеют минимальный приоритет - Idle. А я ориентируюсь именно на события 1С. Простое чтение из файла можно организовать намного проще.
|
|||
49
Орк
06.02.06
✎
16:52
|
+47. А вот горбатый протокол обработки данных сможет их исказить до неузнаваемости.
|
|||
50
romix
модератор
06.02.06
✎
16:55
|
(41, 45) Оператору по любому много лишних нажатий. Особенно прикол, когда поправила строку документа, и еще раз считала. Угадай, что при этом будет.
Правильно, звонок программисту "У меня не работает ваша 1С". |
|||
51
Орк
06.02.06
✎
16:56
|
(0) Чем видоузный MSComm не устраивает? Оберни в оберточку пригодную для 1С и получишь полностью событийно управляемые возможности.
|
|||
52
romix
модератор
06.02.06
✎
16:56
|
(51) Событие он не умеет 1С-ное генерировать.
Вообще можно читать и писать "COM2" например как обычный файл. |
|||
53
rsv
06.02.06
✎
17:00
|
(41, 45) Оператору по любому много лишних нажатий. Особенно прикол, когда поправила строку документа, и еще раз считала. Угадай, что при этом будет.
Правильно, звонок программисту "У меня не работает ваша 1С". А когда чел выходит покурить на балкон он может прыгнуть с него. Все равно он из квартиры будет выходить :) |
|||
54
Ромка678
06.02.06
✎
17:00
|
Предлагаю автора отправить в глубокий космос.
|
|||
55
romix
модератор
06.02.06
✎
17:06
|
(54) Зуб перестал болеть?
|
|||
56
Орк
06.02.06
✎
17:08
|
(52) Кто он? А ты зачем. Юзай создание внешних компонент.
|
|||
57
romix
модератор
06.02.06
✎
17:09
|
(53) Я не понимаю чем тебя не устраивает COM-сканер? Он НАМНОГО удобнее для оператора. А если кто-то не умеет с ними работать, то он ДЯТЕЛ С БОЛЬШИМ КЛЮВОМ.
(56) А как ты думаешь, что я поюзал в (0)? |
|||
58
romix
модератор
06.02.06
✎
17:11
|
(56) он=mscomm
В данном случае он не нужен - достаточно простого чтения из файла или записи в файл, т.к. в Windows COM-порт - это файл. |
|||
59
Истина
06.02.06
✎
17:11
|
(51) MSComm не бесплатна.
|
|||
60
romix
модератор
06.02.06
✎
17:14
|
Вечерком переделаю на поток - так будет интереснее.
Через таймер, как сейчас, тоже будет работать на не переполняющих буфер 64К потоках данных. Видео, я думаю, через COM-порт никто захватывать не будет. |
|||
61
rsv
06.02.06
✎
17:21
|
53) Я не понимаю чем тебя не устраивает COM-сканер? Он НАМНОГО удобнее для оператора. А если кто-то не умеет с ними работать, то он ДЯТЕЛ С БОЛЬШИМ КЛЮВОМ.
О как .:) Вот совсем недавно (в конце 2005 года) для автоматизации розничного магазина необходимо было реализовать механизм штрих кодирования.Так знакомые попросили. Для наименьшего гемороя все через типовую торговлю. Был сканерок пприкуплен com и принтер этикеток. При работе в штатном режиме(scaopos) проц грузился на 100 процентов :). По какой причине ХЗ.Желания небыло разбираться.В протоколизации, в потоках . А может вобще дело было не в этом. :) Поменял на разрыв добавил пару строк кода в типовую и люди были счастлвы. Все работает . Причем ручками никто не тыкает. Все разошлись. :) |
|||
62
Истина
06.02.06
✎
17:27
|
(61) Я поддерживаю romix-a, что сканер в разрыв это чепуха. А для нормальной работы не надо было использовать 1С-ский scanopos. Уже давно известно, что это глючная байда.
|
|||
63
rsv
06.02.06
✎
17:27
|
Да.Когда дойдет до перепайки контактов.Свистните. :)
|
|||
64
Истина
06.02.06
✎
17:28
|
(63) Ты сейчас с кем разговариваешь?
|
|||
65
rsv
06.02.06
✎
17:28
|
Это у вас что . Часы. А за спиной что. Батарейки.
|
|||
66
Истина
06.02.06
✎
17:32
|
(65) Во-во, тут ты прав. Для организации работы сканера в 1С не надо разбираться в протоколах и потоках. :)
|
|||
67
romix
модератор
06.02.06
✎
17:34
|
(61) Вроде замена для scanopos.dll в инете давно лежит?
(специально для тех кто не умеет программировать). |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |