MODSERIAL with support for more devices

Dependents:   1D-Pong BMT-K9_encoder BMT-K9-Regelaar programma_filter ... more

Check the cookbook page for more information: https://mbed.org/cookbook/MODSERIAL

Did you add a device? Please send a pull request so we can keep everything in one library instead of many copies. In that case also send a PM, since currently mbed does not inform of new pull requests. I will then also add you to the developers of this library so you can do other changes directly.

Files at this revision

API Documentation at this revision

Comitter:
Sissors
Date:
Fri Jul 12 15:27:07 2013 +0000
Parent:
27:9c93ce7cb9d8
Child:
29:9a41078f0488
Commit message:
Refactoring + KL25Z support v1.0

Changed in this revision

Device/MODSERIAL_KL25Z.cpp Show annotated file Show diff for this revision Revisions of this file
Device/MODSERIAL_KL25Z.h Show annotated file Show diff for this revision Revisions of this file
Device/MODSERIAL_LPC11U24.cpp Show annotated file Show diff for this revision Revisions of this file
Device/MODSERIAL_LPC11U24.h Show annotated file Show diff for this revision Revisions of this file
Device/MODSERIAL_LPC1768.cpp Show annotated file Show diff for this revision Revisions of this file
Device/MODSERIAL_LPC1768.h Show annotated file Show diff for this revision Revisions of this file
FLUSH.cpp Show annotated file Show diff for this revision Revisions of this file
INIT.cpp Show annotated file Show diff for this revision Revisions of this file
ISR_RX.cpp Show annotated file Show diff for this revision Revisions of this file
ISR_TX.cpp Show annotated file Show diff for this revision Revisions of this file
MACROS.h Show annotated file Show diff for this revision Revisions of this file
MODSERIAL.h Show annotated file Show diff for this revision Revisions of this file
MODSERIAL_KL25Z.cpp Show diff for this revision Revisions of this file
MODSERIAL_LPC11U24.cpp Show diff for this revision Revisions of this file
MODSERIAL_LPC1768.cpp Show diff for this revision Revisions of this file
example1.cpp Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Device/MODSERIAL_KL25Z.cpp	Fri Jul 12 15:27:07 2013 +0000
@@ -0,0 +1,20 @@
+#ifdef TARGET_KL25Z
+#include "MODSERIAL.h"
+
+void MODSERIAL::setBase(void ) {
+switch( _serial.index ) {
+        case 0: _base = UART0; _IRQ = UART0_IRQn; break;
+        case 1: _base = UART1; _IRQ = UART1_IRQn; break;
+        case 2: _base = UART2; _IRQ = UART2_IRQn; break;
+        default: _base = NULL; _IRQ = (IRQn_Type)NULL; break;
+    }
+}
+
+void MODSERIAL::initDevice(void) {};
+
+bool MODSERIAL::txIsBusy( void ) 
+{ 
+    return ( ((UART_Type*)_base)->S1 & ( 1UL << 6 ) == 0 ) ? true : false; 
+} 
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Device/MODSERIAL_KL25Z.h	Fri Jul 12 15:27:07 2013 +0000
@@ -0,0 +1,20 @@
+#if defined(TARGET_KL25Z)
+
+#define MODSERIAL_IRQ_REG ((UART_Type*)_base)->C2
+#define DISABLE_TX_IRQ MODSERIAL_IRQ_REG &= ~(1UL << UART_C2_TIE_SHIFT)
+#define DISABLE_RX_IRQ MODSERIAL_IRQ_REG &= ~(1UL << UART_C2_RIE_SHIFT)
+#define ENABLE_TX_IRQ MODSERIAL_IRQ_REG |= (1UL << UART_C2_TIE_SHIFT)
+#define ENABLE_RX_IRQ MODSERIAL_IRQ_REG |= (1UL << UART_C2_RIE_SHIFT)
+
+#define RESET_TX_FIFO while(0 == 1)
+#define RESET_RX_FIFO while(MODSERIAL_READABLE) char dummy = MODSERIAL_READ_REG
+
+#define MODSERIAL_READ_REG ((UART_Type*)_base)->D
+#define MODSERIAL_WRITE_REG ((UART_Type*)_base)->D
+#define MODSERIAL_READABLE ((((UART_Type*)_base)->S1 & (1UL<<5)) != 0)
+#define MODSERIAL_WRITABLE ((((UART_Type*)_base)->S1 & (1UL<<7)) != 0)
+
+#define RX_IRQ_ENABLED ((MODSERIAL_IRQ_REG & (1UL << UART_C2_RIE_SHIFT)) != 0 )
+#define TX_IRQ_ENABLED ((MODSERIAL_IRQ_REG & (1UL << UART_C2_TIE_SHIFT)) != 0 )
+
+#endif
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Device/MODSERIAL_LPC11U24.cpp	Fri Jul 12 15:27:07 2013 +0000
@@ -0,0 +1,17 @@
+#ifdef TARGET_LPC11U24
+#include "MODSERIAL.h"
+
+void MODSERIAL::setBase(void ) {
+    _base = LPC_USART;
+    _IRQ = UART_IRQn;
+}
+
+void MODSERIAL::initDevice(void) {
+    ((LPC_USART_Type*)_base)->FCR = (1UL<<0) + (1UL<<1) + (1UL<<2);
+    }
+
+bool MODSERIAL::txIsBusy( void ) 
+{ 
+    return ( ((LPC_USART_Type*)_base)->LSR & ( 3UL << 5 ) == 0 ) ? true : false; 
+} 
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Device/MODSERIAL_LPC11U24.h	Fri Jul 12 15:27:07 2013 +0000
@@ -0,0 +1,20 @@
+#if defined(TARGET_LPC11U24)
+
+#define MODSERIAL_IRQ_REG ((LPC_USART_Type*)_base)->IER
+#define DISABLE_TX_IRQ MODSERIAL_IRQ_REG &= ~(1UL << 1)
+#define DISABLE_RX_IRQ MODSERIAL_IRQ_REG &= ~(1UL << 0)
+#define ENABLE_TX_IRQ MODSERIAL_IRQ_REG |= (1UL << 1)
+#define ENABLE_RX_IRQ MODSERIAL_IRQ_REG |= (1UL << 0)
+
+#define RESET_TX_FIFO ((LPC_USART_Type*)_base)->FCR |= (1UL<<2)
+#define RESET_RX_FIFO ((LPC_USART_Type*)_base)->FCR |= (1UL<<1)
+
+#define MODSERIAL_READ_REG ((LPC_USART_Type*)_base)->RBR
+#define MODSERIAL_WRITE_REG ((LPC_USART_Type*)_base)->THR
+#define MODSERIAL_READABLE ((((LPC_USART_Type*)_base)->LSR & (1UL<<0)) != 0)
+#define MODSERIAL_WRITABLE ((((LPC_USART_Type*)_base)->LSR & (1UL<<5)) != 0)
+
+#define RX_IRQ_ENABLED true
+#define TX_IRQ_ENABLED true
+
+#endif
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Device/MODSERIAL_LPC1768.cpp	Fri Jul 12 15:27:07 2013 +0000
@@ -0,0 +1,24 @@
+#ifdef TARGET_LPC1768
+#include "MODSERIAL.h"
+
+
+void MODSERIAL::setBase(void ) {
+switch( _serial.index ) {
+        case 0: _base = LPC_UART0; _IRQ = UART0_IRQn; break;
+        case 1: _base = LPC_UART1; _IRQ = UART1_IRQn; break;
+        case 2: _base = LPC_UART2; _IRQ = UART2_IRQn; break;
+        case 3: _base = LPC_UART3; _IRQ = UART3_IRQn; break;
+        default: _base = NULL; _IRQ = (IRQn_Type)NULL; break;
+    }
+}
+
+void MODSERIAL::initDevice(void) {
+    ((LPC_UART_TypeDef*)_base)->FCR = (1UL<<0) + (1UL<<1) + (1UL<<2);
+    }
+
+bool MODSERIAL::txIsBusy( void ) 
+{ 
+    return ( ((LPC_UART_TypeDef*)_base)->LSR & ( 3UL << 5 ) == 0 ) ? true : false; 
+} 
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Device/MODSERIAL_LPC1768.h	Fri Jul 12 15:27:07 2013 +0000
@@ -0,0 +1,20 @@
+#if defined(TARGET_LPC1768)
+
+#define MODSERIAL_IRQ_REG ((LPC_UART_TypeDef*)_base)->IER
+#define DISABLE_TX_IRQ MODSERIAL_IRQ_REG &= ~(1UL << 1)
+#define DISABLE_RX_IRQ MODSERIAL_IRQ_REG &= ~(1UL << 0)
+#define ENABLE_TX_IRQ MODSERIAL_IRQ_REG |= (1UL << 1)
+#define ENABLE_RX_IRQ MODSERIAL_IRQ_REG |= (1UL << 0)
+
+#define RESET_TX_FIFO ((LPC_UART_TypeDef*)_base)->FCR |= (1UL<<2)
+#define RESET_RX_FIFO ((LPC_UART_TypeDef*)_base)->FCR |= (1UL<<1)
+
+#define MODSERIAL_READ_REG ((LPC_UART_TypeDef*)_base)->RBR
+#define MODSERIAL_WRITE_REG ((LPC_UART_TypeDef*)_base)->THR
+#define MODSERIAL_READABLE ((((LPC_UART_TypeDef*)_base)->LSR & (1UL<<0)) != 0)
+#define MODSERIAL_WRITABLE ((((LPC_UART_TypeDef*)_base)->LSR & (1UL<<5)) != 0)
+
+#define RX_IRQ_ENABLED true
+#define TX_IRQ_ENABLED true
+
+#endif
\ No newline at end of file
--- a/FLUSH.cpp	Thu Jul 11 13:34:53 2013 +0000
+++ b/FLUSH.cpp	Fri Jul 12 15:27:07 2013 +0000
@@ -39,7 +39,7 @@
     buffer_overflow[type] = 0;  
     switch(type) {
         case TxIrq: RESET_TX_FIFO; break;
-        case RxIrq: RESET_RX_FIFO; break;
+        case RxIrq: while(MODSERIAL_READABLE) char dummy = MODSERIAL_READ_REG; break;
     }
     MODSERIAL_IRQ_REG = irq_req;
 }
--- a/INIT.cpp	Thu Jul 11 13:34:53 2013 +0000
+++ b/INIT.cpp	Fri Jul 12 15:27:07 2013 +0000
@@ -66,7 +66,7 @@
     }
     
 
-    ENABLE_FIFO;
+    initDevice();
 
     //_FCR = MODSERIAL_FIFO_ENABLE | MODSERIAL_FIFO_RX_RESET | MODSERIAL_FIFO_TX_RESET;
     
--- a/ISR_RX.cpp	Thu Jul 11 13:34:53 2013 +0000
+++ b/ISR_RX.cpp	Fri Jul 12 15:27:07 2013 +0000
@@ -28,6 +28,7 @@
 void 
 MODSERIAL::isr_rx(void)
 {
+    if (RX_IRQ_ENABLED) {
     DigitalOut led(LED2);
     led = 1;
     if (! _base || buffer_size[RxIrq] == 0 || buffer[RxIrq] == (char *)NULL) {
@@ -55,7 +56,8 @@
         if (auto_detect_char == rxc) {
             _isr[RxAutoDetect].call(&this->callbackInfo);
         }
-    }    
+    }  
+    }  
 }
 
 }; // namespace AjK ends
--- a/ISR_TX.cpp	Thu Jul 11 13:34:53 2013 +0000
+++ b/ISR_TX.cpp	Fri Jul 12 15:27:07 2013 +0000
@@ -1,16 +1,16 @@
 /*
     Copyright (c) 2010 Andy Kirkham
- 
+
     Permission is hereby granted, free of charge, to any person obtaining a copy
     of this software and associated documentation files (the "Software"), to deal
     in the Software without restriction, including without limitation the rights
     to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     copies of the Software, and to permit persons to whom the Software is
     furnished to do so, subject to the following conditions:
- 
+
     The above copyright notice and this permission notice shall be included in
     all copies or substantial portions of the Software.
- 
+
     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
@@ -23,32 +23,33 @@
 #include "MODSERIAL.h"
 #include "MACROS.h"
 
-namespace AjK {
-
-void 
-MODSERIAL::isr_tx(bool doCallback)
+namespace AjK
 {
-    if (! _base || buffer_size[TxIrq] == 0 || buffer[TxIrq] == (char *)NULL) {
-        _isr[TxIrq].call(&this->callbackInfo); 
-        return;
-    }
-    
-    while (! MODSERIAL_TX_BUFFER_EMPTY && MODSERIAL_WRITABLE ) {
-        MODSERIAL_WRITE_REG = txc = (uint8_t)(buffer[TxIrq][buffer_out[TxIrq]]);
-        buffer_count[TxIrq]--;   
-        buffer_out[TxIrq]++;
-        if (buffer_out[TxIrq] >= buffer_size[TxIrq]) {
-            buffer_out[TxIrq] = 0;
+
+void MODSERIAL::isr_tx(bool doCallback)
+{ 
+    if (TX_IRQ_ENABLED || MODSERIAL_TX_BUFFER_FULL ) {
+        if (! _base || buffer_size[TxIrq] == 0 || buffer[TxIrq] == (char *)NULL) {
+            _isr[TxIrq].call(&this->callbackInfo);
+            return;
         }
-        if (doCallback) _isr[TxIrq].call(&this->callbackInfo);
-    }
-        
-    if ( MODSERIAL_TX_BUFFER_EMPTY ) { 
-        DISABLE_TX_IRQ;
-        _isr[TxEmpty].call(&this->callbackInfo);
-    }        
+
+        while (! MODSERIAL_TX_BUFFER_EMPTY && MODSERIAL_WRITABLE ) {
+            MODSERIAL_WRITE_REG = txc = (uint8_t)(buffer[TxIrq][buffer_out[TxIrq]]);
+            buffer_count[TxIrq]--;
+            buffer_out[TxIrq]++;
+            if (buffer_out[TxIrq] >= buffer_size[TxIrq]) {
+                buffer_out[TxIrq] = 0;
+            }
+            if (doCallback) _isr[TxIrq].call(&this->callbackInfo);
+        }
+
+        if ( MODSERIAL_TX_BUFFER_EMPTY ) {
+            DISABLE_TX_IRQ;
+            _isr[TxEmpty].call(&this->callbackInfo);
+        }
 }
-
+}
 }; // namespace AjK ends
 
-        
+
--- a/MACROS.h	Thu Jul 11 13:34:53 2013 +0000
+++ b/MACROS.h	Fri Jul 12 15:27:07 2013 +0000
@@ -23,69 +23,13 @@
 #ifndef MODSERIAL_MACROS_H
 #define MODSERIAL_MACROS_H
 
+#include "MODSERIAL_LPC1768.h"
+#include "MODSERIAL_LPC11U24.h"
+#include "MODSERIAL_KL25Z.h"
 
 #define MODSERIAL_TX_BUFFER_EMPTY (buffer_count[TxIrq]==0)
 #define MODSERIAL_RX_BUFFER_EMPTY (buffer_count[RxIrq]==0)
 #define MODSERIAL_TX_BUFFER_FULL  (buffer_count[TxIrq]==buffer_size[TxIrq])
 #define MODSERIAL_RX_BUFFER_FULL  (buffer_count[RxIrq]==buffer_size[RxIrq])
 
-
-#ifdef TARGET_LPC1768
-
-#define MODSERIAL_IRQ_REG ((LPC_UART_TypeDef*)_base)->IER
-#define DISABLE_TX_IRQ MODSERIAL_IRQ_REG &= ~(1UL << 1)
-#define DISABLE_RX_IRQ MODSERIAL_IRQ_REG &= ~(1UL << 0)
-#define ENABLE_TX_IRQ MODSERIAL_IRQ_REG |= (1UL << 1)
-#define ENABLE_RX_IRQ MODSERIAL_IRQ_REG |= (1UL << 0)
-
-#define RESET_TX_FIFO ((LPC_UART_TypeDef*)_base)->FCR |= (1UL<<2)
-#define RESET_RX_FIFO ((LPC_UART_TypeDef*)_base)->FCR |= (1UL<<1)
-#define ENABLE_FIFO ((LPC_UART_TypeDef*)_base)->FCR = (1UL<<0) + (1UL<<1) + (1UL<<2)
-
-#define MODSERIAL_READ_REG ((LPC_UART_TypeDef*)_base)->RBR
-#define MODSERIAL_WRITE_REG ((LPC_UART_TypeDef*)_base)->THR
-#define MODSERIAL_READABLE ((((LPC_UART_TypeDef*)_base)->LSR & (1UL<<0)) != 0)
-#define MODSERIAL_WRITABLE ((((LPC_UART_TypeDef*)_base)->LSR & (1UL<<5)) != 0)
-
-
-#endif
-
-#ifdef TARGET_LPC11U24
-
-#define MODSERIAL_IRQ_REG ((LPC_UART_TypeDef*)_base)->IER
-#define DISABLE_TX_IRQ MODSERIAL_IRQ_REG &= ~(1UL << 1)
-#define DISABLE_RX_IRQ MODSERIAL_IRQ_REG &= ~(1UL << 0)
-#define ENABLE_TX_IRQ MODSERIAL_IRQ_REG |= (1UL << 1)
-#define ENABLE_RX_IRQ MODSERIAL_IRQ_REG |= (1UL << 0)
-
-#define RESET_TX_FIFO ((LPC_UART_TypeDef*)_base)->FCR |= (1UL<<2)
-#define RESET_RX_FIFO ((LPC_UART_TypeDef*)_base)->FCR |= (1UL<<1)
-#define ENABLE_FIFO ((LPC_UART_TypeDef*)_base)->FCR = (1UL<<0) + (1UL<<1) + (1UL<<2)
-
-#define MODSERIAL_READ_REG ((LPC_UART_TypeDef*)_base)->RBR
-#define MODSERIAL_WRITE_REG ((LPC_UART_TypeDef*)_base)->THR
-#define MODSERIAL_READABLE ((((LPC_UART_TypeDef*)_base)->LSR & (1UL<<0)) != 0)
-#define MODSERIAL_WRITABLE ((((LPC_UART_TypeDef*)_base)->LSR & (1UL<<5)) != 0)
-
-#endif
-
-#ifdef TARGET_KL25Z
-
-#define MODSERIAL_IRQ_REG ((UART_Type*)_base)->C2
-#define DISABLE_TX_IRQ MODSERIAL_IRQ_REG &= ~(1UL << UART_C2_TIE_SHIFT)
-#define DISABLE_RX_IRQ MODSERIAL_IRQ_REG &= ~(1UL << UART_C2_RIE_SHIFT)
-#define ENABLE_TX_IRQ MODSERIAL_IRQ_REG |= (1UL << UART_C2_TIE_SHIFT)
-#define ENABLE_RX_IRQ MODSERIAL_IRQ_REG |= (1UL << UART_C2_RIE_SHIFT)
-
-#define RESET_TX_FIFO while(0 == 1)
-#define RESET_RX_FIFO while(0 == 1)
-#define ENABLE_FIFO while(0 == 1)
-
-#define MODSERIAL_READ_REG ((UART_Type*)_base)->D
-#define MODSERIAL_WRITE_REG ((UART_Type*)_base)->D
-#define MODSERIAL_READABLE ((((UART_Type*)_base)->S1 & (1UL<<5)) != 0)
-#define MODSERIAL_WRITABLE ((((UART_Type*)_base)->S1 & (1UL<<7)) != 0)
-
-#endif
-
-#endif
+#endif
\ No newline at end of file
--- a/MODSERIAL.h	Thu Jul 11 13:34:53 2013 +0000
+++ b/MODSERIAL.h	Fri Jul 12 15:27:07 2013 +0000
@@ -1061,8 +1061,17 @@
 
 
 //DEVICE SPECIFIC FUNCTIONS:
+    private:
+    /**
+    * Set pointers to UART and IRQ
+    */
     void setBase( void );
     
+    /**
+    * If required, allows for adding specific settings
+    */
+    void initDevice( void );
+    
     IRQn_Type _IRQ;
     
     public:
@@ -1077,7 +1086,6 @@
      */
     bool txIsBusy(void);
     
-    
 
 };
 
--- a/MODSERIAL_KL25Z.cpp	Thu Jul 11 13:34:53 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-#ifdef TARGET_KL25Z
-#include "MODSERIAL.h"
-
-void MODSERIAL::setBase(void ) {
-switch( _serial.index ) {
-        case 0: _base = UART0; _IRQ = UART0_IRQn; break;
-        case 1: _base = UART1; _IRQ = UART1_IRQn; break;
-        case 2: _base = UART2; _IRQ = UART2_IRQn; break;
-        default: _base = NULL; _IRQ = (IRQn_Type)NULL; break;
-    }
-}
-
-bool MODSERIAL::txIsBusy( void ) 
-{ 
-    return ( ((UART_Type*)_base)->S1 & ( 1UL << 6 ) == 0 ) ? true : false; 
-} 
-#endif
-
--- a/MODSERIAL_LPC11U24.cpp	Thu Jul 11 13:34:53 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-#ifdef TARGET_LPC11U24
-#include "MODSERIAL.h"
-
-void MODSERIAL::setBase(void ) {
-    _base = LPC_USART;
-    _IRQ = UART_IRQn;
-}
-
-bool MODSERIAL::txIsBusy( void ) 
-{ 
-    return ( ((LPC_USART_Type*)_base)->LSR & ( 3UL << 5 ) == 0 ) ? true : false; 
-} 
-#endif
--- a/MODSERIAL_LPC1768.cpp	Thu Jul 11 13:34:53 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-#ifdef TARGET_LPC1768
-#include "MODSERIAL.h"
-
-
-void MODSERIAL::setBase(void ) {
-switch( _serial.index ) {
-        case 0: _base = LPC_UART0; _IRQ = UART0_IRQn; break;
-        case 1: _base = LPC_UART1; _IRQ = UART1_IRQn; break;
-        case 2: _base = LPC_UART2; _IRQ = UART2_IRQn; break;
-        case 3: _base = LPC_UART3; _IRQ = UART3_IRQn; break;
-        default: _base = NULL; _IRQ = (IRQn_Type)NULL; break;
-    }
-}
-
-bool MODSERIAL::txIsBusy( void ) 
-{ 
-    return ( ((LPC_UART_TypeDef*)_base)->LSR & ( 3UL << 5 ) == 0 ) ? true : false; 
-} 
-
-#endif
--- a/example1.cpp	Thu Jul 11 13:34:53 2013 +0000
+++ b/example1.cpp	Fri Jul 12 15:27:07 2013 +0000
@@ -10,7 +10,7 @@
 
 DigitalOut led1(LED1);
 DigitalOut led2(LED2);
-DigitalOut led3(LED2);
+DigitalOut led3(LED3);
 DigitalOut led4(LED4);
 
 MODSERIAL pc(USBTX, USBRX);
@@ -57,7 +57,7 @@
     pc.baud(PC_BAUD);
     
     // Use a deliberatly slow baud to fill up the TX buffer
-    uart.baud(300);
+    uart.baud(1200);
     
     uart.attach(&txCallback, MODSERIAL::TxIrq);
     uart.attach(&rxCallback, MODSERIAL::RxIrq);
@@ -68,19 +68,18 @@
     
     led1 = 1; // Show start of sending with LED1.
     
-    for (int loop = 0; loop < 2; loop++) {
+    for (int loop = 0; loop < 512; loop++) {
         uart.printf("%c", c);        
         c++;
         if (c > 'Z') c = 'A';
     }
-    pc.printf("%c", '!');
+    
     led1 = 0; // Show the end of sending by switching off LED1.
     
     // End program. Flash LED4. Notice how LED 2 and 3 continue
     // to flash for a short period while the interrupt system 
     // continues to send the characters left in the TX buffer.
-    wait(2);
-    pc.printf("\n\n\r%02X", UART2->C2);
+    
     while(1) {
         led4 = !led4;
         wait(0.25);