You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
1014 B
C
59 lines
1014 B
C
4 weeks ago
|
/*
|
||
|
* ModbusRTUCRC.h
|
||
|
*
|
||
|
* Author: Aleksey Gerasimenko
|
||
|
* gerasimenko.aleksey.n@gmail.com
|
||
|
*/
|
||
|
|
||
|
#include <math.h>
|
||
|
#include <stdint.h>
|
||
|
|
||
|
|
||
|
#ifndef MODBUSRTU_MODBUSRTUCRC_H_
|
||
|
#define MODBUSRTU_MODBUSRTUCRC_H_
|
||
|
|
||
|
|
||
|
struct Uint16ByteField
|
||
|
{
|
||
|
uint16_t low: 8;
|
||
|
uint16_t high: 8;
|
||
|
};//Uint16ByteField
|
||
|
|
||
|
union Uint16Register
|
||
|
{
|
||
|
uint16_t all;
|
||
|
Uint16ByteField byte;
|
||
|
Uint16Register():
|
||
|
all(0)
|
||
|
{}
|
||
|
};//
|
||
|
|
||
|
|
||
|
namespace MODBUSRTU
|
||
|
{
|
||
|
|
||
|
class ModbusRTUCRC
|
||
|
{
|
||
|
private:
|
||
|
static const uint16_t m_table[256];
|
||
|
private:
|
||
|
|
||
|
Uint16Register m_crc_calculate;
|
||
|
uint16_t m_table_crc_index;
|
||
|
Uint16Register m_table_crc_value;
|
||
|
uint16_t *m_start;
|
||
|
uint16_t *m_end;
|
||
|
public:
|
||
|
ModbusRTUCRC();
|
||
|
public:
|
||
|
uint16_t calculate(uint16_t *start, uint16_t length);
|
||
|
uint16_t calculate(uint16_t *start, uint16_t *end);
|
||
|
uint16_t calculate(uint16_t databyte, uint16_t crc);
|
||
|
private:
|
||
|
inline void _while_cycle();
|
||
|
};
|
||
|
|
||
|
} /* namespace MODBUSRTU */
|
||
|
|
||
|
#endif /* MODBUSRTU_MODBUSRTUCRC_H_ */
|