stm32l010 modbus rtu crc

Dependencies:   mbed

Committer:
caa45040
Date:
Thu May 26 10:00:15 2022 +0000
Revision:
0:b047a1b6f8a3
modbus rtu crc

Who changed what in which revision?

UserRevisionLine numberNew contents of line
caa45040 0:b047a1b6f8a3 1 //modbus_RTU_CRC_010_1
caa45040 0:b047a1b6f8a3 2
caa45040 0:b047a1b6f8a3 3 #include "mbed.h"
caa45040 0:b047a1b6f8a3 4
caa45040 0:b047a1b6f8a3 5 //プロトタイプ宣言
caa45040 0:b047a1b6f8a3 6 unsigned short calc_crc(unsigned char *buf, int length);
caa45040 0:b047a1b6f8a3 7
caa45040 0:b047a1b6f8a3 8
caa45040 0:b047a1b6f8a3 9 //10の割り算 0から1028までは、正しい。主に0から999
caa45040 0:b047a1b6f8a3 10 #define DIV10(n) ((n*205)>>11)
caa45040 0:b047a1b6f8a3 11
caa45040 0:b047a1b6f8a3 12
caa45040 0:b047a1b6f8a3 13 #define UART_DELAY 101 // 1/9600 98-105
caa45040 0:b047a1b6f8a3 14
caa45040 0:b047a1b6f8a3 15 DigitalOut TX(PA_2);
caa45040 0:b047a1b6f8a3 16
caa45040 0:b047a1b6f8a3 17 //仮想シリアルへの一文字出力 9600bps
caa45040 0:b047a1b6f8a3 18 int pc_putc(char ch)
caa45040 0:b047a1b6f8a3 19 {
caa45040 0:b047a1b6f8a3 20
caa45040 0:b047a1b6f8a3 21 TX=1;
caa45040 0:b047a1b6f8a3 22 TX=0;//Start
caa45040 0:b047a1b6f8a3 23 wait_us(UART_DELAY);
caa45040 0:b047a1b6f8a3 24
caa45040 0:b047a1b6f8a3 25 for(int ii=0; ii<8; ii++) { //Data x 8
caa45040 0:b047a1b6f8a3 26 TX=(ch>>ii)&1;
caa45040 0:b047a1b6f8a3 27 wait_us(UART_DELAY);
caa45040 0:b047a1b6f8a3 28 }; //for
caa45040 0:b047a1b6f8a3 29
caa45040 0:b047a1b6f8a3 30 TX=1;//Stop
caa45040 0:b047a1b6f8a3 31 wait_us(UART_DELAY);
caa45040 0:b047a1b6f8a3 32
caa45040 0:b047a1b6f8a3 33 return(0);
caa45040 0:b047a1b6f8a3 34
caa45040 0:b047a1b6f8a3 35 } //pc_putc
caa45040 0:b047a1b6f8a3 36
caa45040 0:b047a1b6f8a3 37
caa45040 0:b047a1b6f8a3 38
caa45040 0:b047a1b6f8a3 39 //文字列の表示
caa45040 0:b047a1b6f8a3 40 int pc_printf(char *str1)
caa45040 0:b047a1b6f8a3 41 {
caa45040 0:b047a1b6f8a3 42
caa45040 0:b047a1b6f8a3 43 //文字の中身がゼロか
caa45040 0:b047a1b6f8a3 44 while (*str1) {
caa45040 0:b047a1b6f8a3 45
caa45040 0:b047a1b6f8a3 46 //一文字出力
caa45040 0:b047a1b6f8a3 47 pc_putc(*str1 ++);
caa45040 0:b047a1b6f8a3 48
caa45040 0:b047a1b6f8a3 49 } //while
caa45040 0:b047a1b6f8a3 50
caa45040 0:b047a1b6f8a3 51 //戻り値
caa45040 0:b047a1b6f8a3 52 return (0);
caa45040 0:b047a1b6f8a3 53 }//pc_printf
caa45040 0:b047a1b6f8a3 54
caa45040 0:b047a1b6f8a3 55
caa45040 0:b047a1b6f8a3 56 void pc_printf_num(int num1)
caa45040 0:b047a1b6f8a3 57 {
caa45040 0:b047a1b6f8a3 58
caa45040 0:b047a1b6f8a3 59 //表示 debug
caa45040 0:b047a1b6f8a3 60 char out_buff[8];
caa45040 0:b047a1b6f8a3 61 out_buff[3] = 0;
caa45040 0:b047a1b6f8a3 62 out_buff[2] = '0' + ( num1 - (DIV10(num1) * 10) ); // '0'+(b%10)
caa45040 0:b047a1b6f8a3 63 num1 = DIV10(num1);
caa45040 0:b047a1b6f8a3 64 out_buff[1] = '0' + ( num1 - (DIV10(num1) * 10) ); // '0'+(b%10)
caa45040 0:b047a1b6f8a3 65 out_buff[0] = '0' + DIV10(num1); // '0'+(s/10)
caa45040 0:b047a1b6f8a3 66
caa45040 0:b047a1b6f8a3 67 //送信処理
caa45040 0:b047a1b6f8a3 68 //send 8 byte
caa45040 0:b047a1b6f8a3 69 pc_printf(out_buff);
caa45040 0:b047a1b6f8a3 70 //pc_printf("\r\n");
caa45040 0:b047a1b6f8a3 71
caa45040 0:b047a1b6f8a3 72 }// pc_printf_num
caa45040 0:b047a1b6f8a3 73
caa45040 0:b047a1b6f8a3 74
caa45040 0:b047a1b6f8a3 75 char c_hex[] = {
caa45040 0:b047a1b6f8a3 76 '0', '1', '2', '3', '4', '5', '6', '7',
caa45040 0:b047a1b6f8a3 77 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
caa45040 0:b047a1b6f8a3 78 };
caa45040 0:b047a1b6f8a3 79
caa45040 0:b047a1b6f8a3 80 void pc_printf_hex(char ch1)
caa45040 0:b047a1b6f8a3 81 {
caa45040 0:b047a1b6f8a3 82
caa45040 0:b047a1b6f8a3 83
caa45040 0:b047a1b6f8a3 84 //デバッグ用出力に送信
caa45040 0:b047a1b6f8a3 85 //ヘキサに値を設定
caa45040 0:b047a1b6f8a3 86 // packet move
caa45040 0:b047a1b6f8a3 87 char out_buff[8];
caa45040 0:b047a1b6f8a3 88 out_buff[0] = '[';
caa45040 0:b047a1b6f8a3 89 out_buff[1] = c_hex[(ch1 >> 4) & 0x0f];
caa45040 0:b047a1b6f8a3 90 out_buff[2] = c_hex[ch1 & 0x0f];
caa45040 0:b047a1b6f8a3 91 out_buff[3] = ']';
caa45040 0:b047a1b6f8a3 92 out_buff[4] = 0x00;
caa45040 0:b047a1b6f8a3 93
caa45040 0:b047a1b6f8a3 94 //送信処理
caa45040 0:b047a1b6f8a3 95 //send 8 byte
caa45040 0:b047a1b6f8a3 96 pc_printf(out_buff);
caa45040 0:b047a1b6f8a3 97 //pc_printf("\r\n");
caa45040 0:b047a1b6f8a3 98
caa45040 0:b047a1b6f8a3 99 }//pc_printf_hex
caa45040 0:b047a1b6f8a3 100
caa45040 0:b047a1b6f8a3 101
caa45040 0:b047a1b6f8a3 102 //メイン関数
caa45040 0:b047a1b6f8a3 103 int main()
caa45040 0:b047a1b6f8a3 104 {
caa45040 0:b047a1b6f8a3 105
caa45040 0:b047a1b6f8a3 106 pc_printf("<ST>\r\n");
caa45040 0:b047a1b6f8a3 107
caa45040 0:b047a1b6f8a3 108
caa45040 0:b047a1b6f8a3 109 //無限ループ
caa45040 0:b047a1b6f8a3 110 while(1) {
caa45040 0:b047a1b6f8a3 111
caa45040 0:b047a1b6f8a3 112 pc_printf_num(123);
caa45040 0:b047a1b6f8a3 113 pc_printf("\r\n");
caa45040 0:b047a1b6f8a3 114
caa45040 0:b047a1b6f8a3 115 pc_printf_hex(0x12);
caa45040 0:b047a1b6f8a3 116 pc_printf("\r\n");
caa45040 0:b047a1b6f8a3 117
caa45040 0:b047a1b6f8a3 118 unsigned char buff1[] = { 0x01, 0x06, 0, 0, 1, 1 };
caa45040 0:b047a1b6f8a3 119
caa45040 0:b047a1b6f8a3 120 int ret = calc_crc( buff1, 6);
caa45040 0:b047a1b6f8a3 121
caa45040 0:b047a1b6f8a3 122 pc_printf("-01 06 00 00 01 01-");
caa45040 0:b047a1b6f8a3 123 pc_printf_hex((char) ( ret & 0xff) );
caa45040 0:b047a1b6f8a3 124 pc_printf_hex((char) ( (ret>>8) & 0xff) );
caa45040 0:b047a1b6f8a3 125 pc_printf("\r\n");
caa45040 0:b047a1b6f8a3 126 pc_printf("-49--9a-\r\n");
caa45040 0:b047a1b6f8a3 127
caa45040 0:b047a1b6f8a3 128 //2秒の待ち
caa45040 0:b047a1b6f8a3 129 wait_ms(2000); //debug
caa45040 0:b047a1b6f8a3 130
caa45040 0:b047a1b6f8a3 131 }//whil
caa45040 0:b047a1b6f8a3 132
caa45040 0:b047a1b6f8a3 133
caa45040 0:b047a1b6f8a3 134 } //main
caa45040 0:b047a1b6f8a3 135
caa45040 0:b047a1b6f8a3 136
caa45040 0:b047a1b6f8a3 137 // buf 受信データ
caa45040 0:b047a1b6f8a3 138 // length 受信データ長(CRCを除く)
caa45040 0:b047a1b6f8a3 139 unsigned short calc_crc(unsigned char *buf, int length)
caa45040 0:b047a1b6f8a3 140 {
caa45040 0:b047a1b6f8a3 141 unsigned short crc = 0xFFFF;
caa45040 0:b047a1b6f8a3 142 int i,j;
caa45040 0:b047a1b6f8a3 143 unsigned char carrayFlag;
caa45040 0:b047a1b6f8a3 144 for (i = 0; i < length; i++) {
caa45040 0:b047a1b6f8a3 145 crc ^= buf[i];
caa45040 0:b047a1b6f8a3 146 for (j = 0; j < 8; j++) {
caa45040 0:b047a1b6f8a3 147 carrayFlag = crc & 1;
caa45040 0:b047a1b6f8a3 148 crc = crc >> 1;
caa45040 0:b047a1b6f8a3 149 if (carrayFlag) {
caa45040 0:b047a1b6f8a3 150 crc ^= 0xA001;
caa45040 0:b047a1b6f8a3 151 }
caa45040 0:b047a1b6f8a3 152 }
caa45040 0:b047a1b6f8a3 153 }
caa45040 0:b047a1b6f8a3 154 return crc;
caa45040 0:b047a1b6f8a3 155 }
caa45040 0:b047a1b6f8a3 156
caa45040 0:b047a1b6f8a3 157
caa45040 0:b047a1b6f8a3 158 void error(const char* format, ...) {}