当前位置: 首页 > news >正文

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开发工具封装了串口&#xff0c;可以方便的异步调用&#xff0c;就做个程序试一下吧 在deepinlinux20.9版本调试通过&#xff0c;开始第一步先给系统增加usb串口线驱动 https://download.csdn.net/download/qiaozhangchi/87463972 串口控件ide里没有&#xff0c;需要自己…...

CICD 流程学习(五)Jenkins后端工程构建

案例1&#xff1a;数据库服务部署 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&#xff0c;有waf。 参数是wllm get型传参&#xff0c;有回显&#xff0c;单引号闭合&#xff0c;回显位3 跑个fuzz看看waf 过滤了空格 and 报错注入 空格->%09 ->like and->&&爆库&#xff1a;test_db -1%27uni…...

【Python机器学习】零基础掌握RandomTreesEmbedding集成学习

如何在高维数据中找到隐藏的结构? 面临大量复杂、高维的数据,例如社交网络分析、电子商务推荐系统或医疗诊断,如何有效地分析和解读这些数据成为一大挑战。一个有效的方法是使用嵌入技术将高维数据转化为低维形式,同时保留其内在结构。这次将介绍一种称为“随机树嵌入”(…...

【C++基础入门】42.C++中同名覆盖引发的问题

一、父子间的赋值兼容 子类对象可以当作父类对象使用&#xff08;兼容性) 子类对象可以直接赋值给父类对象子类对象可以直接赋值给父类对象父类指针可以直接指向子类对象父类引用可以直接引用子类对象 下面看一个子类对象兼容性的代码&#xff1a; #include <iostream>…...

【C++学习笔记】类和对象(上)

目录 1. 面向对象和面向过程的初步认识 2. 类的引入 3. 类的定义 3.1 类的两种定义方式 3.1.1声明和定义全部放在类体中 3.1.2.类声明放在.h文件中&#xff0c;成员函数定义放在.cpp文件中 4. 类的访问限定符及封装 4.1 访问限定符 4.2 面试题&#xff1a;C中struct…...

TinySnippet轻UI组件开发系列教程 — DataGrid选择事件

应用场景 DataGrid选择一条记录后&#xff0c;希望能够 调用纳流或者打开指定的页面 或者当鼠标悬停在一行时弱出一个指定的页面在右下角&#xff08;移开就关闭弹出页&#xff09; 这些都是我们能够实现的 实现过程 本文以调用纳流为例 下载UI组件 TinySnippet-v4.1.2导…...

热搜榜:最热门的话题文本排行榜API接口

近年来&#xff0c;随着社交媒体的兴起&#xff0c;热门话题的数量和更新速度都在不断增加&#xff0c;因此热门话题排行榜的需求也越来越大。在这篇文章中&#xff0c;我们将探讨如何使用#热搜榜# API接口获取最热门的话题文本排行榜&#xff0c;并给出相关代码示例。 一、API…...

vue中替换全局字体

一、背景 产品说项目要拿去展会展示&#xff0c;但现在项目字体是微软雅黑&#xff0c;不支持商用&#xff0c;需要全局替换思源字体。 二、下载字体 推荐一个网址&#xff0c;好用 字体天下&#xff0c;点击跳转 下载好的文件如下&#xff1a; 三、引入字体 1、在项目…...

【AGC】.p12证书文件如何获取MD5

近期在使用DevEco Studio3.1打包应用时遇到了一个问题&#xff0c;我使用Build—Generate Key and CSR创建了密钥库文件。 我这里需要获取到创建的.p12证书文件的MD5值&#xff0c;于是在控制台使用了keytool -list -v -keystore D:\myapp.p12命令获取证书指纹&#xff0c;但是…...

vue2 quill 视频上传 ,基于ruoyi vue,oss

包含两种上传方式&#xff0c;第一种点开弹新页面可选url和点击上传。本文中是第二种&#xff0c;自己拼的。像点击上传图片一样&#xff0c;直接传video文件&#xff0c;原创不易&#xff0c;纯纯踩坑&#xff1b; 因为现阶段能搜索到的内容&#xff0c;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.构造方法&#xff08;MST&#xff09; 普里姆(Prime)算法 1.算法思想 2.代码实现 克鲁斯卡尔&#xff08;Kruskal&#xff09;算法 1.算法思想 2.代码…...

【计算机网络笔记】网络应用对传输服务的需求

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…...

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、包的导入&#xff08;1&#xff09;Android 源码中bp文件的导入&#xff1a;&#xff08;2&a…...

题目 1120: C语言训练-“水仙花数“问题2python详解)——练气三层后期

✨博主&#xff1a;命运之光 &#x1f984;专栏&#xff1a;算法修炼之练气篇&#xff08;C\C版&#xff09; &#x1f353;专栏&#xff1a;算法修炼之筑基篇&#xff08;C\C版&#xff09; &#x1f352;专栏&#xff1a;算法修炼之练气篇&#xff08;Python版&#xff09; ✨…...

sheng的学习笔记-【中】【吴恩达课后测验】Course 3 - 结构化机器学习项目 - 第二周测验

课程3_第2周_测验题 目录&#xff1a;目录 要解决的问题 ① 为了帮助你练习机器学习的策略&#xff0c;本周我们将介绍另一个场景&#xff0c;并询问你将如何行动。 ② 我们认为这个在机器学习项目中工作的“模拟器”将给出一个任务&#xff0c;即领导一个机器学习项目可能…...

基于Pytorch的驾驶员分心行为实时检测

本文使用深度学习和Pytorch(PyTorch 2.0.1\Torchvision 0.15.2)实时检测驾驶员的分心行为,并附录完整代码。 检测分心驾驶是现代汽车中最重要的功能之一。无论是自动驾驶汽车还是其它高端汽车,都配备了驾驶员监控系统,以持续跟踪驾驶员的行为。这对确保驾驶员保持目光在道路…...

【uniapp】小程序开发7:自定义组件、自动注册组件

一、自定义轮播图组件、自动注册 以首页轮播图组件为例。 1、创建组件文件src/components/my-swipper.vue 代码如下&#xff1a; <template><view><view class"uni-margin-wrap"><swiper class"swiper" circular :indicator-dots…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

SQL Server 触发器调用存储过程实现发送 HTTP 请求

文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...

pycharm 设置环境出错

pycharm 设置环境出错 pycharm 新建项目&#xff0c;设置虚拟环境&#xff0c;出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例

目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码&#xff1a;冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...

Pydantic + Function Calling的结合

1、Pydantic Pydantic 是一个 Python 库&#xff0c;用于数据验证和设置管理&#xff0c;通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发&#xff08;如 FastAPI&#xff09;、配置管理和数据解析&#xff0c;核心功能包括&#xff1a; 数据验证&#xff1a;通过…...

FOPLP vs CoWoS

以下是 FOPLP&#xff08;Fan-out panel-level packaging 扇出型面板级封装&#xff09;与 CoWoS&#xff08;Chip on Wafer on Substrate&#xff09;两种先进封装技术的详细对比分析&#xff0c;涵盖技术原理、性能、成本、应用场景及市场趋势等维度&#xff1a; 一、技术原…...