Нужно отправлять по сети (UDP) на Ардуино команды. Есть PHP. Да, PHP не лучший вариант, но уж что есть.
Есть массив $asciiCommandsArray, где каждая ячейка это команда в виде строчки ASCII символов. В цикле я отправляю каждую строчку в Ардуино. Ардуино всё чётко принимает, но между отправкой команд должна быть определённая пауза. 10 миллисекунд. Я вставляю в цикл функцию usleep(10000); что равно 10 миллисекундам. Для проверки точности времени паузы, дальше пишу в массив $commandTime сколько прошло времени после выполнения предыдущей итерации. Команд > 2000. Скрипт выполняется около 30 секунд. Пауза между итерациями, судя по var_dump($commandTime); составляет 30 миллисекунд. Т.е. больше чем мне надо. Я подумал как и вы, что сами функции usleep(10000); и microtime(); забирают это время. Я сделал так: usleep(10); пауза всё равно 20 миллисекунд. Я закомментировал usleep(10);. Тут весь скрипт выполнился за 15 миллисекунд. Пробовал time_nanosleep(); и ставил несколько наносекунд - результат всё равно 15 миллисекунд. Пробовал вначале на ноуте с Denwerом, потом закинул на мощный VDS, там выполняется строго 20 миллисекунд. Т.е. если написать usleep(большое число); будет выполняться >= 15 миллисекунд но никак не меньше! Даже и не знаю что предположить. Есть идеи?
//Подключаемся к Ардуино
$fp = fsockopen('udp://172.16.1.1', 8000, $errno, $errstr);
//Засекаем время начала выполнения отправки данных
$start = microtime(true);
//Отправляем в цикле команды в Ардуино
for($i = 0; $i <= count($asciiCommandsArray) - 1; $i++){
//Отправляем АСКИ строчку в Ардуино
fwrite($fp, $asciiCommandsArray[$i]);
//Делаем паузу
usleep(10000);
//Вычисляем и запоминаем сколько прошло секунд
$commandTime[] = microtime(true) - $start;
}
echo '<br>Время выполнения скрипта: '.(microtime(true) - $start).' сек. <br>';
var_dump($commandTime);