diff --git a/src/main.c b/src/main.c
index c2f5f63..373f198 100644
--- a/src/main.c
+++ b/src/main.c
@@ -76,15 +76,6 @@ static int dma_ch_in_sin = -1;
 
 static queue_t iq_queue;
 
-static uint32_t read_arg(void)
-{
-	uint32_t a = getchar_timeout_us(100);
-	uint32_t b = getchar_timeout_us(100);
-	uint32_t c = getchar_timeout_us(100);
-	uint32_t d = getchar_timeout_us(100);
-	return (a << 24) | (b << 16) | (c << 8) | d;
-}
-
 static void bias_init(int in_pin, int out_pin)
 {
 	gpio_disable_pulls(in_pin);
@@ -518,6 +509,49 @@ static void rf_rx(void)
 	}
 }
 
+static void run_command(uint8_t cmd, uint32_t arg)
+{
+	if (0x01 == cmd) {
+		/* Tune to a new center frequency */
+		rx_lo_init(arg);
+	} else if (0x02 == cmd) {
+		/* Set the rate at which IQ sample pairs are sent */
+		sample_rate = arg;
+		dma_timer_set_fraction(dma_t_samp, 1, CLK_SYS_HZ / sample_rate);
+	} else if (0x04 == cmd) {
+		/* Set the tuner gain level */
+		gain = INIT_GAIN * powf(10.0f, 0.01f * arg);
+	} else if (0x0d == cmd) {
+		/* Set tuner gain by the tuner's gain index */
+		if (arg < NUM_GAINS) {
+			gain = INIT_GAIN * powf(10.0f, 0.01f * gains[arg]);
+		}
+	}
+}
+
+static bool check_command(void)
+{
+	static uint8_t buf[5];
+	static int pos = 0;
+
+	int c;
+
+	while ((c = getchar_timeout_us(0)) >= 0) {
+		if (0 == pos && 0 == c)
+			return true;
+
+		buf[pos++] = c;
+
+		if (5 == pos) {
+			uint32_t arg = (buf[1] << 24) | (buf[2] << 16) | (buf[3] << 8) | buf[4];
+			run_command(buf[0], arg);
+			pos = 0;
+		}
+	}
+
+	return false;
+}
+
 static void do_rx(int rx_pin, int bias_pin, double freq)
 {
 	rf_rx_start(rx_pin, bias_pin, freq, sample_rate);
@@ -554,32 +588,8 @@ static void do_rx(int rx_pin, int bias_pin, double freq)
 		/* Flush the queue */;
 
 	while (true) {
-		int c = getchar_timeout_us(0);
-
-		if (c >= 0) {
-			if (0x00 == c) {
-				break;
-			} else if (0x01 == c) {
-				/* Tune to a new center frequency */
-				rx_lo_init(read_arg());
-			} else if (0x02 == c) {
-				/* Set the rate at which IQ sample pairs are sent */
-				sample_rate = read_arg();
-				dma_timer_set_fraction(dma_t_samp, 1, CLK_SYS_HZ / sample_rate);
-			} else if (0x04 == c) {
-				/* Set the tuner gain level */
-				gain = INIT_GAIN * powf(10.0f, 0.01f * read_arg());
-			} else if (0x0d == c) {
-				/* Set tuner gain by the tuner's gain index */
-				uint32_t arg = read_arg();
-
-				if (arg < NUM_GAINS) {
-					gain = INIT_GAIN * powf(10.0f, 0.01f * gains[arg]);
-				}
-			} else {
-				(void)read_arg();
-			}
-		}
+		if (check_command())
+			break;
 
 		for (int i = 0; i < 32; i++) {
 			if (queue_try_remove(&iq_queue, block)) {