This library assign registar and send 4bytes data in serial. Auto attachment interruption.

Dependents:   WRS_mechanamu_test

Committer:
sgrsn
Date:
Fri Jun 29 08:31:42 2018 +0000
Revision:
0:56fce4868747
Child:
1:ee6809d3cee3
hahaha

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sgrsn 0:56fce4868747 1 #include "PacketSerial.h"
sgrsn 0:56fce4868747 2
sgrsn 0:56fce4868747 3 PacketSerial::PacketSerial(PinName tx, PinName rx, int32_t* registar) : Serial(tx, rx)
sgrsn 0:56fce4868747 4 {
sgrsn 0:56fce4868747 5 _registar = registar;
sgrsn 0:56fce4868747 6 Serial::baud(9600);
sgrsn 0:56fce4868747 7 Serial::attach(this, &PacketSerial::readData, Serial::RxIrq);
sgrsn 0:56fce4868747 8 }
sgrsn 0:56fce4868747 9
sgrsn 0:56fce4868747 10 void PacketSerial::writeData(int32_t data, uint8_t reg)
sgrsn 0:56fce4868747 11 {
sgrsn 0:56fce4868747 12 uint8_t dataBytes[4] =
sgrsn 0:56fce4868747 13 {
sgrsn 0:56fce4868747 14 (data >> 24) & 0xFF,
sgrsn 0:56fce4868747 15 (data >> 16) & 0xFF,
sgrsn 0:56fce4868747 16 (data >> 8) & 0xFF,
sgrsn 0:56fce4868747 17 (data >> 0) & 0xFF
sgrsn 0:56fce4868747 18 };
sgrsn 0:56fce4868747 19
sgrsn 0:56fce4868747 20 Serial::putc(HEAD_BYTE);
sgrsn 0:56fce4868747 21 Serial::putc(reg);
sgrsn 0:56fce4868747 22 uint8_t checksum = 0;
sgrsn 0:56fce4868747 23 for (uint8_t i = 0; i < 4; ++i)
sgrsn 0:56fce4868747 24 {
sgrsn 0:56fce4868747 25 if ((dataBytes[i] == ESCAPE_BYTE) || (dataBytes[i] == HEAD_BYTE))
sgrsn 0:56fce4868747 26 {
sgrsn 0:56fce4868747 27 Serial::putc(ESCAPE_BYTE);
sgrsn 0:56fce4868747 28 checksum += ESCAPE_BYTE;
sgrsn 0:56fce4868747 29 Serial::putc(dataBytes[i] ^ ESCAPE_MASK);
sgrsn 0:56fce4868747 30 checksum += dataBytes[i] ^ ESCAPE_MASK;
sgrsn 0:56fce4868747 31 }
sgrsn 0:56fce4868747 32 else
sgrsn 0:56fce4868747 33 {
sgrsn 0:56fce4868747 34 Serial::putc(dataBytes[i]);
sgrsn 0:56fce4868747 35 checksum += dataBytes[i];
sgrsn 0:56fce4868747 36 }
sgrsn 0:56fce4868747 37 }
sgrsn 0:56fce4868747 38
sgrsn 0:56fce4868747 39 // 末尾にチェックサムを追加で送信する
sgrsn 0:56fce4868747 40 Serial::putc(checksum);
sgrsn 0:56fce4868747 41 }
sgrsn 0:56fce4868747 42
sgrsn 0:56fce4868747 43 void PacketSerial::writeFloatData(float data, uint8_t reg)
sgrsn 0:56fce4868747 44 {
sgrsn 0:56fce4868747 45 int integer = (int)data;
sgrsn 0:56fce4868747 46 uint32_t decimal = (uint32_t)((data-integer)*1000000);
sgrsn 0:56fce4868747 47 writeData(integer, reg);
sgrsn 0:56fce4868747 48 writeData(decimal, reg+1);
sgrsn 0:56fce4868747 49 }
sgrsn 0:56fce4868747 50
sgrsn 0:56fce4868747 51 float PacketSerial::getFloatData(uint8_t reg)
sgrsn 0:56fce4868747 52 {
sgrsn 0:56fce4868747 53 return *(_registar + reg) + ((float)*(_registar + reg+1))/1000000;
sgrsn 0:56fce4868747 54 }
sgrsn 0:56fce4868747 55
sgrsn 0:56fce4868747 56 void PacketSerial::readData()
sgrsn 0:56fce4868747 57 {
sgrsn 0:56fce4868747 58 uint8_t bytes[4] = {0,0,0,0};
sgrsn 0:56fce4868747 59 int8_t checksum = 0;
sgrsn 0:56fce4868747 60 wait_us(500);
sgrsn 0:56fce4868747 61 uint8_t data = Serial::getc();
sgrsn 0:56fce4868747 62 wait_us(500);
sgrsn 0:56fce4868747 63
sgrsn 0:56fce4868747 64 if (data == HEAD_BYTE)
sgrsn 0:56fce4868747 65 {
sgrsn 0:56fce4868747 66 uint8_t reg = Serial::getc();
sgrsn 0:56fce4868747 67 for (int i = 0; i < 4; ++i)
sgrsn 0:56fce4868747 68 {
sgrsn 0:56fce4868747 69 uint8_t d = Serial::getc();
sgrsn 0:56fce4868747 70 wait_us(500);
sgrsn 0:56fce4868747 71 if (d == ESCAPE_BYTE)
sgrsn 0:56fce4868747 72 {
sgrsn 0:56fce4868747 73 uint8_t nextByte = Serial::getc();
sgrsn 0:56fce4868747 74 bytes[i] = nextByte ^ ESCAPE_MASK;
sgrsn 0:56fce4868747 75 checksum += (d + nextByte);
sgrsn 0:56fce4868747 76 }
sgrsn 0:56fce4868747 77 else
sgrsn 0:56fce4868747 78 {
sgrsn 0:56fce4868747 79 bytes[i] = d;
sgrsn 0:56fce4868747 80 checksum += d;
sgrsn 0:56fce4868747 81 }
sgrsn 0:56fce4868747 82 }
sgrsn 0:56fce4868747 83 int8_t checksum_recv = Serial::getc();
sgrsn 0:56fce4868747 84 wait_us(500);
sgrsn 0:56fce4868747 85 int32_t DATA = 0x00;
sgrsn 0:56fce4868747 86 for(int i = 0; i < 4; i++)
sgrsn 0:56fce4868747 87 {
sgrsn 0:56fce4868747 88 DATA |= (((int32_t)bytes[i]) << (24 - (i*8)));
sgrsn 0:56fce4868747 89 }
sgrsn 0:56fce4868747 90
sgrsn 0:56fce4868747 91 if (checksum == checksum_recv)
sgrsn 0:56fce4868747 92 {
sgrsn 0:56fce4868747 93 *(_registar + reg) = DATA;
sgrsn 0:56fce4868747 94 }
sgrsn 0:56fce4868747 95 else
sgrsn 0:56fce4868747 96 {
sgrsn 0:56fce4868747 97 // data error
sgrsn 0:56fce4868747 98 }
sgrsn 0:56fce4868747 99 }
sgrsn 0:56fce4868747 100 }