awtk用C语言开发串口通信示例
awtk开发工具封装了串口,可以方便的异步调用,就做个程序试一下吧
在deepinlinux20.9版本调试通过,开始第一步先给系统增加usb串口线驱动
https://download.csdn.net/download/qiaozhangchi/87463972
串口控件ide里没有,需要自己手动到界面文件里补充上即可
<serial name="serial"/>
刚开始发现串口消息回显到终端比较慢,差点要放弃的时候把结果往界面控件显示了一下,发现很快,还是值得用。
只要界面初始化控件时把接收函数回调注册一下,就可以在发送消息后回调函数接到反馈了,考虑到分包问题,所以回调函数里最好不要直接解析数据,我这是到另一个控件事件里接收数据,并追加到全局缓存,然后解析数据
serial_widget_t* serial ;if (serial == NULL)serial= SERIAL_WIDGET(widget_lookup(win, "serial", TRUE));
widget_child_on(win, "serial", EVT_DATA, on_data, win);// receive data
static ret_t on_data(void* ctx, event_t* e) {char recdata[128]={"sendmsg"}; printf("data:%s\n", recdata);widget_set_text_utf8(msg, recdata);return RET_OK;
}// serialname: /dev/ttyUSB0
static ret_t on_btnopen_click(void* ctx, event_t* e) {char buf[128]={0};widget_get_text_utf8(edit, buf, sizeof(buf)-1);widget_t* serial1 = widget_lookup(WIDGET(ctx), "serial", TRUE);serial_widget_set_device(serial1, buf);return RET_OK;
}static ret_t on_btnsend_click(void* ctx, event_t* e) {log_debug("send......");char text[] = {0x00, 0x00, 0xff, 0x00, 0x04, 0x00, 0x04, 0xff, 0x00, 0x05, 0xff, 0x03, 0x00};
int len=sizeof(text) / sizeof(text[0]);
printf("text len=%d strlen=%ld\n",len, strlen(text));
for(int i=0;i<len;i++){
printf(" %d",text[i]);
}
printf(" \n");tk_ostream_write_len(serial->ostream, text, len,500);
memset(g_data,'\0',sizeof(g_data)/sizeof(char));
dataindex=0;return RET_OK;
}
我这里得到串口数据事件通知后,我再设置文本框值,在文本框改变值事件里再去接收数据
void stringToHex(const char* str, char* hexStr,int len,int index) { str+=index;for (int k=0;k<len;k++) {sprintf(hexStr+3*k, "%02X ", (unsigned char)*str);str++; }
}
void outstr(const char* str, int len) { for (int k=0;k<len;k++) {printf("%02X ", (unsigned char)*str);str++; }
}
static ret_t on_msg_value_changed(void* ctx, event_t* e) {
widget_t* target = WIDGET(e->target);
if (e->type == EVT_VALUE_CHANGED) {char buf[256]={0}; widget_get_text_utf8(target, buf, sizeof(buf)-1);printf("data = %s\n", buf);if (tk_str_eq(buf, "sendmsg")) {memset(g_receive,0,sizeof(g_receive));int32_t len = tk_istream_read(serial->istream, g_receive, sizeof(g_receive)-1);if(len > 0) {g_receive[len] = '\0';
memcpy(g_data+dataindex, g_receive,len);
dataindex+=len;
outstr(g_data,dataindex);
printf("\nhexStr=%s \n buflen=%d datalen=%d\n",g_data,len,dataindex);char showbuf[512]={0};
stringToHex(g_receive,showbuf,len,0);printf("g_receive:%s\n", showbuf);
memset(showbuf,0,sizeof(showbuf));
stringToHex(g_data,showbuf,dataindex,0);printf("g_data:%s\n", showbuf);widget_set_text_utf8(mlresult, showbuf);}
sprintf(buf,"receivemsg:%d",dataindex);printf("data:%s\n", buf);widget_set_text_utf8(msg, buf);
}
}return RET_OK;
}
串口协议非文本字符,所以读到串口消息缓存时不能strcpy,也不能sprintf函数里用%s,最后自己写了一个数组追加函数,后来发现系统函数memcpy可以用,最后stringtohex函数其实可以照memcpy用法优化减少一个参数。
代码还是要多写写,几次调试就能增加某些细节印象,减少眼高手低结果次数。
相关文章:
awtk用C语言开发串口通信示例
awtk开发工具封装了串口,可以方便的异步调用,就做个程序试一下吧 在deepinlinux20.9版本调试通过,开始第一步先给系统增加usb串口线驱动 https://download.csdn.net/download/qiaozhangchi/87463972 串口控件ide里没有,需要自己…...
CICD 流程学习(五)Jenkins后端工程构建
案例1:数据库服务部署 MySQL部署 #安装MySQL服务 [rootServices ~]# yum clean all; yum repolist -v ... Total packages: 8,265 [rootServices ~]# yum -y install mysql.x86_64 mysql-server.x86_64 mysql-devel.x86_64 ... Complete! [rootServices ~]# #启动…...
NSS [SWPUCTF 2021 新生赛]sql
NSS [SWPUCTF 2021 新生赛]sql 很明显是sql,有waf。 参数是wllm get型传参,有回显,单引号闭合,回显位3 跑个fuzz看看waf 过滤了空格 and 报错注入 空格->%09 ->like and->&&爆库:test_db -1%27uni…...
【Python机器学习】零基础掌握RandomTreesEmbedding集成学习
如何在高维数据中找到隐藏的结构? 面临大量复杂、高维的数据,例如社交网络分析、电子商务推荐系统或医疗诊断,如何有效地分析和解读这些数据成为一大挑战。一个有效的方法是使用嵌入技术将高维数据转化为低维形式,同时保留其内在结构。这次将介绍一种称为“随机树嵌入”(…...
【C++基础入门】42.C++中同名覆盖引发的问题
一、父子间的赋值兼容 子类对象可以当作父类对象使用(兼容性) 子类对象可以直接赋值给父类对象子类对象可以直接赋值给父类对象父类指针可以直接指向子类对象父类引用可以直接引用子类对象 下面看一个子类对象兼容性的代码: #include <iostream>…...
【C++学习笔记】类和对象(上)
目录 1. 面向对象和面向过程的初步认识 2. 类的引入 3. 类的定义 3.1 类的两种定义方式 3.1.1声明和定义全部放在类体中 3.1.2.类声明放在.h文件中,成员函数定义放在.cpp文件中 4. 类的访问限定符及封装 4.1 访问限定符 4.2 面试题:C中struct…...
TinySnippet轻UI组件开发系列教程 — DataGrid选择事件
应用场景 DataGrid选择一条记录后,希望能够 调用纳流或者打开指定的页面 或者当鼠标悬停在一行时弱出一个指定的页面在右下角(移开就关闭弹出页) 这些都是我们能够实现的 实现过程 本文以调用纳流为例 下载UI组件 TinySnippet-v4.1.2导…...
热搜榜:最热门的话题文本排行榜API接口
近年来,随着社交媒体的兴起,热门话题的数量和更新速度都在不断增加,因此热门话题排行榜的需求也越来越大。在这篇文章中,我们将探讨如何使用#热搜榜# API接口获取最热门的话题文本排行榜,并给出相关代码示例。 一、API…...
vue中替换全局字体
一、背景 产品说项目要拿去展会展示,但现在项目字体是微软雅黑,不支持商用,需要全局替换思源字体。 二、下载字体 推荐一个网址,好用 字体天下,点击跳转 下载好的文件如下: 三、引入字体 1、在项目…...
【AGC】.p12证书文件如何获取MD5
近期在使用DevEco Studio3.1打包应用时遇到了一个问题,我使用Build—Generate Key and CSR创建了密钥库文件。 我这里需要获取到创建的.p12证书文件的MD5值,于是在控制台使用了keytool -list -v -keystore D:\myapp.p12命令获取证书指纹,但是…...
vue2 quill 视频上传 ,基于ruoyi vue,oss
包含两种上传方式,第一种点开弹新页面可选url和点击上传。本文中是第二种,自己拼的。像点击上传图片一样,直接传video文件,原创不易,纯纯踩坑; 因为现阶段能搜索到的内容,99.5%都是一样的内容&…...
YOLOv8改进实战 | 更换损失函数之MPDIOU(2023最新IOU)篇
前言 YOLOv8官方默认损失函数采用的是CIoU。本章节主要介绍如何将MPDIoU损失函数应用于目标检测YOLOv8模型。 目录 一、MPDIoU二、代码实现添加损失函数更换损失函数一、MPDIoU 论文链接:MPDIoU: A Loss for Efficient and Accurate Bounding Box Regression MPDIoU是一种基于…...
图的应用1.0-----最小生成树问题
目录 前言 生成树 1.基本概念 2.生成树的特点 3.生成树形成过程 最小生成树(Minimum Spanning Tree) 1.基本概念 2.构造方法(MST) 普里姆(Prime)算法 1.算法思想 2.代码实现 克鲁斯卡尔(Kruskal)算法 1.算法思想 2.代码…...
【计算机网络笔记】网络应用对传输服务的需求
系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 计算机网络性能(2)…...
IDEA启动报错:Command line is too long的解决办法
文章目录 1.报错现象2.解决办法验证3.最佳实践4.问题原因5.参考文献1.报错现象 在idea中启动一个spring cloud项目时,编译完成后直接报错,报错内容如下: Error running XXXApplication:Command line is too long. Shorten command line for XXXApplication or also for Sp…...
Android 中的 本地广播LocalBroadcastManager
Android 中的 本地广播LocalBroadcastManager 文章目录 Android 中的 本地广播LocalBroadcastManager一、LocalBroadcastManager 的基本作用二 、LocalBroadcastManager 的基本使用1、包的导入(1)Android 源码中bp文件的导入:(2&a…...
题目 1120: C语言训练-“水仙花数“问题2python详解)——练气三层后期
✨博主:命运之光 🦄专栏:算法修炼之练气篇(C\C版) 🍓专栏:算法修炼之筑基篇(C\C版) 🍒专栏:算法修炼之练气篇(Python版) ✨…...
sheng的学习笔记-【中】【吴恩达课后测验】Course 3 - 结构化机器学习项目 - 第二周测验
课程3_第2周_测验题 目录:目录 要解决的问题 ① 为了帮助你练习机器学习的策略,本周我们将介绍另一个场景,并询问你将如何行动。 ② 我们认为这个在机器学习项目中工作的“模拟器”将给出一个任务,即领导一个机器学习项目可能…...
基于Pytorch的驾驶员分心行为实时检测
本文使用深度学习和Pytorch(PyTorch 2.0.1\Torchvision 0.15.2)实时检测驾驶员的分心行为,并附录完整代码。 检测分心驾驶是现代汽车中最重要的功能之一。无论是自动驾驶汽车还是其它高端汽车,都配备了驾驶员监控系统,以持续跟踪驾驶员的行为。这对确保驾驶员保持目光在道路…...
【uniapp】小程序开发7:自定义组件、自动注册组件
一、自定义轮播图组件、自动注册 以首页轮播图组件为例。 1、创建组件文件src/components/my-swipper.vue 代码如下: <template><view><view class"uni-margin-wrap"><swiper class"swiper" circular :indicator-dots…...
告别校园网登录页!实测用UDP 53端口“曲线救国”上网的几种姿势与风险提示
校园网络优化:提升连接效率的合法实践指南 校园网络作为师生日常学习研究的重要基础设施,其稳定性和访问效率直接影响教学科研质量。许多用户在使用过程中会遇到认证页面频繁弹出、连接不稳定等问题,这通常与网络架构设计和流量管理策略有关。…...
保姆级教程:用YOLOv5和ReID搞定跨摄像头找人(附完整代码和预训练模型)
跨摄像头人物追踪实战:YOLOv5与ReID技术深度整合指南 在智能安防、零售分析等场景中,跨摄像头追踪特定人物一直是个技术难点。传统方案要么依赖单一摄像头的目标检测,要么需要复杂的人工特征标注。本文将手把手带您实现一套基于YOLOv5目标检测…...
AI万能分类器零基础入门:5分钟搭建无需训练的文本分类系统
AI万能分类器零基础入门:5分钟搭建无需训练的文本分类系统 1. 引言:为什么选择零样本分类? 想象一下这样的场景:你刚接手一个新项目,需要快速对大量用户反馈进行分类。传统方法要求你收集数据、标注样本、训练模型&a…...
Kubernetes与Istio服务网格最佳实践
Kubernetes与Istio服务网格最佳实践 1. Istio服务网格核心概念 1.1 什么是服务网格 服务网格是一种专门用于处理服务间通信的基础设施层,它负责在现代云原生应用的复杂服务拓扑中可靠地传递请求。 1.2 Istio架构组件 控制平面:包含Pilot、Galley、Citade…...
GHelper深度解析:重新定义华硕笔记本性能控制体验
GHelper深度解析:重新定义华硕笔记本性能控制体验 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models 项目地址: h…...
CGAL Point_set_processing 点集处理函数自查表
参考来源: CGAL 6.1.1 - Point Set Processing: Algorithms 一、尺度 / K 值估算 返回值函数名作用用法示例size_testimate_global_k_neighbor_scale估算全局最优 K 邻域estimate_global_k_neighbor_scale(points)FTestimate_global_range_scale估算全局最优搜索…...
TikTok音乐提取全攻略:3分钟学会用DouK-Downloader分离音频
TikTok音乐提取全攻略:3分钟学会用DouK-Downloader分离音频 【免费下载链接】TikTokDownloader JoeanAmier/TikTokDownloader: 这是一个用于从TikTok下载视频和音频的工具。适合用于需要从TikTok下载视频和音频的场景。特点:易于使用,支持多种…...
突破国际漫游限制:Nrfr免Root工具的终极解决方案
突破国际漫游限制:Nrfr免Root工具的终极解决方案 【免费下载链接】Nrfr 🌍 免 Root 的 SIM 卡国家码修改工具 | 解决国际漫游时的兼容性问题,帮助使用海外 SIM 卡获得更好的本地化体验,解锁运营商限制,突破区域限制 …...
Java 代码质量保障:静态分析与代码审查实践
Java 代码质量保障:静态分析与代码审查实践代码质量不是测试阶段才考虑的事情,而是应该从第一行代码开始。作为一名经历过多次代码重构的 Java 开发者,我深刻体会到:预防胜于治疗。今天分享一套完整的代码质量保障体系,…...
告别Postman!用Kettle直接处理钉钉API的POST请求(含MySQL连接jar包缺失解决方案)
告别Postman!用Kettle直接处理钉钉API的POST请求(含MySQL连接jar包缺失解决方案) 在数据集成领域,Kettle(现称Pentaho Data Integration)一直以其强大的ETL能力著称。但许多开发者可能不知道,这…...
