nucleo-l432kcのテンプレートです。
Dependencies: mbed ros_lib_kinetic
library/scrp_master.cpp
- Committer:
- TanakaRobo
- Date:
- 2019-08-15
- Revision:
- 4:47f17b5ac6e7
File content as of revision 4:47f17b5ac6e7:
#include "scrp_master.hpp" #define STX 0x41 #define DMY 0xff ScrpMaster::ScrpMaster(PinName TX1,PinName RX1){ mode_ = 0; init(TX1,RX1); } ScrpMaster::ScrpMaster(PinName TX1,PinName RX1,PinName REDE1){ mode_ = 1; rede_ = new DigitalOut(REDE1); init(TX1,RX1); } ScrpMaster::ScrpMaster(PinName TX1,PinName RX1,PinName TX2,PinName RX2){ mode_ = 2; serial_[1] = new Serial(TX2,RX2,115200); init(TX1,RX1); } ScrpMaster::ScrpMaster(PinName TX1,PinName RX1,PinName REDE1,PinName TX2,PinName RX2){ mode_ = 3; rede_ = new DigitalOut(REDE1); serial_[1] = new Serial(TX2,RX2,115200); init(TX1,RX1); } void ScrpMaster::init(PinName TX,PinName RX){ timeout_ = 100; serial_[0] = new Serial(TX,RX,115200); } void ScrpMaster::setTimeout(int time){ timeout_ = time; } int ScrpMaster::send(uint8_t id,uint8_t cmd,int16_t tx_data){ return sending(0,id,cmd,tx_data); } int ScrpMaster::send2(uint8_t id,uint8_t cmd,int16_t tx_data){ if(mode_ < 2){ return -1; } return sending(1,id,cmd,tx_data); } int ScrpMaster::sending(int port,uint8_t id,uint8_t cmd,int16_t tx_data){ uint8_t tx_dataL = tx_data; uint8_t tx_dataH = tx_data >> 8; uint8_t tx_sum = id + cmd + tx_dataL + tx_dataH; const uint8_t data[] = {DMY, STX, id, cmd, tx_dataL, tx_dataH, tx_sum, DMY}; if(!serial_[port]->writeable()){ return -1; } if(mode_%2 == 1 && id == 0){ rede_->write(1); } for(int i = 0;i<8;i++){ serial_[port]->putc(data[i]); } while(!serial_[port]->writeable()); if(mode_%2 == 1 && id == 0){ rede_->write(0); } int i = 0; bool received = false; bool stxflag = false; uint8_t rx[5]={},sum = 0; Timer out; out.start(); while(out.read_ms() < timeout_ && !received){ while(serial_[port]->readable()){ if(serial_[port]->getc() == STX && !stxflag){ stxflag = true; continue; } if(stxflag){ rx[i] = serial_[port]->getc(); sum += rx[i++]; } if(i > 4){/* uint8_t sum = 0; for(int j = 0;j<4;j++){ sum += rx[j]; }*/ if(sum == rx[4]){ received = true; } break; } } } out.stop(); if(!received){ return -1; } return (rx[2] + (rx[3] << 8)); } ScrpMaster::~ScrpMaster(){ delete serial_[0]; if(mode_%2 == 1){ delete rede_; } if(mode_ >= 2){ delete serial_[1]; } }