pid_ioctl함수의 get명령어로 UART의 각종 상태를 확인 할 수 있습니다.
$return = pid_ioctl($pid, "get ITEM");
ITEM | 설명 | 반환 값 | 반환 형식 |
---|---|---|---|
baud | 통신속도[bps] | 예) 9600 | 정수 |
parity | 패리티 | 0 / 1 / 2 / 3 / 4 | 정수 |
data | 데이터비트[bit] | 8 / 7 | 정수 |
stop | 정지비트[bit] | 1 / 2 | 정수 |
flowctrl | 흐름제어 | 0 / 1 / 2 / 3 | 정수 |
txbuf | 송신버퍼 크기[Byte] | 예) 1024 | 정수 |
txfree | 송신버퍼 여유공간[Byte] | 예) 1024 | 정수 |
count tx | 누적 송신 데이터 카운트[Byte] | 예) 65535 | 정수 |
rxbuf | 수신버퍼 크기[Byte] | 예) 1024 | 정수 |
rxlen | 수신 데이터 크기[Byte] | 예) 10 | 정수 |
count rx | 누적 수신 데이터 카운트[Byte] | 예) 65535 | 정수 |
UART의 현재 설정 값은 다음과 같이 확인 할 수 있습니다.
<?php
$pid = pid_open("/mmap/uart0"); // 0번 UART 열기
$baud = pid_ioctl($pid, "get baud"); // 통신속도
$parity = pid_ioctl($pid, "get parity"); // 패리티
$data = pid_ioctl($pid, "get data"); // 데이터비트
$stop = pid_ioctl($pid, "get stop"); // 정지비트
$flowctrl = pid_ioctl($pid, "get flowctrl"); // 흐름제어
echo "baud = $baud\r\n"; // 출력 예: baud = 9600
echo "parity = $parity\r\n"; // 출력 예: parity = 0
echo "data = $data\r\n"; // 출력 예: data = 8
echo "stop = $stop\r\n"; // 출력 예: stop = 1
echo "flowctrl = $flowctrl\r\n"; // 출력 예: flowctrl = 0
?>
UART의 송신버퍼에 남아있는 데이터 크기는 다음과 같이 계산할 수 있습니다.
송신버퍼에 남아있는 데이터 크기 = 송신버퍼 크기 - 송신버퍼 여유공간
이 예제는 0번 UART에 10바이트를 전송하고, 송신버퍼에 남아있는 데이터 크기를 계산하여 출력합니다.
<?php
$txlen = -1;
$data = "0123456789";
$pid = pid_open("/mmap/uart0"); // 0번 UART 열기
pid_ioctl($pid, "set baud 9600"); // 통신속도 9600 bps
pid_ioctl($pid, "set parity 0"); // 패리티 사용 안 함
pid_ioctl($pid, "set data 8"); // 데이터 비트 8
pid_ioctl($pid, "set stop 1"); // 정지 비트 1
pid_ioctl($pid, "set flowctrl 0"); // 흐름제어 사용 안 함
pid_write($pid, $data); // UART에 데이터($data) 송신
while($txlen)
{
$txbuf = pid_ioctl($pid, "get txbuf"); // 송신버퍼 크기 확인
$txfree = pid_ioctl($pid, "get txfree"); // 송신버퍼 여유공간 확인
$txlen = $txbuf - $txfree; // 송신버퍼에 남아있는 데이터 크기 계산
echo "tx len = $txlen\r\n"; // 송신버퍼에 남아있는 데이터 크기 출력
usleep(1000);
}
pid_close($pid);
?>
UART가 수신한 데이터 크기는 다음과 같이 확인 할 수 있습니다.
$rxlen = pid_ioctl($pid, "get rxlen[ $string]");
rxlen명령어 뒤에 특정 문자열($string)을 입력하면 pid_ioctl함수는 해당 문자열이 들어오기 전까지는 0을 반환하다가 해당 문자열이 들어오면 그 문자열까지의 수신 데이터 크기를 반환합니다.
UART의 수신버퍼 여유공간은 다음과 같이 계산할 수 있습니다.
수신버퍼 여유공간 = 수신버퍼 크기 - 수신 데이터 크기
이 예제는 0번 UART의 수신버퍼의 여유공간을 계산하여 출력합니다.
<?php
$rdata = "";
$pid = pid_open("/mmap/uart0"); // 0번 시리얼포트 열기
pid_ioctl($pid, "set baud 9600"); // 통신속도 9600 bps
pid_ioctl($pid, "set parity 0"); // 패리티 사용 안 함
pid_ioctl($pid, "set data 8"); // 데이터 비트 8
pid_ioctl($pid, "set stop 1"); // 정지 비트 1
pid_ioctl($pid, "set flowctrl 0"); // 흐름제어 사용 안 함
$rxbuf = pid_ioctl($pid, "get rxbuf"); // 수신버퍼 크기 확인
$rxlen = pid_ioctl($pid, "get rxlen"); // 수신 데이터 크기 확인
$rxfree = $rxbuf - $rxlen; // 수신버퍼 여유공간 계산
echo "rxfree = $rxfree\r\n"; // 수신버퍼 여유공간 출력
pid_close($pid);
?>