work fine.

Dependencies:   mbed

Committer:
lixianyu
Date:
Thu Jun 02 04:03:31 2016 +0000
Revision:
0:362c1482232c
work fine.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lixianyu 0:362c1482232c 1 #include "Microduino_Protocol_HardSer.h"
lixianyu 0:362c1482232c 2 #include "MicroduinoPinNames.h"
lixianyu 0:362c1482232c 3 //Timer _timer;
lixianyu 0:362c1482232c 4 extern Timer g_cubeTimer;
lixianyu 0:362c1482232c 5 //DigitalOut myled(D13);
lixianyu 0:362c1482232c 6 uint8_t getChecksum(uint8_t length, uint8_t cmd, uint8_t mydata[])
lixianyu 0:362c1482232c 7 {
lixianyu 0:362c1482232c 8 //三个参数分别为: 数据长度 , 指令代码 , 实际数据数组
lixianyu 0:362c1482232c 9 uint8_t checksum = 0;
lixianyu 0:362c1482232c 10 checksum ^= (length & 0xFF);
lixianyu 0:362c1482232c 11 checksum ^= (cmd & 0xFF);
lixianyu 0:362c1482232c 12 for (int i = 0; i < length; i++) checksum ^= (mydata[i] & 0xFF);
lixianyu 0:362c1482232c 13 return checksum;
lixianyu 0:362c1482232c 14 }
lixianyu 0:362c1482232c 15
lixianyu 0:362c1482232c 16 /* Protocol::Protocol(PRO_PORT *ser , byte _channel) {
lixianyu 0:362c1482232c 17 // common_init(); // Set everything to common state, then...
lixianyu 0:362c1482232c 18 this->channel = _channel;
lixianyu 0:362c1482232c 19 this->num = 0;
lixianyu 0:362c1482232c 20 this->sta = false;
lixianyu 0:362c1482232c 21 this->error = false;
lixianyu 0:362c1482232c 22 P_Serial = ser; // ...override P_Serial with value passed.
lixianyu 0:362c1482232c 23 } */
lixianyu 0:362c1482232c 24 static void uart_callback(void)
lixianyu 0:362c1482232c 25 {
lixianyu 0:362c1482232c 26 //myled = !myled;
lixianyu 0:362c1482232c 27 }
lixianyu 0:362c1482232c 28 void Protocol::begin(uint16_t _baud)
lixianyu 0:362c1482232c 29 {
lixianyu 0:362c1482232c 30 //myled = 0;
lixianyu 0:362c1482232c 31 //_timer.start();
lixianyu 0:362c1482232c 32 //P_Serial->begin(_baud);
lixianyu 0:362c1482232c 33 P_Serial->baud(_baud);
lixianyu 0:362c1482232c 34 //P_Serial->attach(uart_callback, Serial::RxIrq);
lixianyu 0:362c1482232c 35 //delay(20);
lixianyu 0:362c1482232c 36 //wait_ms(20);
lixianyu 0:362c1482232c 37 }
lixianyu 0:362c1482232c 38
lixianyu 0:362c1482232c 39 bool Protocol::available(bool _sta)
lixianyu 0:362c1482232c 40 {
lixianyu 0:362c1482232c 41 //if (P_Serial->available() > 0) {
lixianyu 0:362c1482232c 42 if (P_Serial->readable() > 0) {
lixianyu 0:362c1482232c 43 if (_sta) {
lixianyu 0:362c1482232c 44 this->inCache = this->inChar;
lixianyu 0:362c1482232c 45 //this->inChar = P_Serial->read();
lixianyu 0:362c1482232c 46 this->inChar = P_Serial->getc();
lixianyu 0:362c1482232c 47 this->buffer[num] = this->inChar;
lixianyu 0:362c1482232c 48
lixianyu 0:362c1482232c 49 if (this->num > BUFFER_MAX - 1) {
lixianyu 0:362c1482232c 50 this->num = 0;
lixianyu 0:362c1482232c 51 return false;
lixianyu 0:362c1482232c 52 } else {
lixianyu 0:362c1482232c 53 this->num++;
lixianyu 0:362c1482232c 54 }
lixianyu 0:362c1482232c 55 }
lixianyu 0:362c1482232c 56 return true;
lixianyu 0:362c1482232c 57 }
lixianyu 0:362c1482232c 58 return false;
lixianyu 0:362c1482232c 59 }
lixianyu 0:362c1482232c 60
lixianyu 0:362c1482232c 61 uint8_t Protocol::parse(uint16_t* _data, bool _mod)
lixianyu 0:362c1482232c 62 {
lixianyu 0:362c1482232c 63 if (available(!_mod)) {
lixianyu 0:362c1482232c 64 //time = millis();
lixianyu 0:362c1482232c 65 //time = _timer.read_ms();
lixianyu 0:362c1482232c 66 time = g_cubeTimer.read_ms();
lixianyu 0:362c1482232c 67 do {
lixianyu 0:362c1482232c 68 if (this->sta) {
lixianyu 0:362c1482232c 69 this->sta = false;
lixianyu 0:362c1482232c 70 this->num = 0;
lixianyu 0:362c1482232c 71 if (this->inChar == this->channel) {
lixianyu 0:362c1482232c 72 this->error = false;
lixianyu 0:362c1482232c 73 if (!_mod) {
lixianyu 0:362c1482232c 74 return P_BUSY;
lixianyu 0:362c1482232c 75 }
lixianyu 0:362c1482232c 76 } else {
lixianyu 0:362c1482232c 77 this->error = true;
lixianyu 0:362c1482232c 78 return P_ERROR;
lixianyu 0:362c1482232c 79 }
lixianyu 0:362c1482232c 80 }
lixianyu 0:362c1482232c 81
lixianyu 0:362c1482232c 82 if (this->inChar == 0xBB && this->inCache == 0xAA) {
lixianyu 0:362c1482232c 83 this->sta = true;
lixianyu 0:362c1482232c 84 if (!_mod) {
lixianyu 0:362c1482232c 85 return P_BUSY;
lixianyu 0:362c1482232c 86 }
lixianyu 0:362c1482232c 87 }
lixianyu 0:362c1482232c 88
lixianyu 0:362c1482232c 89 if (this->num == (CHANNEL_NUM * 2 + 1) && !this->error) {
lixianyu 0:362c1482232c 90 this->inCache = this->buffer[CHANNEL_NUM * 2];
lixianyu 0:362c1482232c 91 this->buffer[CHANNEL_NUM * 2] = NULL;
lixianyu 0:362c1482232c 92 this->inChar = getChecksum(CHANNEL_NUM * 2, 200, this->buffer);
lixianyu 0:362c1482232c 93
lixianyu 0:362c1482232c 94 this->num = 0;
lixianyu 0:362c1482232c 95 if (!this->error && this->inCache == this->inChar) {
lixianyu 0:362c1482232c 96 for (uint8_t a = 0; a < CHANNEL_NUM; a++) {
lixianyu 0:362c1482232c 97 _data[a] = ((uint16_t)(this->buffer[a * 2])) | ((uint16_t)this->buffer[a * 2 + 1] << 8);
lixianyu 0:362c1482232c 98 }
lixianyu 0:362c1482232c 99 return P_FINE;
lixianyu 0:362c1482232c 100 } else {
lixianyu 0:362c1482232c 101 return P_ERROR;
lixianyu 0:362c1482232c 102 }
lixianyu 0:362c1482232c 103 } else if (!_mod) {
lixianyu 0:362c1482232c 104 return P_BUSY;
lixianyu 0:362c1482232c 105 }
lixianyu 0:362c1482232c 106 } while (_mod && (available(true) && g_cubeTimer.read_ms() - time < 100));
lixianyu 0:362c1482232c 107
lixianyu 0:362c1482232c 108 if (_mod) {
lixianyu 0:362c1482232c 109 return P_TIMEOUT;
lixianyu 0:362c1482232c 110 }
lixianyu 0:362c1482232c 111 } else {
lixianyu 0:362c1482232c 112 return P_NONE;
lixianyu 0:362c1482232c 113 }
lixianyu 0:362c1482232c 114 }