_io_ports[M6811_SCCR1] = 0;
/* Enable reciever and transmitter & rx interrupt. */
- _io_ports[M6811_SCCR2] = 0x2c;
+ _io_ports[M6811_SCCR2] = M6811_RIE | M6811_TE | M6811_RE;
sci_have_packet = 0;
sci_rx_buf_ptr = 0;
}
}
-void rx_int() {
- if (sci_have_packet) return;
- if (sci_rx_buf_ptr >= BUFFER_LEN) {
+void sci_rx_int() {
+ if (sci_have_packet) {
/* overrun :( */
- sci_rx_buf[BUFFER_LEN] = '\0';
- sci_have_packet = 1;
- sci_rx_buf_ptr = 0;
+ _io_ports[M6811_SCDR]; /* read it anyway */
return;
}
sci_rx_buf[sci_rx_buf_ptr] = _io_ports[M6811_SCDR];
sci_rx_buf_ptr = 0;
}
sci_rx_buf_ptr++;
+ if (sci_rx_buf_ptr >= BUFFER_LEN) {
+ sci_rx_buf[BUFFER_LEN] = '\0'; /* this is as much as we could fit */
+ sci_have_packet = 1;
+ sci_rx_buf_ptr = 0;
+ }
+}
+
+void sci_interrupt_serial() {
+ if (_io_ports[M6811_SCSR] & M6811_RDRF) sci_rx_int();
}
void msg_clr() {
sci_rx_buf_ptr = 0;
}
-void sci_interrupt_serial() {
- if (_io_ports[M6811_SCSR] & M6811_RDRF) rx_int();
-}
-
void send_ack() {
sci_tx_buf[0] = '!';
sci_tx_buf[1] = '\n';