用C++写个示例 linux WebAssembly技术支持的js调用串行通信

C++在Linux上通过WebAssembly实现串行通信

以下是一个示例,展示了如何使用C++在Linux上通过WebAssembly实现串行通信。这个示例假设你已经安装了Emscripten工具链,并正确配置了你的系统。

首先,创建一个名为serial_communication.cpp的C++源文件,将以下代码粘贴到文件中:

#include <iostream>
#include <fstream>extern "C" {int open_serial_port(const char* port_name) {// 打开串口代码// ...std::cout << "Opening serial port: " << port_name << std::endl;return 0; // 返回一个表示成功的整数值,可以根据具体情况进行修改}void close_serial_port() {// 关闭串口代码// ...std::cout << "Closing serial port." << std::endl;}void send_data(const char* data) {// 发送数据代码// ...std::cout << "Sending data: " << data << std::endl;}void receive_data(char* buffer, int buffer_size) {// 接收数据代码// ...std::cout << "Receiving data: ";// 将接收到的数据写入到 buffer 中,可以根据具体情况进行修改strncpy(buffer, "Hello, World!", buffer_size);std::cout << buffer << std::endl;}
}

接下来,通过以下命令将C++源文件编译为WebAssembly模块:

em++ -O3 -s WASM=1 -s EXPORTED_FUNCTIONS="['_open_serial_port', '_close_serial_port', '_send_data', '_receive_data']" -o serial_communication.wasm serial_communication.cpp

以上命令将生成一个名为serial_communication.wasm的WebAssembly文件。

接下来,创建一个名为index.html的HTML文件,将以下代码粘贴到文件中:

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>Serial Communication</title>
</head>
<body><script>async function loadWebAssembly(filename) {const response = await fetch(filename);const buffer = await response.arrayBuffer();const module = await WebAssembly.instantiate(buffer);return module.instance.exports;}loadWebAssembly('serial_communication.wasm').then(exports => {const serialPortName = "/dev/ttyUSB0"; // 设置串口名称exports.open_serial_port(serialPortName); // 调用打开串口函数const data = "Hello from WebAssembly"; // 要发送的数据exports.send_data(data); // 调用发送数据函数const buffer = new Uint8Array(256); // 用于接收数据的缓冲区exports.receive_data(buffer, buffer.length); // 调用接收数据函数exports.close_serial_port(); // 调用关闭串口函数}).catch(console.error);</script>
</body>
</html>

最后,在终端中执行以下命令以启动一个HTTP服务器,用于加载index.html文件:

emrun --no_browser --port 8080 .

以上命令将启动一个HTTP服务器,监听8080端口,并将当前目录作为服务器根目录。然后,你可以通过浏览器访问http://localhost:8080来查看串行通信的示例运行结果。

请注意,以上示例仅为演示目的,并未提供实际的串行通信功能。你需要根据你的具体需求实现适合你的串行通信代码。同时,还可能需要根据你的系统配置和硬件设备来调整串口的打开和关闭以及数据的发送和接收的代码。

Linux中使用C++进行串行通信

要在Linux中使用C++进行串行通信,你可以使用标准的串口库,如termios.h。下面是一个简单的示例代码:

#include <iostream>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>int main() {// 打开串口文件int fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY);if (fd == -1) {std::cerr << "无法打开串口文件" << std::endl;return 1;}// 配置串口struct termios options;tcgetattr(fd, &options);cfsetispeed(&options, B9600); // 输入波特率为9600cfsetospeed(&options, B9600); // 输出波特率为9600options.c_cflag |= (CLOCAL | CREAD); // 启用本地连接和接收使能options.c_cflag &= ~PARENB; // 禁用奇偶校验options.c_cflag &= ~CSTOPB; // 1位停止位options.c_cflag &= ~CSIZE; // 屏蔽数据位设置options.c_cflag |= CS8; // 8位数据位tcsetattr(fd, TCSANOW, &options);// 读取串口数据char buffer[255];int bytesRead = read(fd, buffer, sizeof(buffer));if (bytesRead > 0) {std::cout << "接收到数据:";for (int i = 0; i < bytesRead; i++) {std::cout << buffer[i];}std::cout << std::endl;}// 发送数据到串口char data[] = "Hello World!";write(fd, data, sizeof(data) - 1);// 关闭串口文件close(fd);return 0;
}

请注意,上述代码假定你使用的是/dev/ttyUSB0作为串口设备文件。你需要根据实际情况修改此代码。此外,上述代码只是一个简单示例,并未处理异常情况。在实际应用中,你需要添加错误处理和异常检测来保证代码的稳定性和可靠性。

如果你想在Linux上使用WebAssembly,请确保已经安装了emscripten工具链,并将上述代码保存为serial.cpp文件。然后,通过以下命令编译为WebAssembly模块:

em++ -o serial.wasm serial.cpp

编译成功后,你可以通过HTML页面加载WebAssembly模块,并使用JavaScript与其交互。

听说异步不 支持

aio_read(&cb); // 异步读操作
// 或者
aio_write(&cb); // 异步写操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/100886.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实验1机器学习之线性回归实验

一、实验目的&#xff1a; &#xff08;1&#xff09;理解一元线性回归和多元线性回归的数学原理&#xff0c;能够利用sklearn中相关库解决现实世界中的各类回归问题&#xff1b; &#xff08;2&#xff09;掌握利用matplotlib对一元线性回归模型进行可视化的方法&#xff0c…

软件测试/测试开发丨为什么接口自动化测试是提升职业技能的关键?

接口测试背景和必要性 接口测试是测试系统组件间接口&#xff08;API&#xff09;的一种测试&#xff0c;主要用于检测内部与外部系统、内部子系统之间的交互质量&#xff0c;其测试重点是检查数据交换、传递的准确性&#xff0c;控制和交互管理过程&#xff0c;以及系统间相互…

HttpServletResponse对象

1.介绍 在Servlet API中&#xff0c;定义了一个HttpServletResponse接口&#xff0c;它继承自ServletResponse接口&#xff0c;专门用来封装HTTP响应消息。由于HTTP响应消息分为状态行、响应消息头、消息体三部分&#xff0c;因此&#xff0c;在HttpServletResponse接口中定义…

Android 面经总结分享(相当走心)

背景描述 这是来自一位粉丝朋友的面经分享&#xff0c;他在 「Android 开发行业」 摸爬滚打5年多的开发&#xff0c;呆过的互联网公司有三家&#xff0c;均从事的Android 开发的工作。最后离职的一家公司也是做的最久的一家&#xff0c;工作了将近3年多时光。 废话不多说了&a…

vscode更改为中文版本

方式一 在扩展里安装chinese插件 方式二 1.Ctrl&#xff0b; Shift &#xff0b;P&#xff08;commandshiftP&#xff09; 2.输入Configure display Language 3.选择zh-cn 这时候vscode会提示需要重启&#xff0c;点击restart重启vscode&#xff0c;重启后vscode就会显示中…

React18学习

17、React_JSX的注意事项 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>JSX的注意</title><script src"./script/react.development.js"></script><script src"…

【Mybatis】动态 SQL

动态 SQL \<if>标签\<trim>标签\<where>标签\<set>标签\<foreach>标签 动态 sql 是 Mybatis 的强⼤特性之⼀&#xff0c;能够完成不同条件下不同的 sql 拼接。 <if>标签 前端用户输入时有些选项是非必填的, 那么此时传到后端的参数是不确…

【eNSP】VLAN基础配置

一、基于接口划分VLAN&#xff08;Access接口和Trunk接口&#xff09; 1、创建VLAN LSW1 [LSW1]vlan batch 10 20 Info: This operation may take a few seconds. Please wait for a moment...done.LSW2 [LSW2]vlan batch 10 20 Info: This operation may take a few second…

【手写数字识别】数据挖掘实验二

文章目录 Ⅰ、项目任务要求任务描述&#xff1a;主要任务要求(必须完成以下内容但不限于这些内容)&#xff1a; II、实现过程数据集描述实验运行环境描述KNN模型决策树模型朴素贝叶斯模型SVM模型不同方法对MNIST数据集分类识别结果分析(不同方法识别对比率表及结果分析) 完整代…

32、Flink table api和SQL 之用户自定义 Sources Sinks实现及详细示例

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

Edge 无法登录/同步问题【一招搞定】

目录 前言 一、打开 Edge 浏览器显示未同步&#xff0c;点击同步无效 二、Edge 登录报错 0x801901f4 或 0x80190001 解决方法 2.1 报错 0x801901f4 解决方法 2.1.0 Edge 登陆报错图示 2.1.1 添加 Edge 推荐的 DNS 地址 2.1.2 重新登录 Edge 账号成功 2.2 报错 0x801…

【Ubuntu虚拟机】

Ubuntu虚拟机配置samba 转载知乎 samba: 安装samba服务 sudo apt-get install samba 2.确定是否确实安装了 samba --version 输入这个命令&#xff0c;确实安装的话&#xff0c;会打印出samba的版本 3.创建一个samba服务的共享目录&#xff0c;并配置该目录为最高权限 sudo …

多个git提交,只推送其中一个到远程该如何处理

用新分支去拉取当前分支的指定commit记录&#xff0c;之后推送到当前分支远程仓库实现推送指定历史提交的功能 1.查看当前分支最近五次提交日志 git log --oneline -5 2.拉取远程分支创建临时本地分支 localbranch 为本地分支名 origin/dev 为远程目标分支 git checkout …

数据库中查询所有表信息,查询所有字段信息

MYSQL中 所有表信息 information_schema.tables表 SELECT * FROM information_schema.tables -- TABLE_NAME 表名 -- TABLE_COMMENT 表中文名所有字段信息 information_schema.COLUMNS表 SELECT * FROM information_schema.tables -- TABLE_SCHEMA 数据库名 -- COLUMN…

python爬虫:多线程收集/验证IP从而搭建有效IP代理池

目录 一、前言 二、IP池的实现 1. 收集代理IP 2. 验证代理IP可用性 3. 搭建IP代理池 三、多线程实现 四、代理IP的使用 五、总结 一、前言 在网络爬虫中&#xff0c;IP代理池的作用非常重要。网络爬虫需要大量的IP地址来发送请求&#xff0c;同时为了降低被封禁的风险…

史上最全 结构型模式之 桥接 外观 组合 享元模式

史上最全 结构型模式之 代理 适配器 装饰者 模式-CSDN博客 5.4 桥接模式 5.4.1 概述 现在有一个需求&#xff0c;需要创建不同的图形&#xff0c;并且每个图形都有可能会有不同的颜色。我们可以利用继承的方式来设计类的关系&#xff1a; 我们可以发现有很多的类&#xff0c;假…

javascript禁止鼠标右键和复制功能

要禁止鼠标右键和复制功能&#xff0c;可以编写如下的封装函数&#xff1a; function preventDefaultCopy(event) {// 禁止右键 菜单和复制event.preventDefault();event.stopPropagation();return false; }// 在需要禁止复制的元素上添加该事件监听器 element.addEventListen…

colab切换目录的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

0基础学习VR全景平台篇 第106篇:认识调色软件Lightroom

上课&#xff01;全体起立~ 大家好&#xff0c;欢迎观看蛙色官方系列全景摄影课程&#xff01; 正式开讲之前需要先引出一个概念&#xff1a;到底什么是调色? 比如说上面这张照片&#xff0c;你可能会具体的指出照片中的元素有天空、山脉、草地等…… 如果我们跳出我们的固…

第83步 时间序列建模实战:Catboost回归建模

基于WIN10的64位系统演示 一、写在前面 这一期&#xff0c;我们介绍Catboost回归。 同样&#xff0c;这里使用这个数据&#xff1a; 《PLoS One》2015年一篇题目为《Comparison of Two Hybrid Models for Forecasting the Incidence of Hemorrhagic Fever with Renal Syndr…