2009-03-09 38 views
7

Tôi đang tìm cách giao tiếp với cổng COM nối tiếp RS232 trên cửa sổ. Tôi đã tìm thấy 2 giải pháp trên mạng, one không hoàn toàn miễn phí (giới thiệu sự chậm trễ có chủ ý về chức năng) và another với khả năng hạn chế trên Windows. Sau này chỉ có thể ghi vào một cổng COM trên Windows, không đọc.Kết nối nối tiếp với PHP trên Windows

Tôi không thể xem mã của giải pháp đầu tiên vì nó được biên dịch thành một .dll (có nghĩa là, nếu không mọi người chỉ có thể chỉnh sửa độ trễ và không mua nó ...) và thứ hai dường như chỉ sử dụng fopen() để mở cổng và sau đó fwrite() cho nó để viết, giống như một cái sẽ làm cho một luồng. Nhưng rõ ràng là nó không trả lại gì cả.

Tôi biết nó có thể là giải pháp đầu tiên đã làm nó, mặc dù nó đòi hỏi Apache để sử dụng mô-đun php-cgi thay vì php5module.

Bất kỳ ý tưởng nào?

+0

bạn có đồng ý fread() không trả lại gì cả? Trên Windows, các cổng COM chỉ là các tệp có tên đặc biệt, IIRC. Có lẽ bạn cần phải thiết lập các tham số cổng như chẵn lẻ, baud, vv, có thể là không thể thông qua PHP? – rmeador

Trả lời

8

Mọi giải pháp trên đều không hiệu quả hoặc quá nhiều công việc.

Bạn chỉ có thể sử dụng PHP-DIO library (dio_fcntl, dio_open, dio_read, dio_write, dio_seek, ...). Nó cũng có trong the PHP manual's entry for DIO:

Gói PECL này không khả dụng theo mặc định. Để có được nó cho Windows nếu bạn có PHP 5.2.x lớn hơn 5.2.6, bạn có thể tải nó như là một phần của một bưu điện:

Cả trong số các liên kết này đã được tìm thấy trong http://www.deveblog.com/index.php/download-pecl-extensions-for-windows/

Here is the build from Linux, chỉ cần tải xuống và thực hiện cài đặt phpize/configure/make/make install.

Tôi không biết liệu nó có nên được sử dụng trong phiên Apache hay không, nhưng hãy sử dụng nó.

+1

Ôi trời, tôi đã ở đâu khi tôi hỏi những năm trước đây! Chấp nhận câu trả lời này. – syaz

4

Cách dễ nhất để giải quyết vấn đề này là viết chương trình bằng ngôn ngữ khác (chẳng hạn như C++) và sau đó thực hiện nó từ tập lệnh php của bạn với system(). Làm Comm I/O trong C++ là tầm thường.

này giả định bạn có đủ quyền truy cập vào máy chủ để cấu hình nó để cho phép thực thi để được điều hành bởi php, vv

+1

Tôi khuyên bạn nên phát triển chương trình comm của bạn như một thư viện PHP để nó tích hợp trực tiếp với mã PHP của bạn. Sử dụng system() để gọi và thực thi bên ngoài là một giải pháp phụ tối ưu. – rmeador

+2

Đồng ý, nhưng với tôi rằng không còn rơi vào "cách dễ nhất" và trở thành "cách tốt nhất". :-) – SoapBox

1

Tùy chọn khác là sử dụng đối tượng qua ActiveX trên cửa sổ. Có một số, chủ yếu là các đối tượng nối tiếp thương mại cho COM trên windows. Bạn cũng có thể trưng ra đối tượng dựa trên .Net và đăng ký nó để sử dụng COM. Tất nhiên, điều này không có nghĩa là bạn có quyền kiểm soát trên máy chủ để đăng ký một điều khiển COM, vì bạn sẽ cần một giao diện nối tiếp.

Một vấn đề khác là tranh chấp tài nguyên nếu điều này được sử dụng thông qua Web. Ví dụ: nếu đây là máy in nối tiếp, thì trình quản lý hàng đợi in sẽ là lựa chọn tốt nhất của bạn qua giao tiếp trực tiếp.

3

Bạn cần phải thiết lập các com với một lệnh dos như như:

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

Lệnh tiếp theo thực hiện các dos lệnh thông qua php:

echo"$output"; 

Tạo id tài nguyên:

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

if(!$fp){ 

echo"Port not accessible"; 

}else{ 

echo"Port COM1 opened successfully"; 

} 

Ghi vào cổng:

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

echo"Bytes written to port: $writtenBytes"; 

đọc từ cổng:

$buffer = fgets($fp); 

echo"Read from buffer: $buffer"; 

Có lẽ ai đó giúp tôi với vấn đề fgets. Nó dừng lại ở đó chính xác một phút nếu TO = on hoặc stacks mãi mãi nếu TO = off. Nó có vẻ là một tùy chọn "MODE COM" vì vậy có lẽ một chuyên gia DOS có thể giúp đỡ.

Có lẽ thay vì fgets, người ta nên sử dụng fgetc, vì fgets chụp qua đường mới. Nếu một dòng mới không gặp phải, nó có thể chặn cho đến khi có một hoặc cho đến khi bộ đệm bị xóa. Sự chậm trễ một phút có thể là cửa sổ xả bộ đệm của nó trên một khoảng thời gian.

3

Tôi đã gặp vấn đề tương tự và đã xem xét việc viết phần mở rộng php của riêng mình khi tôi tìm thấy giải pháp này phổ biến với các nhà phát triển Arduino - 'serproxy' (tìm thấy ở nhiều nơi, ví dụ: http://www.lspace.nildram.co.uk/freeware.html)/từ các cổng nối tiếp và cho phép tôi sử dụng các chức năng của ổ cắm php để giao tiếp với nó.

1

Nếu bạn muốn xử lý tin nhắn bằng cách sử dụng cổng com thì đây là số php serial communication class by Rémy Sanchez nổi tiếng nhất với google sample code. Here is a thread bao gồm chủ đề đó.

+2

Lưu ý rằng [câu trả lời chỉ liên kết được khuyến khích] (http://meta.stackoverflow.com/tags/link-only-answers/info), câu trả lời SO phải là điểm cuối của việc tìm kiếm giải pháp (so với nhưng một điểm dừng khác của tài liệu tham khảo, mà có xu hướng để có được cũ theo thời gian). Vui lòng xem xét thêm bản tóm tắt độc lập tại đây, giữ liên kết dưới dạng tham chiếu. – kleopatra

+0

Cảm ơn @kleopatra đã được hướng dẫn! – adi

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