56 lines
2.0 KiB
C
56 lines
2.0 KiB
C
/**
|
|
* Serial_AdjustBaud
|
|
*
|
|
* Функция для вычисления и возврата скорости передачи данных (baud rate) на основе полученного входного пина.
|
|
*
|
|
* @param recpin входной пин для определения скорости передачи данных
|
|
*
|
|
* @return рассчитанная скорость передачи данных на основе измеренной ширины нулевого бита
|
|
*/
|
|
|
|
long detRate(int recpin) {
|
|
long baud, x, rate = 10000;
|
|
|
|
pinMode(recpin, INPUT); // make sure serial in is a input pin
|
|
digitalWrite (recpin, HIGH); // pull up enabled just for noise protection
|
|
delay(100);
|
|
|
|
// Цикл для измерения ширины нулевого бита
|
|
for (int i = 0; i < 15; i++){
|
|
// Ожидание начала низкого бита
|
|
while(digitalRead(recpin) == 1) {}
|
|
x = pulseIn(recpin, LOW); // Измерение ширины следующего нулевого бита
|
|
rate = x < rate ? x : rate; // Обновление минимальной ширины нулевого бита
|
|
}
|
|
|
|
// Определение скорости передачи данных на основе измеренной ширины нулевого бита
|
|
if (rate < 12)
|
|
baud = 115200;
|
|
else if (rate < 20)
|
|
baud = 57600;
|
|
else if (rate < 29)
|
|
baud = 38400;
|
|
else if (rate < 40)
|
|
baud = 28800;
|
|
else if (rate < 60)
|
|
baud = 19200;
|
|
else if (rate < 80)
|
|
baud = 14400;
|
|
else if (rate < 150)
|
|
baud = 9600;
|
|
else if (rate < 300)
|
|
baud = 4800;
|
|
else if (rate < 600)
|
|
baud = 2400;
|
|
else if (rate < 1200)
|
|
baud = 1200;
|
|
else if (rate < 2400)
|
|
baud = 600;
|
|
else if (rate < 4800)
|
|
baud = 300;
|
|
else
|
|
baud = 0;
|
|
|
|
return baud; // Возврат рассчитанной скорости передачи данных
|
|
}
|