ServoControl/main.cpp

85 lines
2.5 KiB
C++

#include <iostream>
#include <fcntl.h> // 包含open函数
#include <unistd.h> // 包含close函数
#include <termios.h> // 包含termios结构体
#include <cstring> // 包含memset函数
#include <string> // 包含std::string
#include "GetFrame.h"
// 串口配置参数
const char* SERVO_PORT_NAME = "/dev/ttyS3"; // 串口设备文件,根据实际情况修改
const speed_t BAUDRATE = B115200; // 波特率
bool setupSerialPort(int& fd, const char* portName, speed_t baudRate);
bool sendSerialData(int fd, const std::string& data);
int main() {
int uart_fd; // 串口文件描述符
// 开启并配置串口
if (!setupSerialPort(uart_fd, SERVO_PORT_NAME, BAUDRATE)) {
std::cerr << "Failed to setup serial port" << std::endl;
return 1;
}
// 要发送的数据帧
//std::string data_frame = "Hello, servo!"; // 字符串数据
std::string data_frame = GetFrame();
// 通过串口发送数据
if (!sendSerialData(uart_fd, data_frame)) {
std::cerr << "Failed to send data" << std::endl;
close(uart_fd); // 关闭串口
return 1;
}
std::cout << "Data frame sent successfully" << std::endl;
close(uart_fd); // 关闭串口
return 0;
}
bool setupSerialPort(int& fd, const char* portName, speed_t baudRate) {
fd = open(portName, O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1) {
std::cerr << "Error opening serial port: " << portName << std::endl;
return false;
}
struct termios options;
tcgetattr(fd, &options); // 获取当前串口配置
// 设置输入输出波特率
cfsetispeed(&options, baudRate);
cfsetospeed(&options, baudRate);
// 本地模式 | 接收使能
options.c_cflag |= (CLOCAL | CREAD);
// 设置数据位数
options.c_cflag &= ~CSIZE; // 清空数据位设置
options.c_cflag |= CS8; // 8位数据位
// 设置无奇偶校验
options.c_cflag &= ~PARENB;
// 设置停止位
options.c_cflag &= ~CSTOPB;
// 设置原始输入输出模式
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
options.c_iflag &= ~(IXON | IXOFF | IXANY);
options.c_oflag &= ~OPOST;
// 应用配置
if (tcsetattr(fd, TCSANOW, &options) != 0) {
std::cerr << "Error applying serial port settings" << std::endl;
return false;
}
return true;
}
bool sendSerialData(int fd, const std::string& data) {
if (write(fd, data.c_str(), data.size()) < 0) {
std::cerr << "Error writing to serial port" << std::endl;
return false;
}
return true;
}