串口问题setup serialport bad file descriptor

是大柚子呀 是大柚子呀 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
对标Adobe Premiere的专业视频剪辑与后期制作工具:基于原生架构重构,集多轨道剪辑、专业调色、字幕图形与音频处理于一体高效创作利器 大家好,我是大飞哥。在视频剪辑与后期制作领域,许多创作者常被主流剪辑软件高昂的订阅费用、全英文的复杂界面以及庞大的安装体积所困扰。这款对标Adobe Premiere Pro的专业视频剪辑与后期制作工具,正是为打破这一壁垒而生的高性价比替代方案。它并非简单的粗糙拼接,而是基于前沿架构对底层逻辑进行全新重构,完整复刻了专业剪辑的常用工作流。其核心使命是让剪辑、调色、字幕、音频与导出全流程,在一个全中文、免安装、无需联网的高效环境中轻松完成,赋予创作者极致的生产力。 在核心功能模块上,软件实现了对专业剪辑需求的深度覆盖。它支持多轨道时间线编辑,提供剃刀切开、波纹删除、滑移滑动等专业工具;特效系统涵盖视频转场、模糊、变换与风格化,且参数支持关键帧动画;专业调色模块配备亮度、对比度、色温、饱和度、曲线与色轮,并配有波形图与矢量示波器;字幕图形支持中文直接输入与描边动画;音频处理则包含增益、降噪与实时电平表,全面满足从粗剪到精修的各项需求。 在实际应用场景中,这款工具展现出了极强的专业适配能力。对于自媒体创作者与短视频博主,可以通过多轨道时间线与关键帧特效,快速完成Vlog剪辑与片头包装;对于企业宣传与影视后期爱好者,借助专业调色台与字幕动画功能,能够精细打磨宣传片与微电影的视觉质感;对于学生群体与办公人士,其多格式导入导出与代理剪辑功能,让日常课程视频或会议记录的裁剪整理变得轻而易举,真正实现了全场景覆盖。 操作体验上,软件采用了与主流剪辑软件高度一致的界面布局,左侧为项目与媒体浏览器,中间为节目监视器,右侧为属性面板,下方为多轨时间轴,熟手几乎零学习成本即可平滑过渡。软件默认简体中文界面,用户可通过“导入媒体”快速拖入素材,使用剃刀工具精准切割,并在效果面板拖拽应用调色与特效,最后点击右上角一键导出,整个流程清晰流畅,配合内置的帮助说明,让创作得心应手。 立即下载
[显示setup serialport 1:bad file descriptor哪里错了啊][
#include "serialPort.h"
#include <string.h>
#include <sys/ioctl.h>
using namespace std;
serialPort::serialPort()
{
fd = -1;
}
bool serialPort::OpenPort(const char* dev)
{

char* _dev = new char[32];
strcpy(_dev, dev);
fd = open(_dev, O_RDWR| O_NOCTTY | O_NDELAY ); //| O_NOCTTY | O_NDELAY
if (-1 == fd)
{
perror("Can't Open Serial Port");
return false;
}

int DTR_flag;
DTR_flag = TIOCM_DTR;
ioctl(fd, TIOCMBIS, &DTR_flag);//Set RTS pin
return true;

}
int serialPort::setup(int speed, int flow_ctrl, int databits, int stopbits, int parity)
{

int i;
int status;
struct termios options;
/*tcgetattr(fd,&options)得到与fd指向对象的相关参数,并将它们保存于options,该函数还可以测试配置是否正确,该串口是否可用等。若调用成功,函数返回值为0,若调用失败,函数返回值为1.
*/
if (tcgetattr(fd, &options) != 0)
{
perror("SetupSerial 1");
return(false);
}
int speed_arr[14] = { B38400, B19200, B9600, B4800, B2400, B1200, B300,
B38400, B19200, B9600, B4800, B2400, B1200, B300, };
int name_arr[14] = { 38400, 19200, 9600, 4800, 2400, 1200, 300, 38400,
19200, 9600, 4800, 2400, 1200, 300, };
//设置串口输入波特率和输出波特率
for (i = 0; i < sizeof(speed_arr) / sizeof(int); i++)
{
if (speed == name_arr[i])
{
cfsetispeed(&options, speed_arr[i]);
cfsetospeed(&options, speed_arr[i]);
}
}

//修改控制模式,保证程序不会占用串口
options.c_cflag |= CLOCAL;
//修改控制模式,使得能够从串口中读取输入数据
options.c_cflag |= CREAD;

//设置数据流控制
switch (flow_ctrl)
{

case 0://不使用流控制
options.c_cflag &= ~CRTSCTS;
break;

case 1://使用硬件流控制
options.c_cflag |= CRTSCTS;
break;
case 2://使用软件流控制
options.c_cflag |= IXON | IXOFF | IXANY;
break;
}
//设置数据位
//屏蔽其他标志位
options.c_cflag &= ~CSIZE;
switch (databits)
{
case 5:
options.c_cflag |= CS5;
break;
case 6:
options.c_cflag |= CS6;
break;
case 7:
options.c_cflag |= CS7;
break;
case 8:
options.c_cflag |= CS8;
break;
default:
fprintf(stderr, "Unsupported data size\n");
return (false);
}
//设置校验位
switch (parity)
{
case 'n':
case 'N': //无奇偶校验位。
options.c_cflag &= ~PARENB;
options.c_iflag &= ~INPCK;
break;
case 'o':
case 'O'://设置为奇校验
options.c_cflag |= (PARODD | PARENB);
options.c_iflag |= INPCK;
break;
case 'e':
case 'E'://设置为偶校验
options.c_cflag |= PARENB;
options.c_cflag &= ~PARODD;
options.c_iflag |= INPCK;// INPCK:打开输入奇偶校验
break;
case 's':
case 'S': //设置为空格
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
break;
default:
fprintf(stderr, "Unsupported parity\n");
return (false);
}
// 设置停止位
switch (stopbits)
{
case 1:
options.c_cflag &= ~CSTOPB; break;
case 2:
options.c_cflag |= CSTOPB; break;
default:
fprintf(stderr, "Unsupported stop bits\n");
return (false);
}

//修改输出模式,原始数据输出
options.c_oflag &= ~OPOST;// OPOST:执行输出处理;

options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);// ICANON:规范输入;ECHO:进行回送;ECHOE:可见擦除符;ISIG:使终端产生的信号起作用;
//options.c_lflag &= ~(ISIG | ICANON);

//设置等待时间和最小接收字符
options.c_cc[VTIME] = 1; /* 读取一个字符等待1*(1/10)s */
options.c_cc[VMIN] = 1; /* 读取字符的最少个数为1 */
//如果发生数据溢出,接收数据,但是不再读取 刷新收到的数据但是不读
tcflush(fd, TCIFLUSH);

//激活配置 (将修改后的termios数据设置到串口中)
if (tcsetattr(fd, TCSANOW, &options) != 0)//tcsetattr函数用于设置终端的相关参数
{
perror("com set error!\n");
return (false);
}
return (true);
}

int serialPort::readBuffer(unsigned char *buffer, int size)
{
return read(fd, buffer, size);
}
int serialPort::writeBuffer(unsigned char *buffer, int size)
{
return write(fd, buffer, size);
}
uint8_t serialPort::getchar()
{
uint8_t t;
read(fd, &t, 1);
return t;
}
void serialPort::ClosePort()
{
close(fd);
}

]
...全文

相关推荐

变电站精细化设计施工标准(电气部分)

变电站精细化设计施工标准(电气部分).pdf。文档内容齐全,中间有页码不对,是因为这是两个文档合成的,不影响内容完整,内容为图片,不是源文档。

bigshentu

YOLO26算法工业车间光伏组件热点与系列故障目标检测+训练好的模型+174张数据集+pyqt可视化界面.zip

附训练好的 YOLO 权重与 PyQt 可视化检测界面,页面底部含可视化效果预览,毕设/课设开箱即用。 【数据集概况】 · 检测类别(中文):[系列故障(Falla serie), 热点(Punto caliente)] · 训练集:153 张 · 验证集:14 张 · 测试集:7 张 · 总计:174 张 该数据集聚焦于工业车间内光伏组件的热成像检测场景,专门针对太阳能电池板在运行过程中出现的局部异常进行精准识别,具有明确的工程诊断价值与质量控制意义。数据采集覆盖多种典型热异常模式,为光伏系统运维中的早期隐患预警提供了高质量视觉样本支撑。... 【训练曲线与评估图】 【模型训练配置】 参数 | 值 模型 | yolo26n 训练轮数 | 100 epochs 输入尺寸 | 640x640 批次大小 | 24 优化器 | auto 初始学习率 | 0.01 训练设备 【关键指标汇总】 训练了 85 个 epoch,最终轮指标: 指标 | 数值 mAP50 | **0.8734** mAP50-95 | 0.3870 Precision | 0.8062 Recall | 0.8306 train/box_loss | 2.1071 train/cls_loss | 0.9683 val/box_loss | 1.9784 val/cls_loss | 0.6732 【训练过程分析】 从数据加载那一刻起,整个训练过程仿佛是在一条崎岖不平的道路上前进。训练初期,模型的收敛速度颇为迅速,loss 值稳步降低,到第 20 轮时,box_loss 从初始值 2.1071 下降到 1.85,但并未显著波动,仿佛遇到了平台期。从第 40 轮到 60 轮,训练过程变得愈发缓慢,loss 下降幅度逐渐减小,尤其是 cls_... 使用场景:毕业设计、课程设计、深度学习入门、工业场景落地验证。

guo_xiao_xiao_

超全反激式变换器开关电源Mathcad设计书

内容概要:本文档《超全反激式变换器开关电源Mathcad设计书》系统阐述了反激式Flyback开关电源的设计原理与工程实现方法,重点结合Mathcad数学工具完成关键参数的精确计算,并利用Simulink搭建闭环控制系统仿真模型,实现从理论计算到系统验证的完整设计流程。内容涵盖反激变换器的工作原理、双闭环控制结构(电压环与电流环)设计、变压器参数计算、PWM控制策略、稳定性分析及动态响应优化,同时整合大量电力电子前沿技术资源,如三电平逆变器中点电位平衡、虚拟同步发电机(VSG)、模型预测控制(MPC)、孤岛检测、阻抗建模、储能协调控制等,形成覆盖电源设计、新能源并网与智能控制的综合性技术体系。; 适合人群:具备电力电子、自动控制或电气工程等相关专业背景,从事开关电源、新能源发电系统、微电网或电力变换器研发工作的工程师及研究生。; 使用场景及目标:①掌握基于Mathcad的反激式开关电源参数化设计方法,提升计算效率与精度;②深入理解双闭环反馈控制在Flyback电路中的应用机制;③结合Simulink仿真平台完成控制算法验证,并拓展至光伏逆变、储能变流、VSG并网等复杂电力系统场景的建模与分析。; 阅读建议:建议结合文档中提供的Mathcad计算书、Simulink仿真模型与参考文献同步学习,注重理论推导与仿真验证的紧密结合,优先掌握控制环路设计思想,再进行实际参数调节与系统性能优化,以实现从原理到工程落地的全面理解。

yyds_2201

教程:添加与更改数据指南

添加与更改数据指南sql脚本

太虚野老

数据处理之增删改练习作业图片

数据处理之增删改练习作业

碧隐
评论 1
收藏 已收藏
分享
返回顶部