Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Com Port

13K
27 января 2006 года
Bagk
20 / / 27.01.2006
Hi. Подскажите пожалуйста как узнать, что с некоторого устройства (подключённого через ComPort) пришли данные...
На этом сайте есть статья Программирование COM портов. Там указаны адреса портов и изменения битов в зависимости от операции.
...биты у меня не меняются при обращении на эти адреса, (всё включено, прибор посылает данные на порт)...

Насколько я могу понять программа будет состоять из "2 строчек"
mov dx, 3FDh
in ax,dx ;ввод значения из порта ввода-вывода

ax постоянно равен 0000h Помогите разобраться, плз!
2.2K
27 января 2006 года
Brezhnev1980
156 / / 13.08.2005
Хм...Раз у тебя AX всё время равен 0000,тогда у тебя или не подключен девайс или (если ты к принтеру или модему) не послал запрос...Так бы это выглядело где-то так:(FASM)

ORG 100h

lup:
call listen
call Compare
jmp lup

listen:
mov dx, 3FDh
in ax,dx
ret

Compare:
cmp ax,(твоё значение)
je (Твоя метка)
cmp ax,1
je Print
ret

Send:
mov dx,3FDh
out ax,dx
ret

Print:
mov ax,1
call Send
ret

(Это конечно не идеальный алгоритм,просто времени нет!)

Если можешь,предоставь нам код!(На расмотрение,а в друг у тебя там синтаксическая ошибка ;) )
...И что это за прибор,принтер? ;)
13K
27 января 2006 года
Bagk
20 / / 27.01.2006
...Прибором является измеритель интервалов времени Agilent 53131A. Он работает только на передачу, что за запрос мне нужно послать? А код программы я впринцепе весь написал... =)

CSEG segment
start:

X:
mov dx, 3fdh
in ax,dx
jmp x

CSEG ends
end start
2.2K
27 января 2006 года
Brezhnev1980
156 / / 13.08.2005
Этого не досчтаточно,ты видно плохо читал!
Цитата:
Порт 3FDh-Регистр состоянии линии


Может будешь читать КОМ порт средствами ДОС?

DOS Fn 03H: Вспомогательный ввод AUX
Вход

* AH = 03H

Выход

* AL = символ, полученный со стандартного вспомогательного устр-ва

Описание:

Считывает (ожидает) символ со стандартного вспомогательного устройства, COM1 или AUX и возвращает этот символ в AL.
Замечание:

ввод не буферизуется и должен опрашиваться (не управляется прерываниями). при запуске DOS порт AUX (COM1) инициализируется так: 2400 бод, без проверки на четность, 1 стоп-бит, 8-битовые слова. Команда DOS MODE используется для установки иных характеристик.

PS Если последовательный порт это КОМ1,то тебе к INT 14h

13K
27 января 2006 года
Bagk
20 / / 27.01.2006
Цитата:
Originally posted by Brezhnev1980
Этого не досчтаточно,ты видно плохо читал!

Может будешь читать КОМ порт средствами ДОС?

DOS Fn 03H: Вспомогательный ввод AUX
Вход

* AH = 03H

Выход

* AL = символ, полученный со стандартного вспомогательного устр-ва

Описание:

Считывает (ожидает) символ со стандартного вспомогательного устройства, COM1 или AUX и возвращает этот символ в AL.
Замечание:

ввод не буферизуется и должен опрашиваться (не управляется прерываниями). при запуске DOS порт AUX (COM1) инициализируется так: 2400 бод, без проверки на четность, 1 стоп-бит, 8-битовые слова. Команда DOS MODE используется для установки иных характеристик.

PS Если последовательный порт это КОМ1,то тебе к INT 14h




...собственно у меня не стоит задача считывать данные с ком_порта на низко уровнев, мне нужно узнать что данные готовы к отправке тоесть (если я правильно понимаю) состояние пинов... как раз адрес 3fdh это мне и даёт. А эта часть программы будет являться функцией в моей основной программе... Где я и считываю данные с компорта. Да тогда возникает вопрос, а почему я не могу отследить данные с помощью дельфи, (основная программа пишиться на дельфе) в основной программе, а не могу потому, что не знаю как работает та или иная фанкция,... тоесть например откуда комп будет знать, что For это цикл... получается что for описан некоторым командным кодом,... так или нет? Так вот... поэтому я и решил написать обработчик порта... работа которого как наладони,... мне просто нужна некая переменная которая будет содержать "1"-данные готовы для чтения, или "0" данных нет, реализованная на низком уровне...

260
28 января 2006 года
Ramon
1.1K / / 16.08.2003
Цитата:
Originally posted by Bagk
...собственно у меня не стоит задача считывать данные с ком_порта на низко уровнев, мне нужно узнать что данные готовы к отправке тоесть (если я правильно понимаю) состояние пинов... как раз адрес 3fdh это мне и даёт. А эта часть программы будет являться функцией в моей основной программе... Где я и считываю данные с компорта. Да тогда возникает вопрос, а почему я не могу отследить данные с помощью дельфи, (основная программа пишиться на дельфе) в основной программе, а не могу потому, что не знаю как работает та или иная фанкция,... тоесть например откуда комп будет знать, что For это цикл... получается что for описан некоторым командным кодом,... так или нет? Так вот... поэтому я и решил написать обработчик порта... работа которого как наладони,... мне просто нужна некая переменная которая будет содержать "1"-данные готовы для чтения, или "0" данных нет, реализованная на низком уровне...



Как я понял из жутко сбивчивого сего объяснения - так называемая "прога" пишется все таки под Windows. В таком случае чем не устраивает функция ClearCommError()?

Код:
ClearCommError

The ClearCommError function retrieves information about a communications error and reports the current status of a communications device. The function is called when a communications error occurs, and it clears the device's error flag to enable additional input and output (I/O) operations.


BOOL ClearCommError(
  HANDLE hFile,
  LPDWORD lpErrors,
  LPCOMSTAT lpStat
);

Parameters:

hFile
[in] Handle to the communications device. The CreateFile function returns this handle.
 
lpErrors
[out] Pointer to a variable to be filled with a mask indicating the type of error. This parameter can be one or more of the following values. Value Meaning
CE_BREAK The hardware detected a break condition.
CE_DNS Windows Me/98/95:  A parallel device is not selected.
CE_FRAME The hardware detected a framing error.
CE_IOE An I/O error occurred during communications with the device.
CE_MODE The requested mode is not supported, or the hFile parameter is invalid. If this value is specified, it is the only valid error.
CE_OOP Windows Me/98/95:  A parallel device signaled that it is out of paper.
CE_OVERRUN A character-buffer overrun has occurred. The next character is lost.
CE_PTO Windows Me/98/95:  A time-out occurred on a parallel device.
CE_RXOVER An input buffer overflow has occurred. There is either no room in the input buffer, or a character was received after the end-of-file (EOF) character.
CE_RXPARITY The hardware detected a parity error.
CE_TXFULL The application tried to transmit a character, but the output buffer was full.

lpStat
[out] Pointer to a COMSTAT structure in which the device's status information is returned. If this parameter is NULL, no status information is returned.
Return Values
If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero. To get extended error information, call GetLastError.

Remarks
If a communications port has been set up with a TRUE value for the fAbortOnError member of the setup DCB structure, the communications software will terminate all read and write operations on the communications port when a communications error occurs. No new read or write operations will be accepted until the application acknowledges the communications error by calling the ClearCommError function.

The ClearCommError function fills the status buffer pointed to by the lpStat parameter with the current status of the communications device specified by the hFile parameter.


Параметр №3. Поле "cbInQue " в структуре "COMSTAT" как раз отражает наличие байтов во входном буфере.

Код:
COMSTAT

The COMSTAT structure contains information about a communications device. This structure is filled by the ClearCommError function.


typedef struct _COMSTAT
{
   DWORD fCtsHold  :1;
   DWORD fDsrHold  :1;
   DWORD fRlsdHold :1;
   DWORD fXoffHold :1;
   DWORD fXoffSent :1;
   DWORD fEof      :1;
   DWORD fTxim     :1;
   DWORD fReserved :25;
   DWORD cbInQue;
   DWORD cbOutQue;
} COMSTAT, *LPCOMSTAT;

Members:

fCtsHold
If this member is TRUE, transmission is waiting for the CTS (clear-to-send) signal to be sent.

fDsrHold
If this member is TRUE, transmission is waiting for the DSR (data-set-ready) signal to be sent.

fRlsdHold
If this member is TRUE, transmission is waiting for the RLSD (receive-line-signal-detect) signal to be sent.

fXoffHold
If this member is TRUE, transmission is waiting because the XOFF character was received.

fXoffSent
If this member is TRUE, transmission is waiting because the XOFF character was transmitted. (Transmission halts when the XOFF character is transmitted to a system that takes the next character as XON, regardless of the actual character.)

fEof
If this member is TRUE, the end-of-file (EOF) character has been received.

fTxim
If this member is TRUE, there is a character queued for transmission that has come to the communications device by way of the TransmitCommChar function. The communications device transmits such a character ahead of other characters in the device's output buffer.

fReserved
Reserved; do not use.

cbInQue
Number of bytes received by the serial provider but not yet read by a ReadFile operation.

cbOutQue
Number of bytes of user data remaining to be transmitted for all write operations. This value will be zero for a nonoverlapped write.


MSDN читать надо, для того его и писали в конце концов.

Стоит только хорошо поискать и заниматься имением мозгов и вовсе не придется см. аттач. Добавляем требуемый функционал и радуемся.
260
28 января 2006 года
Ramon
1.1K / / 16.08.2003
PS: А вот собственно и аттач.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог