UART 사용


데이터 수신

시리얼포트로부터 들어온 데이터는 수신버퍼에 저장됩니다. 이 수신버퍼에 저장 된 값을 pid_read함수로 읽어서 데이터를 수신합니다.

use uart 1

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를 통해 외부로 송신됩니다.

use uart 2

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함수의 세 번째 인수는 쓰기 할 데이터의 크기를 의미합니다. 쓰기 데이터크기가 송신버퍼의 여유공간보다 크면 데이터가 유실될 수 있습니다. 따라서 항상 버퍼 여유공간을 확인한 후 그 값 또는 그 이하의 값으로 쓰기 데이터 크기를 설정하시기 바랍니다.