Вопрос

Я ищу способ связи с последовательным COM-портом RS232 в Windows.В сети нашел 2 решения один который не является полностью бесплатным (вводит преднамеренные задержки в работе функции) и другой с ограниченными возможностями в Windows.Последний может только писать в COM-порт Windows, но не читать.

Я не могу посмотреть код первого решения, поскольку оно скомпилировано в .dll (имеет смысл, иначе люди могут просто отредактировать задержку и не покупать ее...), а второе, похоже, использует только fopen() чтобы открыть порт, а затем использовать функцию fwrite() для записи, точно так же, как это можно сделать с потоком.Но, судя по всему, чтение ничего не возвращает.

Я знаю, что это возможно, поскольку это было в первом решении, хотя оно требует, чтобы Apache использовал модуль php-cgi вместо модуля php5.

Есть идеи?

Это было полезно?

Решение

Каждое приведенное выше решение либо неэффективно, либо слишком трудоемко.

Вы можете просто использовать библиотека PHP-DIO (dio_fcntl, dio_open, dio_read, dio_write, dio_seek, ...).Это также в запись в руководстве PHP для DIO:

Этот пакет PECL недоступен по умолчанию.Чтобы получить его для Windows, если у вас PHP 5.2.x выше 5.2.6, вы можете загрузить его как часть ZIP-архива:

Обе эти ссылки были найдены в http://www.deveblog.com/index.php/download-pecl-extensions-for-windows/

Вот сборка из Linux, просто возьмите его и выполните установку phpize/configure/make/make.

Я не знаю, следует ли его использовать в сеансе Apache, но сделайте это.

Другие советы

Самый простой способ справиться с этим - написать программу на другом языке (например, C ++), а затем запустить ее из своего сценария php с помощью system () . Выполнение ввода-вывода Comm в C ++ тривиально.

Предполагается, что у вас достаточно доступа к серверу, чтобы настроить его для запуска исполняемого файла с помощью php и т. д.

Другой возможный способ - использовать Win32 API с помощью чего-то вроде w32api_register_function () или ffi , а затем используйте вызовы последовательной связи , чтобы заставить его работать под Windows.

У меня была та же проблема, и я уже думал о написании собственного расширения php, когда натолкнулся на это решение, популярное среди разработчиков Arduino - 'serproxy' (нашел его во многих местах, т. е. http://www.lspace.nildram.co.uk/freeware.html ) устанавливает стек tcp в / из последовательные порты и позволили мне использовать функции сокета php для связи с ним.

Вам необходимо настроить com-порт с помощью команды, подобной DOS.

Например, следующая строка выполняет команду через php:

$output = `mode COM1: BAUD=115200 PARITY=N data=8 stop=1 XON=off TO=on`;

Для отображения результатов вы можете использовать:

echo "$output"; 

Создать идентификатор ресурса:

$fp = fopen('COM1', 'r+');

if (!$fp)
{
      echo "Port not accessible";
}
else
{
     echo "Port COM1 opened successfully";
}

Запись в порт:

$writtenBytes = fputs($fp, "Hello");

echo"Bytes written to port: $writtenBytes";

Чтение из порта:

$buffer = fgets($fp);

echo "Read from buffer: $buffer";

Может быть, кто-то может помочь мне с проблемой fgets . Он помещается туда ровно на одну минуту, если TO = on , или хранится там всегда, если TO = off . Кажется, это MODE COM " вариант, так что, возможно, эксперт DOS может помочь.

Возможно, вместо fgets следует использовать fgetc , поскольку fgets перехватывает до newline , тогда как fgetc захватывает один символ. Если новая строка не обнаружена, она может блокироваться до тех пор, пока она не появится, или пока буфер не будет очищен. Одной минутной задержкой могут быть окна, очищающие свой буфер на некотором интервале.

Другой вариант - использовать объект через ActiveX в Windows. Существует несколько, в основном, коммерческих серийных объектов для COM на Windows. Вы также можете выставить объект на основе .Net и зарегистрировать его для использования COM. Конечно, это предполагает, что у вас есть элемент управления на сервере для регистрации элемента управления COM, поскольку вам потребуется последовательный интерфейс.

Другая проблема - конфликт ресурсов, если он используется через Интернет. Если это, например, принтер с последовательным интерфейсом, то администратор очередей печати будет вашим лучшим вариантом для прямой связи.

Если вы хотите иметь дело с смс, используя com-порт, то вот самый известный класс последовательной связи php от R & # 233; my Sanchez с пример кода Google . Вот тема , которая включает эту тему.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top