2012-02-23 49 views
6

Sau đây là thư viện liên lạc nối tiếp qua PHP: http://www.phpclasses.org/package/3679-PHP-Communicate-with-a-serial-port.html. Vấn đề là phương thức readPort không được triển khai đầy đủ. Nó có thể đọc trong môi trường * nix, nhưng dường như không có trong môi trường Windows. Phương pháp:PHP - Đọc Cổng COM từ Windows

/** 
* Reads the port until no new datas are availible, then return the content. 
* 
* @pararm int $count number of characters to be read (will stop before 
* if less characters are in the buffer) 
* @return string 
*/ 
function readPort ($count = 0) 
{ 
    if ($this->_dState !== SERIAL_DEVICE_OPENED) 
    { 
     trigger_error("Device must be opened to read it", E_USER_WARNING); 
     return false; 
    } 

    if ($this->_os === "linux") 
    { 
     $content = ""; $i = 0; 

     if ($count !== 0) 
     { 
      do { 
       if ($i > $count) $content .= fread($this->_dHandle, ($count - $i)); 
       else $content .= fread($this->_dHandle, 128); 
      } while (($i += 128) === strlen($content)); 
     } 
     else 
     { 
      do { 
       $content .= fread($this->_dHandle, 128); 
      } while (($i += 128) === strlen($content)); 
     } 

     return $content; 
    } 
    elseif ($this->_os === "windows") 
    { 
     /* Do nohting : not implented yet */ 
    } 

    trigger_error("Reading serial port is not implemented for Windows", E_USER_WARNING); 
    return false; 
} 

Các trạng tác giả:

==>/\ CẢNH BÁO/\:! Nó làm việc với Linux cho r/w, nhưng với các cửa sổ tôi đã chỉ có thể làm cho viết làm việc. Nếu bạn là người dùng cửa sổ , hãy thử truy cập cổng nối tiếp qua mạng với serproxy thay thế.

Giới hạn của thư viện lớp PHP đã được đề cập trong SO nhiều lần rồi. Tôi đã không tìm thấy một giải pháp tốt. Đọc là bắt buộc đối với đơn xin của tôi.

Có ai ở đây biết phải làm gì không?

Trả lời

3

Nếu bạn có thể đảm bảo rằng bạn đang sử dụng Windows, tôi có thể đề xuất một cách tiếp cận thú vị: Sử dụng COM (như trong, COM của Microsoft, không phải cổng nối tiếp) hoặc .NET.

Có lớp .NET miễn phí mà tôi thường sử dụng được gọi là CommStudio Express. Tôi đã tìm thấy nó rất đáng tin cậy, nhưng bạn luôn có thể sử dụng standard SerialPort class được tích hợp vào .NET nếu bạn không cần phải worry about a USB-to-serial adapter getting unplugged randomly.

Trong mọi trường hợp, nó đủ dễ dàng để get at a .NET class in PHP with the DOTNET class:

$serial = new DOTNET('system', 'System.IO.Ports.SerialPort'); 
$serial->PortName = 'COM3'; 
$serial->Open(); 

tôi đã không kiểm tra mã này (không phải trên Windows tại thời điểm này), nhưng một cái gì đó như thế nên chỉ làm việc tốt. Sau đó, bạn có thể tiến hành sử dụng tất cả các phương thức .NET thông thường trong PHP.

+0

Giải pháp cần làm việc trên Windows, * Nix, v.v .. Có vẻ như tôi nên xem xét Java, nhưng ứng dụng web đã được xây dựng trên PHP. Đó là lý do tại sao tôi hy vọng cho một giải pháp PHP. Các lớp NET để giải pháp PHP âm thanh hấp dẫn, nhưng là một giải pháp hoàn toàn Windows? Tôi có thể tận dụng lợi thế của lớp .NET trong môi trường * nix, Mac, v.v. – StackOverflowNewbie

+0

Không, các giải pháp .NET và COM (một lần nữa, Microsoft COM không phải cổng nối tiếp) chỉ là Windows. Tóm tắt điều này với các phương pháp khác nhau cho các hệ thống khác nhau, tôi không có một giải pháp. Có vẻ như chắc chắn sẽ có một cách mặc dù. Không có cách khá tiêu chuẩn để fopen một thiết bị, là có? Tôi rất không quen thuộc ở cấp độ thấp hơn của PHP từ quan điểm này. – Brad

+0

Đối với những gì nó có giá trị, bạn cần phải xác định chi tiết lắp ráp đầy đủ: '$ serial = new DOTNET ('Hệ thống, Phiên bản = 2.0.0.0, Văn hóa = trung lập, PublicKeyToken = b77a5c561934e089', 'System.IO.Ports.SerialPort') ; '. Tuy nhiên - phương thức Open không hiển thị COM (đưa ra lỗi "com_exception: Không thể khởi tạo đối tượng .Net [Unwrapped, QI for IDispatch] [0x80004002] Không hỗ trợ giao diện như vậy"), vì vậy ... Tôi không nghĩ điều này sẽ làm việc mà không cần viết một wrapper .net để xuất nó. – scipilot

0

Không, DOTNET treo Cổng COM. Bạn cần khởi động lại máy tính để phát hiện lại hoặc Người dùng nâng cao thường Gỡ cài đặt và cài đặt Arduino.

Các vấn đề liên quan