Работа с портами в Delphi

Форум севастопольских программистов, администраторов, дизайнеров, мастеров. Java, PHP, JavaScript, C++, C, C#, ASP, PhotoShop, CorelDraw, Ruby, Android, iPhone, Windows, Linux, etc...
Ответить
Сеня
Site Admin
Сообщения: 2545
Зарегистрирован: Пт апр 24, 2009 4:58 pm

Сообщение Сеня » Чт апр 28, 2016 10:11 pm

а сам порт ком два у тебя есть?
Quilibet fortunae suae faber.

Сеня
Site Admin
Сообщения: 2545
Зарегистрирован: Пт апр 24, 2009 4:58 pm

Сообщение Сеня » Пт апр 29, 2016 12:15 pm

Чтож это за железо старое такое что даже порт ком2 есть?
Quilibet fortunae suae faber.

Сеня
Site Admin
Сообщения: 2545
Зарегистрирован: Пт апр 24, 2009 4:58 pm

Сообщение Сеня » Пт апр 29, 2016 12:17 pm

В MS-DOS (и ранних версиях Windows, включая 95 и 98), работа с последовательными портами часто производилась напрямую через порты ввода-вывода командами Ассемблера IN и OUT. Этот способ не поддерживают современные операционные системы, начиная с Windows NT. В них остается (надо сказать, довольно древняя) возможность работы с этими портами как с файлами.

Например, достаточно открыть файл с именем "COM1", чтобы можно было писать в него данные для внешнего устройства, и читать из него данные от этого устройства (входной и выходной поток данных не пересекаются).

hCom:=CreateFile("COM2", ... );

ok:=WriteFile( //uses Windows
hCom, //Файл
Buff[1], //Буфер откуда пишем
nBytes, //Число байтов для считывания
wr_cnt, //Число записанных байтов
nil
);

ok:=ReadFile( //uses Windows
hCom, //Файл
Buff, //Буфер куда считываем
100, //Число байтов для считывания
rd_cnt, //Число считанных байтов
nil
);

CloseHandle(hCom);



Настройки параметров и таймаутов COM-порта производятся при помощи функций SetCommState и SetCommTimeOuts соответственно. Ссылка на работающий пример кода, который показывает эту идею более развернуто, приведена в конце статьи.

Конечно, есть возможность работать с COM-портом и "более простыми средствами" - вплоть до открытия файла с именем "COM2", записи строк в этот файл и чтения встречных данных от устройства из этого же файла.

Внешняя компонента, по сравнению с этим "простым" решением, добавляет возможность генерировать события считывания данных (например, штрихкодов со сканера) в асинхронном режиме, когда 1С не "замирает" до очередного считывания штрихкода, и не "крутится" в бесконечном цикле чтения, а получает внешние события, и реагирует на них в предопределенной процедуре ОбработкаВнешнегоСобытия(). Это удобно для пользователя, и не заставляет его нажимать на клавиатуре лишние клавиши перед считыванием штрихкода.

http://x-romix.narod.ru/vk_rs232.rar
Quilibet fortunae suae faber.

Сеня
Site Admin
Сообщения: 2545
Зарегистрирован: Пт апр 24, 2009 4:58 pm

Сообщение Сеня » Пт апр 29, 2016 12:19 pm

procedure TDD28F1.SendChar(sToSend:string);
begin
CommPort := 'COM1'; (***** 4 start *)
hCommFile := CreateFile(PChar(CommPort),
GENERIC_WRITE,
0,
nil,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
WriteFile(hCommFile,
PChar(sToSend)^,
Length(sToSend),
NumberWritten,
nil); (***** 4 end *)
CloseHandle(hCommFile); (***** 5 *)
end;
Quilibet fortunae suae faber.

Сеня
Site Admin
Сообщения: 2545
Зарегистрирован: Пт апр 24, 2009 4:58 pm

Сообщение Сеня » Пт апр 29, 2016 1:37 pm

Не советовал бы эмулировать, пойди лучше купи шлейф и воткни в материнку в качестве ком1, а если надо несколько портов, то лучше купи планку "usb расширитель" на 2-3 комовских порта.
Quilibet fortunae suae faber.

BEOWOLF
Зав. цехом
Сообщения: 338
Зарегистрирован: Сб окт 04, 2008 10:30 am
Откуда: Украина, Севастополь

Сообщение BEOWOLF » Сб апр 30, 2016 5:15 pm

Посмотри просто код ошибки через GetLastError, и по коду причину фейла.

Ответить

Вернуться в «IT, сети, дизайн, программирование»