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


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

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

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

    #include 
    #include 
    
    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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    接下来,通过以下命令将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
    
    • 1

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

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

    DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>Serial Communicationtitle>
    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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

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

    emrun --no_browser --port 8080 .
    
    • 1

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

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

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

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

    #include 
    #include 
    #include 
    #include 
    
    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); // 输入波特率为9600
        cfsetospeed(&options, B9600); // 输出波特率为9600
        options.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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

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

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

    em++ -o serial.wasm serial.cpp
    
    • 1

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

    听说异步不 支持

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

  • 相关阅读:
    JTS-通过Coordinate点截断几何Geometry
    一键制作搞笑对话视频,抖音情感故事对话视频制作神器
    多探头球面近场天线测试效率提升方法
    ​南阳师范学院图书馆藏《​乡村振兴战略下传统村落文化旅游设计》许少辉八一新著——2023学生开学季辉少许
    Unity之Hololens如何实现3D物体交互
    如何解决工业相机达不到标称帧率
    十大排序算法(C++)
    JavaSE——异常处理机制
    1509_人月神话阅读笔记_整体与部分
    计算机毕业设计Java高校防疫物资管理系统(源码+系统+mysql数据库+lw文档)
  • 原文地址:https://blog.csdn.net/chenhao0568/article/details/133738582