Официальный сайт компании Arduino по адресу arduino.cc
Скорость передачи чисел через COM-порт (Arduino Uno)
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Пт, 22/02/2019 - 10:41
Я новичек, купил себе плату с Uno R3 (16U2).
Решил проверить, как работает передача данных через COM-порт (на скорости 115200).
Написал в цикле: Serial.print(77); на принимающем компе замерил скорость приема данных, то есть скорость передачи. Получилось чуть меньше 100 Кбит/с, гут. Функция print передает числа символами, то есть 77 передается как '7' и '7' (2 байта), а число 777.7 - как '7', '7', '7', '.' и '7' (5 байт), что меня, конечно не устраивает.
Поэтому я, конечно, воспользовался функцией Serial.write(x, n). Отлично, теперь byte приходит как 1 байт. Замерил скорость... всего 40 Кбит/с !!!
Это что за такое, кто может объяснить феномен? Может, надо как-то по-другому делать?
Как ты передавал, как принимал, как измерял, всё это знаешь только ты, а потому только ты и можешь ответить на свой вопрос.
Феномен прост - ошибка в понимании называется, скорость 115200 и есть 100Кбит с учетом старта, стопа и возможно контрольного.
Logik, ты не потрудился дочитать пост ТС до конца, а потому в твоём ответе, как всегда, никакой логики :(
А в твоих вобще смысла нет, инфы ноль, подесаульщина одна ;)
Ой, тока не надо, пжалста! Ну, поторопился ответить не дочитав, пукнул чуток в лужу, чё теперь холивар-то раздувать? Уймись, и впредь читай внимательно.
А как мерил скорость. Чем?
Не, так не пойдёт. Внимательно читаем правила, и вставляем код как положено.
Плохо там все. И n=2 и
double
и синусы всякие не так быстро считаются.Синусы тут не при чем, если передавать константу, а синусы закомментировать, скорость не изменится. При n = 1 - то же самое; пробовал передавать по многу байт, например, n = 512 - скорость только падает.
Поставте n в пару десятков, отпарвку массива с константами, прежде чем делать отправку - проверте что есть свободное место в буфере и луп не держать в вечном цикле там четотипа
for (;;) {
loop();
if (serialEventRun) serialEventRun();
}
И будет счасте.
Коментировать не только синус надо бы, все с
double
не быстрое.Спасибо! Надо же, все дело оказалось таки в синусе! Раньше я как-то не так смотрел, что ли... В общем, меня подвела уверенность высокоуровневого программиста в том, что "всякие там функции" не требуют существенного времени...
И что любопытно: если все-таки считать синус, то в случае double скорость получается 39,8 Кбит/с, а в случае float - 40,6 Кбит/с. А ведь я где-то читал, что в ардуине double - это то же, что и float, как же так?
Вдогонку: а как проверять заполненность буфера, не подскажете?
Вопрос не так уж и прост. Даже по описанию http://arduino.ru/Reference/Serial/Flush видно что есть варианты. А вобще все ответы на все вопросы - здесь ..\arduino-хххх\hardware\arduino\avr\cores\arduino\ и в даташите на контроллер.
Вопрос не так уж и прост. Даже по описанию http://arduino.ru/Reference/Serial/Flush видно что есть варианты. А вобще все ответы на все вопросы - здесь ..\arduino-хххх\hardware\arduino\avr\cores\arduino\ и в даташите на контроллер.
Вот открыл \arduino-1.8.3\hardware\arduino\avr\cores\arduino\HardwareSerial.h а там virtual int availableForWrite(void); - наверно оно.
Самоцитатнулся ,не ту кнопку тыцнул!
Не могу понять, как пойти по этим Вашим относительным ссылкам :):):)
А это у Вас на диске, где ардуино инсталена.
А это у Вас на диске, где ардуино инсталена.
Спа-си-бо.