Ejemplo CAN Hello W!

Dependencies:   mbed-dev CANnucleo

Revision:
25:1d0488a03905
Parent:
24:e2907bcba75e
Child:
26:f71400b1fa56
--- a/main.cpp	Tue Mar 07 21:28:19 2017 +0000
+++ b/main.cpp	Wed Mar 08 19:19:22 2017 +0000
@@ -20,7 +20,7 @@
  */ 
 
 #define BOARD1                1     // comment out this line when compiling for board #2
-#define TARGET_STM32F103C8T6  1     // uncomment this line when using STM32F103C8T6 boards!                                    
+//#define TARGET_STM32F103C8T6  1     // uncomment this line when using STM32F103C8T6 boards!                                    
 
 #if defined(TARGET_STM32F103C8T6)
     #include "stm32f103c8t6.h"
@@ -53,9 +53,10 @@
 CANnucleo::CANMessage   rxMsg;
 CANnucleo::CANMessage   txMsg;
 DigitalOut              led(LED_PIN);
-int                     ledState;
 Timer                   timer;
-int                     counter = 0;
+uint8_t                 counter = 0;
+AnalogIn                analogIn(A0);
+float                   voltage;
 volatile bool           msgAvailable = false;
 Serial*                 pc;
 
@@ -71,6 +72,23 @@
 }
 
 /**
+ * @brief   Prints CAN msg to PC's serial terminal
+ * @note}
+ * @param   CANMessage to print
+ * @retval  none
+ */
+void printMsg(CANnucleo::CANMessage& msg) {
+    pc->printf("  ID      = 0x%.3x\r\n", msg.id);
+    pc->printf("  Type    = %d\r\n", msg.type);
+    pc->printf("  Format  = %d\r\n", msg.format);
+    pc->printf("  Length  = %d\r\n", msg.len);
+    pc->printf("  Data    =");            
+    for(int i = 0; i < msg.len; i++)
+        pc->printf(" %.2x", msg.data[i]);
+    pc->printf("\r\n");
+ }
+
+/**
  * @brief   Main
  * @note
  * @param 
@@ -99,24 +117,18 @@
             timer.stop();                       // stop timer
             timer.reset();                      // reset timer
             counter++;                          // increment counter
-            ledState = led.read();              // get led state
             txMsg.clear();                      // clear Tx message storage
             txMsg.id = TX_ID;                   // set ID
-            txMsg << counter << ledState;       // append data (total data length must be <= 8 bytes!)
+            voltage = (analogIn * 5)/4096.0f;   // small floating voltage at analog input
+            txMsg << counter << voltage;        // append data (total data length must be <= 8 bytes!)
             led = OFF;                          // turn LED off
             if(can->write(txMsg)) {             // transmit message
                 pc->printf("-----------------------------------\r\n");
-                pc->printf("CAN message sent\r\n"); 
-                pc->printf("  ID      = 0x%.3x\r\n", txMsg.id);
-                pc->printf("  Type    = %d\r\n", txMsg.type);
-                pc->printf("  Format  = %d\r\n", txMsg.format);
-                pc->printf("  Length  = %d\r\n", txMsg.len);
-                pc->printf("  Data    =");            
-                for(int i = 0; i < txMsg.len; i++)
-                    pc->printf(" %.2x", txMsg.data[i]);
-                pc->printf("\r\n");
+                pc->printf("CAN message sent\r\n");
+                printMsg(txMsg);
                 pc->printf("  counter = %d\r\n", counter);
-            }
+                pc->printf("  voltage = %e V\r\n", voltage);
+             }
             else
                 pc->printf("Transmission error\r\n");
         }
@@ -124,18 +136,12 @@
             msgAvailable = false;               // reset flag for next use
             can->read(rxMsg);                   // read message into Rx message storage
             pc->printf("CAN message received\r\n");
-            pc->printf("  ID      = 0x%.3x\r\n", rxMsg.id);
-            pc->printf("  Type    = %d\r\n", rxMsg.type);
-            pc->printf("  Format  = %d\r\n", rxMsg.format);
-            pc->printf("  Length  = %d\r\n", rxMsg.len);
-            pc->printf("  Data    =");            
-            for(int i = 0; i < rxMsg.len; i++)
-                pc->printf(" %.2x", rxMsg.data[i]);
-            pc->printf("\r\n");
+            printMsg(rxMsg);
             // Filtering performed by software:           
             if(rxMsg.id == RX_ID) {             // About filtering performed by hardware see comments in CANnucleo.cpp 
-                rxMsg >> counter >> ledState;   // extract data
+                rxMsg >> counter >> voltage;    // extract data
                 pc->printf("  counter = %d\r\n", counter);
+                pc->printf("  voltage = %e V\r\n", voltage);
                 led = ON;                       // turn LED on
                 timer.start();                  // transmission lag
             }