Последовательная связь с PHP на Windows - PullRequest
8 голосов
/ 09 марта 2009

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

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

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

Есть идеи?

Ответы [ 7 ]

10 голосов
/ 28 августа 2011

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

Вы можете просто использовать библиотеку 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, но сделайте это.

4 голосов
/ 09 марта 2009

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

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

3 голосов
/ 08 ноября 2010

У меня была такая же проблема, и я уже думал о написании собственного расширения php, когда натолкнулся на это решение, популярное среди разработчиков Arduino - 'serproxy' (обнаружил его во многих местах, т.е. стек tcp в / из последовательных портов и позволил мне использовать функции сокета php для связи с ним.

3 голосов
/ 02 июля 2009

Вам необходимо настроить 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 захватывает один символ. Если новая строка не обнаружена, она может блокироваться до тех пор, пока она не появится, или пока буфер не будет очищен. Одной минутной задержкой может быть то, что окна сбрасывают свой буфер с интервалом.

3 голосов
/ 10 марта 2009

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

1 голос
/ 04 января 2014

Если вы хотите иметь дело с смс, используя com-порт, то вот самый известный класс php последовательной связи Реми Санчеса с примером google Вот тема , которая включает эту тему.

1 голос
/ 07 апреля 2009

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

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

...