문제

Windows에서 RS232 Serial Com 포트와 통신하는 방법을 찾고 있습니다. 그물에서 2 개의 솔루션을 찾았습니다. 하나 완전히 무료가 아닙니다 (기능의 고의적 지연을 소개합니다). 또 다른 Windows에서 기능이 제한되어 있습니다. 후자는 읽지 않고 Windows의 COM 포트에만 쓸 수 있습니다.

첫 번째 솔루션의 코드는 .dll로 컴파일되기 때문에 볼 수 없습니다 (그렇지 않으면 사람들은 지연을 편집하고 구매하지 않을 수 있습니다 ...) 두 번째는 fopen () 만 사용하는 것 같습니다. 스트림과 마찬가지로 포트를 열고 나중에 fwrite ()를 쓸 수 있습니다. 그러나 분명히 냉담한 것은 아무것도 돌려줍니다.

APACHE가 PHP5Module 대신 PHP-CGI 모듈을 사용해야하지만 첫 번째 솔루션이 수행 한 것처럼 가능하다는 것을 알고 있습니다.

어떤 아이디어?

도움이 되었습니까?

해결책

위의 모든 솔루션은 비효율적이거나 너무 많은 작업입니다.

당신은 그냥 사용할 수 있습니다 PHP-DIO 라이브러리 (dio_fcntl, dio_open, dio_read, dio_write, dio_seek, ...). 그것은 또한 안에 있습니다 PHP 매뉴얼의 DIO 항목:

이 PECL 패키지는 기본적으로 사용할 수 없습니다. PHP 5.2.x가 5.2.6보다 큰 경우 Windows를 얻으려면 ZIP의 일부로 다운로드 할 수 있습니다.

이 링크는 모두 발견되었습니다 http://www.deveblog.com/index.php/download-pecl-extensions-for-windows/

Linux의 빌드는 다음과 같습니다, 그냥 가져 와서 phpize/configure/make/make install을 작성하십시오.

Apache 세션에서 사용해야하는지 모르겠지만 가십시오.

다른 팁

이 문제를 해결하는 가장 쉬운 방법은 다른 언어 (예 : C ++)로 프로그램을 작성한 다음 PHP 스크립트에서 실행하는 것입니다. system(). C ++에서 Comm I/O를 수행하는 것은 사소한 일입니다.

이는 서버에 충분히 액세스 할 수있는 것으로 가정합니다. 실행 파일을 PHP 등으로 실행할 수 있도록 구성 할 수 있다고 가정합니다.

또 다른 가능한 방법은 다음과 같은 것을 통해 Win32 API를 사용하는 것입니다. w32api_register_function() 또는 FFI 그리고 사용하십시오 일련의 통신 호출 Windows에서 작동하도록합니다.

나는 같은 문제가 있었고 이미 Arduino 개발자 인 'Serproxy'(예 : 여러 곳에서 발견)에 인기있는이 솔루션을 발견했을 때 이미 나 자신의 PHP 확장을 작성하는 것을 고려했습니다. http://www.lspace.nildram.co.uk/freeware.html )) 직렬 포트에 대한 TCP 스택을 설정하고 PHP 소켓 함수를 사용하여 통신 할 수있었습니다.

DOS와 같은 명령을 사용하여 COM 포트를 설정해야합니다.

예를 들어, 다음 줄은 PHP를 통해 명령을 실행합니다.

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

사용할 수있는 결과를 표시하려면 다음을 수행 할 수 있습니다.

echo "$output"; 

리소스 ID 작성 :

$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 문제. 정확히 1 분 동안 거기에 쌓입니다 TO=on, 또는 그곳에 영원히 스택 TO=off. "MODE COM"옵션이므로 DOS 전문가가 도움이 될 수 있습니다.

아마도 대신 fgets, 하나는 사용해야합니다 fgetc, 부터 fgets 캡처 newline, 동안 fgetc 단일 캐릭터를 캡처합니다. 새 선이 발생하지 않으면 하나가있을 때까지 또는 버퍼가 플러시 될 때까지 차단 될 수 있습니다. 1 분 지연은 Windows가 버퍼를 구간으로 플러시하는 것일 수 있습니다.

또 다른 옵션은 Windows의 ActiveX를 통해 객체를 사용하는 것입니다. Windows에는 COM에 대한 대부분의 상용 직렬 객체가 있습니다. .NET 기반 객체를 노출시키고 COM 사용에도 등록 할 수도 있습니다. 물론 직렬 인터페이스가 필요하기 때문에 서버에 COM 컨트롤을 등록 할 수있는 제어가 있다고 가정합니다.

또 다른 문제는 웹을 통해 사용하는 경우 리소스 경합입니다. 예를 들어 직렬 프린터의 경우 인쇄 큐 관리자가 직접 통신보다 최상의 옵션이됩니다.

COM 포트를 사용하여 SMS를 처리하려면 여기에 가장 유명한 사람이 있습니다. Rémy Sanchez의 PHP 직렬 커뮤니케이션 클래스 ~와 함께 Google 샘플 코드. 여기 스레드가 있습니다 여기에는 그 주제가 포함됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top