시리얼포트로부터 들어온 데이터는 수신버퍼에 저장됩니다. 이 수신버퍼에 저장 된 값을 pid_read함수로 읽어서 데이터를 수신합니다.
pid_read함수는 다음과 같이 사용합니다.
pid_read($pid, $var[, $len]);
$var는 읽은 값을 저장 할 변수이고, $len은 읽을 바이트 수를 의미합니다.
이 예제는 약 1초마다 UART로 수신되는 데이터를 확인하여 출력합니다.
<?php
$pid = pid_open("/mmap/uart0"); // 0번 UART 열기
pid_ioctl($pid, "set baud 9600"); // 통신속도 9600bps
pid_ioctl($pid, "set parity 0"); // 패리티 사용 안 함
pid_ioctl($pid, "set data 8"); // 데이터 비트 8
pid_ioctl($pid, "set stop 1"); // 정지 비트 1
$rxbuf = pid_ioctl($pid, "get rxbuf"); // 수신버퍼 크기 확인
while(1)
{
$rdata = "";
$len_tot = pid_ioctl($pid, "get count rx"); // 누적 수신 데이터 카운트 확인
$rxlen = pid_ioctl($pid, "get rxlen"); // 수신 데이터 크기 확인
$rx_free = $rxbuf - $rxlen; // 버퍼 여유공간 확인
echo "$rx_free / $rxbuf\r\n"; // 수신버퍼 여유공간/크기 출력
$len = pid_read($pid, $rdata, $rxlen); // 데이터 읽기
echo "len[total] = $len[$len_tot] / "; // 읽은 데이터 크기 출력
echo "rdata = $rdata\r\n"; // 읽은 데이터 출력
sleep(1);
}
pid_close($pid);
?>
pid_write함수를 이용해 쓰기 한 데이터는 송신버퍼에 저장되었다가 UART를 통해 외부로 송신됩니다.
pid_write함수는 다음과 같이 사용합니다.
pid_write($pid, $var[, $wlen]);
$var는 쓸 데이터가 저장 된 변수이고, $wlen은 쓸 바이트 수 입니다.
이 예제는 약 1초마다 송신버퍼의 여유공간을 확인하여 UART로 데이터를 출력합니다.
<?php
$len_tot = 0;
$sdata = "0123456789";
$pid = pid_open("/mmap/uart0"); // 0번 UART 열기
pid_ioctl($pid, "set baud 9600"); // 통신속도 9600bps
$txbuf = pid_ioctl($pid, "get txbuf"); // 송신버퍼 크기 확인
while(1)
{
$len_tot = pid_ioctl($pid, "get count tx"); // 누적 송신데이터 카운트 확인
$txfree = pid_ioctl($pid, "get txfree"); // 송신버퍼 여유공간 확인
echo "txfree = $txfree\r\n"; // 송신버퍼 여유공간 출력
$len = pid_write($pid, $sdata, $txfree); // 데이터 전송
echo "len[total] = $len[$len_tot]\r\n"; // 전송한 데이터 크기 출력
sleep(1);
}
pid_close($pid);
?>
위 코드에서 pid_write함수의 세 번째 인수는 쓰기 할 데이터의 크기를 의미합니다. 쓰기 데이터크기가 송신버퍼의 여유공간보다 크면 데이터가 유실될 수 있습니다. 따라서 항상 버퍼 여유공간을 확인한 후 그 값 또는 그 이하의 값으로 쓰기 데이터 크기를 설정하시기 바랍니다.