serial_put_hex

由于给定内容为空,无法提取关键信息生成摘要。
#pragma once #include <libserial/SerialPort.h> #include <stdint.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <iostream> #include <thread> #include <cstdint> #include "common.hpp" #include "blocking_queue.hpp" using namespace LibSerial; // 向下位机传输的数据包 struct Payload_t { int tSpeed; // 速度 bool slowDown; int16_t tAngle; // 偏移 uint8_t element; // 元素 }; Payload_t payload; class SerialDriver { public: SerialDriver(const std::string &port_name, BaudRate bps) : _port_name(port_name), _bps(bps){}; ~SerialDriver(){}; private: // 通讯协议结构体 struct Packet { uint8_t data[9]; // 数据 }; std::shared_ptr<SerialPort> _serial_port = nullptr; std::string _port_name; // 端口号 BaudRate _bps; // 波特率 bool _loop; std::thread _worker_thread_send; BlockingQueue<Payload_t> _queue; public: int transmitByte(unsigned char data) { // try检测语句块有没有异常 try { _serial_port->WriteByte(data); // 写数据到串口 } catch (const std::runtime_error &) // catch捕获并处理 try 检测到的异常。 { std::cerr << "The Write() runtime_error." << std::endl; return -2; } catch (const NotOpen &) // catch捕获并处理 try 检测到的异常。 { std::cerr << "Port Not Open ..." << std::endl; return -1; } _serial_port->DrainWriteBuffer(); // 等待,直到写缓冲区耗尽,然后返回。 return 0; } void carControl(int speed, uint16_t servo, bool slowDown, uint8_t element) { payload.tSpeed = speed; payload.tAngle = servo; payload.slowDown = slowDown; payload.element = element; sendPack(payload); } void PID_Init(void) { if (!_loop) return; uint8_t buff[15]; // 多发送一个字节 buff[0] = 0xAC; // 通信帧头 buff[1] = (uint8_t)config::P_Low; buff[2] = (uint8_t)config::D_Low; buff[3] = (uint8_t)config::P_High; buff[4] = (uint8_t)config::D_High; buff[5] = (uint8_t)config::P_Ring; buff[6] = (uint8_t)config::D_Ring; buff[7] = (uint8_t)config::P_Cross; buff[8] = (uint8_t)config::D_Cross; buff[9] = (uint8_t)config::P_Danger; buff[10] = (uint8_t)config::D_Danger; buff[11] = (uint8_t)config::P_Rescue; buff[12] = (uint8_t)config::D_Rescue; buff[13] = (uint8_t)config::speedBridge; buff[14] = 0xEF; // 帧尾 // 循环发送数据 for (size_t i = 0; i < 15; i++) transmitByte(buff[i]); } void run_send(void) { Payload_t payload; DataBuffer pkt_buf(sizeof(Packet)); Packet *packet = (Packet*)&pkt_buf[0]; while (_loop) { if (_queue.Size() >= 1) { payload = _queue.Take(); packet->data[0] = 0xFF; if(config::Shache||config::SC_Stop||config::Shache1) payload.tSpeed = -20; if(config::Daoche) { payload.tSpeed = -30; payload.tAngle = 1150; } if(config::Daoche1) { payload.tSpeed = -30; payload.tAngle = 880; } (payload.tSpeed >= 0) ? (packet->data[1] = 0) : (packet->data[1] = 1); // 0速度是正,1速度是负数 if (payload.tSpeed < 0) { payload.tSpeed = -payload.tSpeed; } packet->data[2] = (uint8_t)(payload.tSpeed); packet->data[3] = (uint8_t)(payload.tAngle >> 8); packet->data[4] = (uint8_t)(payload.tAngle & 0xFF); packet->data[5] = (uint8_t)(payload.element); payload.slowDown ? (packet->data[6] = 0) : (packet->data[6] = 1); // 0减速,1加速 config::buzzer?(packet->data[7] = 1):(packet->data[7] = 0); packet->data[8] = 0xFE; for (size_t i = 0; i < 9; i++) transmitByte(packet->data[i]); } else { std::this_thread::sleep_for(std::chrono::milliseconds(1)); } } }; int open() { _serial_port = std::make_shared<SerialPort>(); try { _serial_port->Open("/dev/ttyUSB0"); _serial_port->SetBaudRate(_bps); _serial_port->SetCharacterSize(CharacterSize::CHAR_SIZE_8); // 8位数据位 _serial_port->SetFlowControl(FlowControl::FLOW_CONTROL_NONE); // 设置流控 _serial_port->SetParity(Parity::PARITY_NONE); // 无校验 _serial_port->SetStopBits(StopBits::STOP_BITS_1); // 1个停止位 _worker_thread_send = std::thread(&SerialDriver::run_send, this); _loop = true; return 0; } catch (const OpenFailed &) { return -2; } catch (const AlreadyOpen &) { return -3; } catch (...) { return -4; } return -1; }; int close() { uint8_t data[9]; data[0] = 0xFF; data[1] = (uint8_t)(0); data[2] = (uint8_t)(0); // 0速度是正,1速度是负数 data[3] = (uint8_t)(1000 >> 8); data[4] = (uint8_t)(1000 & 0xFF); data[5] = (uint8_t)(0); data[6] = (uint8_t)(0); // 0减速,1加速 data[7] = (uint8_t)(0); data[8] = 0xFE; for (int k = 0; k < 5; k++) for (size_t i = 0; i < 9; i++) transmitByte(data[i]); _loop = false; _worker_thread_send.join(); _queue.ShutDown(); if (_serial_port != nullptr) { _serial_port->Close(); _serial_port = nullptr; } return 0; }; int sendPack(Payload_t payloadss) { if (_queue.Size() < 3) { _queue.Put(payloadss); } return 0; } // 添加接收检测方法 bool hasDataAvailable() { if (!_serial_port || !_serial_port->IsOpen()) return false; try { return _serial_port->IsDataAvailable(); } catch (const std::runtime_error& e) { std::cerr << "Error checking data availability: " << e.what() << std::endl; return false; } } };帮我详细分析这段代码
最新发布
11-06
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值