CAN message container. Defines "<<" and ">>" operators to simplify adding/getting data to/from a CAN message.
Dependents: CAN_Hello EinlesenSensorabstand_digital_2 CAN_STABLE_EINSTEIN CAN_ex_STM32F103C8T6 ... more
CAN message container
In order to simplify adding/getting data to/from a CAN message the CANMsg class extends mbed's built-in CANMessage class by defining "<<" (append) and ">>" (extract) operators. Since it inherits everything from CANMessage, after importing the library into your project, you can use it instead of CANMessage without any additional modification or limitations. The usage of "<<" and ">>" operators is similar to the C++ io-streams operators.
- Before adding data to a CANMsg object it is recommended to clear it by calling its
clear()
member function. - Then set up all the other properties (ID, type, format) as needed.
- Finally append data one by one or combine them into a stream. The actual data length of a CAN message is automatically updated when using "<<" or ">>" operators. However, you have to make sure that the total length of data does not exceed eight bytes.
For an example of use have a look at this wiki page.
Import programCAN_Hello
Using CAN bus with (not just NUCLEO) mbed boards
Diff: CANMsg.h
- Revision:
- 2:2b8425b12d05
- Parent:
- 1:34738eb16cf7
- Child:
- 3:4e42fdc0459f
--- a/CANMsg.h Sat Mar 18 23:09:30 2017 +0000 +++ b/CANMsg.h Thu Mar 29 18:56:19 2018 +0000 @@ -44,32 +44,20 @@ */ template<class T> CANMsg &operator<<(const T val) { - if(len + sizeof(T) <= 8) { - *reinterpret_cast < T * > (&data[len]) = val; - len += sizeof(T); - } -#if DEBUG - else { - printf("Error: Cannot append data - exceeding CAN data length!\r\n"); - } -#endif - return *this; + MBED_ASSERT(len + sizeof(T) <= 8); + *reinterpret_cast<T*>(&data[len]) = val; + len += sizeof(T); + return *this; } /** Extract operator: Extracts data (value) from CAN message */ template<class T> CANMsg &operator>>(T& val) { - if(sizeof(T) <= len) { - val = *reinterpret_cast < T * > (&data[0]); - len -= sizeof(T); - memcpy(data, data + sizeof(T), len); - } -#if DEBUG - else { - printf("Error: Cannot extract data - exceeding CAN data length!\r\n"); - } -#endif + MBED_ASSERT(sizeof(T) <= len); + val = *reinterpret_cast<T*>(&data[0]); + len -= sizeof(T); + memcpy(data, data + sizeof(T), len); return *this; } };