Как получить данные с com-порта?

Обсуждение программ nnCron и nnCron LITE

Как получить данные с com-порта?

Postby Halfer » Sat, 19 Sep 2009, 03:56

В общем, есть сканер ШК. Цепляется он к ком-порту. После считывания ШК, сканер передаёт в порт определённые данные. Эти данные нужно как-то получить. Состоят они из 15 символов - 13 символов относится к ШК и 2 идут как суффикс и префикс ШК. Должен заметить, что устройство работает без драйвера, отправляя данные напрямую в порт. Также, следует учесть, что данные нужно не просто перехватить от какой-то программы, типа гипертерминала, нужно постоянно мониторить порт на предмет отправленных сканером данных. Ну вот типа так всё должно быть. Понимаю, что написать подобное на форте не просто, но может уже есть готовое решение, пусть даже альтернативное форту?
Halfer
 
Posts: 395
Joined: Wed, 09 May 2007, 13:23

Re: Как получить данные с com-порта?

Postby MAN » Sat, 19 Sep 2009, 07:06

А кто такой ШК :?:
ШоколаднаяКонфета :rock:
User avatar
MAN
 
Posts: 145
Joined: Wed, 17 Jun 2009, 21:34

Re: Как получить данные с com-порта?

Postby Ilya » Sat, 19 Sep 2009, 08:09

Halfer wrote:В общем, есть сканер ШК. Цепляется он к ком-порту. После считывания ШК, сканер передаёт в порт определённые данные. Эти данные нужно как-то получить. Состоят они из 15 символов - 13 символов относится к ШК и 2 идут как суффикс и префикс ШК. Должен заметить, что устройство работает без драйвера, отправляя данные напрямую в порт. Также, следует учесть, что данные нужно не просто перехватить от какой-то программы, типа гипертерминала, нужно постоянно мониторить порт на предмет отправленных сканером данных. Ну вот типа так всё должно быть. Понимаю, что написать подобное на форте не просто, но может уже есть готовое решение, пусть даже альтернативное форту?

Сканер штрих-кода?
А данные надо получать параллельно работающей "родной" софтине?
Если да, то либо путем хука, либо можно попробовать скачать Portmon и читать/парсить лог-файл от него.

Если нужно собственной софтиной читать данные, то нужно смотреть протокол или как мин. понять кто является мастером.
Ilya
 
Posts: 445
Joined: Mon, 07 Aug 2006, 09:51
Location: Санкт-Петербург

Re: Как получить данные с com-порта?

Postby Halfer » Mon, 21 Sep 2009, 03:32

Ilya wrote:Сканер штрих-кода?

Да, именно, сканер штрих-кода.
Ilya wrote:А данные надо получать параллельно работающей "родной" софтине?

Нет, родной софтины нет.
Ilya wrote:Если нужно собственной софтиной читать данные, то нужно смотреть протокол или как мин. понять кто является мастером.

Я не знаю как всё это работет на уровне протоколов, но мне кажется нужно каким-то образом открыть определённй комп-порт и тупо его "слушать".
Halfer
 
Posts: 395
Joined: Wed, 09 May 2007, 13:23

Re: Как получить данные с com-порта?

Postby Wyz » Mon, 21 Sep 2009, 06:39

Погугли.

Проверял на модеме.

Code: Select all
\ При ошибках процесс блокирует порт, так что:
\ nncron.exe -runfile COM_read_write.spf

0x80000000 CONSTANT GENERIC_READ
0x40000000 CONSTANT GENERIC_WRITE
1 CONSTANT PURGE_TXABORT
2 CONSTANT PURGE_RXABORT
4 CONSTANT PURGE_TXCLEAR
8 CONSTANT PURGE_RXCLEAR

1 CONSTANT SETXOFF
2 CONSTANT SETXON
3 CONSTANT SETRTS
4 CONSTANT CLRRTS
5 CONSTANT SETDTR
6 CONSTANT CLRDTR
7 CONSTANT RESETDEV
8 CONSTANT SETBREAK
9 CONSTANT CLRBREAK

\ WINAPI: BuildCommDCBAndTimeoutsA kernel32.dll
WINAPI: BuildCommDCBA kernel32.dll

WINAPI: ClearCommBreak kernel32.dll
WINAPI: SetCommState kernel32.dll
WINAPI: SetCommTimeouts kernel32.dll
WINAPI: PurgeComm kernel32.dll
WINAPI: SetupComm kernel32.dll
WINAPI: EscapeCommFunction kernel32.dll
WINAPI: ClearCommError kernel32.dll

CREATE sDCB 28 ALLOT            \ DCB Structure; fBinary..fDummy2 - биты
CREATE sCOMMTIMEOUTS 20 ALLOT   \ COMMTIMEOUTS Structure
CREATE sCOMSTAT 12 ALLOT        \ COMSTAT structure
-1 VALUE hCOM
VARIABLE ComErrors
VARIABLE cbWritten

CREATE Buf1 32768 ALLOT

: COM_read { handle buffer length \ cbReaded -- length }
sCOMSTAT ComErrors handle ClearCommError 0= IF S" ClearCommError error" MsgBox EXIT THEN
sCOMSTAT 4 + @ \ cbInQue Specifies the number of bytes received by the serial provider but not yet read by a ReadFile operation.
0= IF 0 EXIT THEN
0 AT cbReaded length buffer handle ReadFile  0= IF S" ReadFile error" MsgBox EXIT THEN
cbReaded
;


: main

sDCB Z" baud=115200 parity=N data=8 stop=1 TO=ON" \ TO - Timeouts
BuildCommDCBA
0= IF S" BuildCommDCBA error" MsgBox EXIT THEN S" BuildCommDCBA" S" COM_read_write.log" LOG

0  0  OPEN_EXISTING  0  0  GENERIC_READ GENERIC_WRITE OR
Z" COM1"
CreateFileA DUP TO hCOM
INVALID_HANDLE_VALUE = IF S" CreateFileA error" MsgBox EXIT THEN S" CreateFileA" S" COM_read_write.log" LOG

hCOM ClearCommBreak
0= IF S" ClearCommBreak error" MsgBox EXIT THEN S" ClearCommBreak" S" COM_read_write.log" LOG

sDCB hCOM SetCommState
0= IF S" SetCommState error" MsgBox EXIT THEN S" SetCommState" S" COM_read_write.log" LOG

0   \ WriteTotalTimeoutConstant
0   \ WriteTotalTimeoutMultiplier
100 \ ReadTotalTimeoutConstant
1   \ ReadTotalTimeoutMultiplier
10  \ ReadIntervalTimeout
SP@ hCOM SetCommTimeouts
0= IF S" SetCommTimeouts error" MsgBox EXIT THEN S" SetCommTimeouts" S" COM_read_write.log" LOG
2DROP 2DROP DROP

PURGE_TXABORT PURGE_RXABORT PURGE_TXCLEAR PURGE_RXCLEAR OR OR OR hCOM PurgeComm
0= IF S" PurgeComm error" MsgBox EXIT THEN S" PurgeComm" S" COM_read_write.log" LOG

16384 16384 hCOM SetupComm ( буферы по 16к - с запасом :-)
0= IF S" SetupComm error" MsgBox EXIT THEN S" SetupComm" S" COM_read_write.log" LOG

SETDTR hCOM EscapeCommFunction 0=
SETRTS hCOM EscapeCommFunction 0=
\ 1000 PAUSE
OR IF S" EscapeCommFunction error" MsgBox EXIT THEN S" EscapeCommFunction" S" COM_read_write.log" LOG

0 cbWritten S" ATI3%CRLF%" EVAL-SUBST SWAP hCOM WriteFile
0= IF S" WriteFile error" MsgBox EXIT THEN S" WriteFile" S" COM_read_write.log" LOG

 1000 PAUSE

hCOM Buf1 32760 COM_read
S" COM Read OK" S" COM_read_write.log" LOG
DUP N>S S" COM_read_write.log" LOG
( DUP ) Buf1 + 0 SWAP C! Buf1 ASCIIZ> MsgBox ( DROP )
S" Msg OK" S" COM_read_write.log" LOG

hCOM CloseHandle DROP

S" Done." S" COM_read_write.log" LOG

1000 PAUSE

;


-----------
Закомментировал DROP после MsgBox
И DUP перед :-)
Last edited by Wyz on Tue, 22 Sep 2009, 08:53, edited 2 times in total.
Wyz
 
Posts: 389
Joined: Tue, 11 Dec 2007, 01:42

Re: Как получить данные с com-порта?

Postby Halfer » Mon, 21 Sep 2009, 08:24

Wyz wrote:Проверял на модеме.

Если честно, сложно мне переделать данный плагин под себя. А нужно следующее. Открываем ком-порт и с определённым интервалом времени начинаем его опрашивать. Если появляются какие-нить данные, то выводим их в сообщении. Поможете?
Halfer
 
Posts: 395
Joined: Wed, 09 May 2007, 13:23

Re: Как получить данные с com-порта?

Postby Wyz » Mon, 21 Sep 2009, 09:20

Чтение в отдельном слове, вызывается в конце - засунь его в цикл.
Wyz
 
Posts: 389
Joined: Tue, 11 Dec 2007, 01:42

Re: Как получить данные с com-порта?

Postby Halfer » Tue, 22 Sep 2009, 07:30

В общем, зациклил слово main, убрал всё, что касается записи в логи, добавил проверку на пустую строку и вроде всё работает. Напрягает только то, что считав случайно ШК два раза подряд он весь целиком помещается в буфер и в итоге получается фигня. Как можно урезать буфер приёма до такого размера, чтобы там помещалось всего 15 символов?
Halfer
 
Posts: 395
Joined: Wed, 09 May 2007, 13:23

Re: Как получить данные с com-порта?

Postby Wyz » Tue, 22 Sep 2009, 07:54

Поправь вызов COM_read (можно зацикливать только его).
Wyz
 
Posts: 389
Joined: Tue, 11 Dec 2007, 01:42

Re: Как получить данные с com-порта?

Postby Halfer » Tue, 22 Sep 2009, 08:08

Wyz wrote:Поправь вызов COM_read (можно зацикливать только его).

а что там править?
Halfer
 
Posts: 395
Joined: Wed, 09 May 2007, 13:23

Re: Как получить данные с com-порта?

Postby Wyz » Tue, 22 Sep 2009, 08:23

Сколько байт читать. Сейчас 32760.
Wyz
 
Posts: 389
Joined: Tue, 11 Dec 2007, 01:42

Re: Как получить данные с com-порта?

Postby Halfer » Tue, 22 Sep 2009, 08:26

Wyz wrote:Сколько байт читать. Сейчас 32760.

ок, поставил 15 байт, теперь чётко отрабатывает только один ШК, даже если случайно пикнуть подряд два.
Halfer
 
Posts: 395
Joined: Wed, 09 May 2007, 13:23

Re: Как получить данные с com-порта?

Postby Wyz » Tue, 22 Sep 2009, 08:38

Ничего, второй при следующем чтении должен прилететь: буфера по 16к. Или все-таки main зациклил?
Wyz
 
Posts: 389
Joined: Tue, 11 Dec 2007, 01:42

Re: Как получить данные с com-порта?

Postby Halfer » Tue, 22 Sep 2009, 08:50

.. хотя бывают случаи, когда считанный ШК передаётся только частично. связано это, полагаю, с тайм-аутом ожидания :-( если бы все ШК имели длину 13 симовлов + 2 символа префикс и суффикс (стандарт EAN-13), то можно было бы проверять длину строки. Но бывают такие ШК, у которых не 13 символов, а меньше, например EAN-8, или UC - у них длин ШК другая и проверить корректность считывания такого ШК, наверное, не представляется возможным.
Halfer
 
Posts: 395
Joined: Wed, 09 May 2007, 13:23

Re: Как получить данные с com-порта?

Postby Wyz » Tue, 22 Sep 2009, 08:54

Не зацикливай main - там буфер чистится: "The PurgeComm function discards all characters from the output or input buffer of a specified communications resource. It can also terminate pending read or write operations on the resource. "
Wyz
 
Posts: 389
Joined: Tue, 11 Dec 2007, 01:42

Next

Return to nnCron forum (Russian)

Who is online

Users browsing this forum: Bing [Bot] and 1 guest