【CANOE】【Capl】【RS232】控制串口设备

news2025/1/16 1:14:22

在这里插入图片描述

系列文章目录

内置函数,来控制传统的串口设备,比如继电器等


文章目录

  • 系列文章目录
  • 前言
  • 一、控制串口
  • 二、自定义相关的参数
    • RS232Configure
      • **函数语法**
      • **函数功能**
      • **参数说明**
      • **返回值**
      • **示例代码**
  • 三、回调函数的使用
    • RS232OnSend
      • **函数语法**
      • **函数功能**
      • **参数说明**
      • **返回值**
      • **示例代码**
    • RS232OnReceive
      • **函数语法**
      • **函数功能**
      • **参数说明**
      • **返回值**
      • **示例代码**
        • **发送端节点代码**
        • **接收端节点代码**
        • **处理接收数据的回调**
      • **注意事项**
      • **版本支持**
    • RS232OnError
      • **`RS232OnError` 函数说明**
      • **函数语法**
      • **函数功能**
      • **参数说明**
        • **`errorFlags` 位标志说明**
      • **返回值**
      • **示例代码**
      • **注意事项**
  • 总结


前言

可能有时候遇到设备不是很多的情况下,并且对应时间精准度没有过高要求的时候,可以只控制继电器就行。


提示:以下是本篇文章正文内容,下面案例可供参考

一、控制串口


void testR232Fun(long com_num){
  byte data[2];
  int length=2;
  data[0]=1;
  data[1]=2;
  
 rs232Open(com_num);// 打开串口
 rs232Send(com_num,data,length);//发送数据
 rs232Close(com_num);//串口数据关闭
  
}

二、自定义相关的参数

RS232Configure

RS232Configure 函数说明

RS232Configure 是 CAPL 脚本中的一个函数,用于配置串行端口的通信参数。CAPL 提供了两种形式的该函数,分别支持基本和扩展的配置选项。


函数语法

形式1:

dword RS232Configure(dword port, dword baudrate, dword numberOfDataBits, dword numberOfStopBits, dword parity);

形式2:

dword RS232Configure(dword port, dword baudrate, dword numberOfDataBits, dword numberOfStopBits, dword parity, dword enableParityCheck);

函数功能

配置指定的串口参数。如果未显式配置,将使用默认参数:

  • 波特率:9600
  • 数据位:8
  • 停止位:1
  • 校验位:无校验。

注意:
如果存在过时的 .INI 配置文件,函数会优先使用 .INI 文件中的参数。


参数说明

参数类型描述
portdword串口号,范围为 1255
baudratedword波特率,例如 9600115200 是大多数情况下的最大值。
numberOfDataBitsdword每帧数据位数,范围为 58,通常为 8
numberOfStopBitsdword停止位数:
1:1 个停止位
2:2 个停止位。
paritydword校验模式:
0:无校验
1:奇校验
2:偶校验。
enableParityCheckdword是否启用校验检查:
0:禁用
非 0:启用。
仅在 parity 不为 0 时有效,仅在形式 2 中提供。

返回值

返回值描述
0配置失败:
- 指定的串口号不存在
- 串口未被打开。
1配置成功。

示例代码

以下示例设置串口 1 的典型默认配置(波特率为 9600,8 数据位,1 停止位,无校验):

if (0 != RS232Configure(1, 9600, 8, 1, 0)) {
    write("Set typical default at port 1.");
} else {
    write("Configuration failed.");
}

三、回调函数的使用

RS232OnSend

RS232OnSend 函数说明

RS232OnSend 是 CAPL 脚本中的一个回调函数,用于处理串口发送操作完成后的事件。该函数会在发送操作成功完成时被调用,允许开发者在数据发送完成后进行后续处理。


函数语法

RS232OnSend(dword port, byte buffer[], dword number);

函数功能

  • 回调处理RS232OnSend 在串口发送操作成功完成后被自动调用,用于处理发送完的数据。
  • 只有在发送成功时,该函数才会被调用。如果发送过程中出现错误,则会触发 RS232OnError 函数。

参数说明

参数类型描述
portdword串口号,范围为 1255
bufferbyte[]指向发送数据缓冲区的指针,包含发送的数据。
numberdword已成功发送的字节数。

返回值

返回值描述
0错误:如果没有进行发送操作或发生了错误。
1成功:发送操作成功完成。

示例代码

以下是一个示例代码,演示如何使用 RS232OnSend 回调函数来处理发送操作完成后的后续任务:

char text[20] = "Hello World !";
byte block[20];
int i;
int length;
length = strlen(text) + 1;  // 计算字符串长度并加上结尾的 '\0'
for (i = 0; i < length; i++) {
    block[i] = text[i];  // 将字符串内容复制到发送缓冲区
}

// 发送数据到串口 1
if (0 != RS232Send(1, block, length)) {
    write("Written block of bytes to port 1.");
}
// 在发起发送请求的节点上
RS232OnSend(dword port, byte buffer[], dword number)
{
   // 发送完成,可以进行下一步操作
   // buffer == block, number == length
   write("Send completed. Proceeding with the next operation.");
}

RS232OnReceive

RS232OnReceive 函数说明

RS232OnReceive 是 CAPL 脚本中的一个回调函数,用于处理串口接收操作完成后的事件。该函数会在数据接收成功后被调用,从而让用户能够对接收到的数据进行处理。


函数语法

RS232OnReceive(dword port, byte buffer[], dword number);

函数功能

  • 回调处理: 当指定串口成功接收到数据时触发该回调函数。
  • 如果接收过程中发生错误,则会调用 RS232OnError 进行错误处理。
  • 可以在多个节点上监听同一个串口,所有监听的节点都会接收到相同的数据。

参数说明

参数类型描述
portdword串口号,范围为 1255
bufferbyte[]接收到的数据缓冲区指针,包含接收的数据内容。
numberdword实际接收到的字节数,可能小于指定的缓冲区大小,至少为 1。

返回值

返回值描述
0错误:如果未启动接收操作或发生了错误。
1成功:接收操作成功完成。

示例代码

以下示例展示了发送和接收串口数据的完整流程:

发送端节点代码
char text[20] = "Hello World !";
byte block[20];
int i;
int length;

// 准备发送数据
length = strlen(text) + 1;  // 包含字符串结束符 '\0'
for (i = 0; i < length; i++) {
    block[i] = text[i];
}

// 发送数据到串口 1
if (0 != RS232Send(1, block, length)) {
    write("Written block of bytes to port 1.");
}
接收端节点代码
// 定义接收缓冲区和缓冲区大小
byte mybuffer[100];
int mysize = 100;

// 启动接收数据操作
RS232Receive(2, mybuffer, mysize);
处理接收数据的回调
// 回调函数:当接收到数据时触发
RS232OnReceive(dword port, byte buffer[], dword number) {
    // port == 2
    // buffer == mybuffer, number <= mysize
    // 打印接收到的数据内容
    writef("Received %d bytes from port %d: %s\n", number, port, buffer);
}

注意事项

  1. 数据缓冲区大小: buffer 的大小由 RS232Receive 中指定的大小决定,但 number 可能小于缓冲区大小。
  2. 调用条件: 只有调用了 RS232Receive 的节点会触发 RS232OnReceive 回调。
  3. 数据分片: 对于慢速连接,接收到的数据可能分多次触发 RS232OnReceive,因此要根据 number 逐步处理接收到的数据。
  4. 多节点监听: 如果多个节点监听同一串口,所有节点都会收到相同的数据。

版本支持

  • 版本支持: 从 CAPL 版本 7.1 开始支持。

如果有更多关于 RS232OnReceive 或其他串口操作的问题,可以随时提供具体需求,我们将进一步协助。


RS232OnError

RS232OnError 函数说明

RS232OnError 是 CAPL 脚本中的一个回调函数,用于处理串口通信过程中发生的错误。当 RS232SendRS232Receive 操作失败时,该函数会被触发,以便记录错误信息或采取相应措施。


函数语法

RS232OnError(dword port, dword errorFlags);

函数功能

  • 回调处理: 在串口通信发生错误时触发该回调函数。
  • 错误汇总: errorFlags 参数提供了累计的错误信息,通过检查特定位来确定具体的错误原因。
  • 如果错误是持续性的(例如配置不匹配导致的帧错误),仅在首次出现时触发。

参数说明

参数类型描述
portdword串口号,范围为 1255
errorFlagsdword错误标志的累计汇总,使用位掩码表示具体的错误类型(见下表)。
errorFlags 位标志说明
位编号错误类型描述
0发送操作失败RS232Send 操作失败。
1接收操作失败RS232Receive 操作失败。
2帧错误通常由帧参数不匹配引起,例如奇偶校验或停止位数不一致。
3奇偶校验错误通常由奇偶校验设置不匹配引起。
4缓冲区溢出(发送端)发送端缓冲区溢出,可能是因为接收端处理速度太慢导致无法及时处理数据。
5缓冲区溢出(接收端)接收端缓冲区溢出,可能是因为数据量过大或接收端无法及时处理。
6中断状态通信对端请求暂停通信。
7超时通常由超时设置不当或其他通信中断问题引起。

返回值

该函数没有返回值。


示例代码

以下代码展示了如何通过 RS232OnError 回调处理串口错误:

// 回调函数:处理串口通信错误
RS232OnError(dword port, dword errorFlags) {
    // 输出发生错误的串口号
    writef("Error on port %d:\n", port);

    // 根据错误标志位分析具体错误
    if (errorFlags & (1 << 0)) {
        writeLine("Send operation failed.");
    }
    if (errorFlags & (1 << 1)) {
        writeLine("Receive operation failed.");
    }
    if (errorFlags & (1 << 2)) {
        writeLine("Frame error occurred.");
    }
    if (errorFlags & (1 << 3)) {
        writeLine("Parity error detected.");
    }
    if (errorFlags & (1 << 4)) {
        writeLine("Buffer overrun at sender.");
    }
    if (errorFlags & (1 << 5)) {
        writeLine("Buffer overrun at receiver.");
    }
    if (errorFlags & (1 << 6)) {
        writeLine("Break state detected (pause requested).");
    }
    if (errorFlags & (1 << 7)) {
        writeLine("Timeout occurred.");
    }
}

注意事项

  1. 错误诊断: errorFlags 中的多个位可能同时被设置,表示多个错误条件同时发生。
  2. 持续性错误: 持续性的错误(例如配置不匹配)可能仅在首次出现时被触发,需特别注意这种情况。
  3. 配置验证: 通常,帧错误或奇偶校验错误可能由两端通信参数(例如波特率、数据位、停止位、奇偶校验)不匹配引起。请确保通信双方参数一致。
  4. 日志记录: 使用 writewriteLine 将错误信息记录到日志,以便调试和诊断问题。

总结

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

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

相关文章

配置泛微e9后端开发环境

配置泛微e9的后端开发环境 1.安装jdk1.8&#xff08;请自行安装并设置环境变量&#xff09; 2.将服务器上的WEARVER文件夹拷贝到开发环境下(其中要包含ecology和Resin目录) 3.通过idea创建一个基础Java项目,将jdk设置为1.8 4.添加依赖,需要将3个文件夹的所有jar包添加到项目中…

python+django5.1+docker实现CICD自动化部署springboot 项目前后端分离vue-element

一、开发环境搭建和配置 # channels是一个用于在Django中实现WebSocket、HTTP/2和其他异步协议的库。 pip install channels#channels-redis是一个用于在Django Channels中使用Redis作为后台存储的库。它可以用于处理#WebSocket连接的持久化和消息传递。 pip install channels…

【React】全局状态管理(Context, Reducer)

以下为知行小课学习笔记。 概述 Context 跨组件共享状态 在 Next 项目&#xff0c;封装 useContext。 AppContext.tsx "use client";import React, {createContext, Dispatch, ReactNode, SetStateAction, useContext, useMemo, useState} from react;type State …

ENSP IPv6-over-IPv4 OSPFv3

目前主流网络还是IPv4网络&#xff0c;IPv6网络尚未规模化部署。由于网络演进还存在较长时间IPv4到IPv6过渡期或IPv4和IPv6网络共存期。为此&#xff0c;国际标准组织为应对较长时间过渡期&#xff0c;形成了相关的过渡技术标准。目前主要存在三种过渡技术&#xff1a;双协议栈…

open-instruct - 训练开放式指令跟随语言模型

文章目录 关于 open-instruct设置训练微调偏好调整RLVR 污染检查开发中仓库结构 致谢 关于 open-instruct github : https://github.com/allenai/open-instruct 这个仓库是我们对在公共数据集上对流行的预训练语言模型进行指令微调的开放努力。我们发布这个仓库&#xff0c;并…

git使用(三)

git使用&#xff08;三&#xff09; git各阶段回退操作命令git checkout --git reset HEADgit reset --hardgit refloggit push -fgit diff HEAD -- git推送代码冲突解决方案两个人对不同代码段做修改两个人对相同代码段做修改 git各阶段回退操作命令 git checkout – 当在工作…

深度学习基础1

目录 1. 深度学习的定义 2.神经网络 2.1. 感知神经网络 2.2 人工神经元 2.2.1 构建人工神经元 2.2.2 组成部分 2.2.3 数学表示 2.2.4 对比生物神经元 2.3 深入神经网络 2.3.1 基本结构 2.3.2 网络构建 2.3.3 全连接神经网络 3.神经网络的参数初始化 3.1 固定值初…

设计模式-适配器模式-注册器模式

设计模式-适配器模式-注册器模式 适配器模式 如果开发一个搜索中台&#xff0c;需要适配或接入不同的数据源&#xff0c;可能提供的方法参数和平台调用的方法参数不一致&#xff0c;可以使用适配器模式 适配器模式通过封装对象将复杂的转换过程隐藏于幕后。 被封装的对象甚至…

2025年人工智能,自动化与机械工程国际学术会议(AIAME2025)

早鸟通道开启&#xff1a; 2025年人工智能&#xff0c;自动化与机械工程国际学术会议&#xff08;AIAME2025&#xff09; 2025 International Conference on Artificial Intelligence, Automation, and Mechanical Engineering 【重要日期】 早鸟征稿截止日期&#xff1a;…

IntelliJ IDEA配置(mac版本)

用惯了eclipse开发java的小伙伴们&#xff0c;初次接触IntelliJ IDEA可能会和我一样&#xff0c;多少有些不适感&#xff0c;在使用过程中总想着eclipse得对应功能。 接下来&#xff0c;我就总结下我日常开发中遇到的常用配置&#xff08;不包括快捷键&#xff0c;我认为每个人…

GateWay使用手册

好的&#xff0c;下面是优化后的版本。为了提高可读性和规范性&#xff0c;我对内容进行了结构化、简化了部分代码&#xff0c;同时增加了注释说明&#xff0c;便于理解。 1. 引入依赖 在 pom.xml 中添加以下依赖&#xff1a; <dependencies><!-- Spring Cloud Gate…

在内网工作时,如何使用 vscode remote ssh 去连接内网服务器?

来源&#xff1a;https://stackoverflow.com/questions/56671520/how-can-i-install-vscode-server-in-linux-offline 看这个回答&#xff1a; 一般来说&#xff0c;内网会提供 vscode 安装包&#xff0c;remote-ssh 的 vsix&#xff0c;先安装好。 随后&#xff0c;保证自己…

学习日记_20241126_聚类方法(自组织映射Self-Organizing Maps, SOM)

前言 提醒&#xff1a; 文章内容为方便作者自己后日复习与查阅而进行的书写与发布&#xff0c;其中引用内容都会使用链接表明出处&#xff08;如有侵权问题&#xff0c;请及时联系&#xff09;。 其中内容多为一次书写&#xff0c;缺少检查与订正&#xff0c;如有问题或其他拓展…

吉客云数据集成技巧:智能实现MySQL物料信息查询

吉客云数据集成技巧&#xff1a;智能实现MySQL物料信息查询 吉客云数据集成到MySQL&#xff1a;物料信息查询案例分享 在企业的数据管理和分析过程中&#xff0c;数据的高效集成与处理至关重要。本文将聚焦于一个具体的系统对接集成案例——吉客云物料信息查询到BI拉伯塔的物料…

Flink cdc同步增量数据timestamp字段相差八小时(分析|解决)不是粘贴复制的!

问题 我使用flink cdc同步mysql到mysql遇到了timestamp字段缺少八小时的问题。很少无语&#xff0c;flink ,cdc,debezium时区都设置了&#xff0c;没有任何效果&#xff01; 分析 问题出现在mysql binlog身上&#xff01;&#xff01;&#xff01; 因为默认mysql会使用UTC来…

QUICK 调试camera-xml解析

本文主要介绍如何在QUICK QCS6490使能相机模组。QCS6490的相机基于CameraX的框架&#xff0c;只需通过配置XML文件&#xff0c;设置相机模组的相关参数&#xff0c;就可以点亮相机。本文主要介绍Camera Sensor Module XML和Camera Sensor XML配置的解析&#xff0c;这中间需要c…

ArcGIS 软件中路网数据的制作

内容导读 路网数据是进行网络分析的基础&#xff0c;它是建立网络数据集的数据来源。 本文我们以OSM路网数据为例&#xff0c;详细介绍OSM路网数据从下载&#xff0c;到数据处理&#xff0c;添加属性&#xff0c;完成符合网络分析的网络数据集的全部过程。 01 数据获取 比较…

Flink双流Join

在离线 Hive 中&#xff0c;我们经常会使用 Join 进行多表关联。那么在实时中我们应该如何实现两条流的 Join 呢&#xff1f;Flink DataStream API 为我们提供了3个算子来实现双流 join&#xff0c;分别是&#xff1a; join coGroup intervalJoin 下面我们分别详细看一下这…

【Python-Open3D学习笔记】005Mesh相关方法

TriangleMesh相关方法 文章目录 TriangleMesh相关方法1. 查看mesh三角形面信息2. 可视化三角形3. 上采样4. 计算mesh形成的面积和体积 1. 查看mesh三角形面信息 def view_hull_triangles(hull: o3d.geometry.TriangleMesh):"""查看mesh三角形面信息&#xff08…

【LeetCode热题100】优先级队列

这盘博客记录了关于优先级队列的几道题&#xff0c;包括最后一块石头的重量、数据流中的第K大元素、前K个高频单词、数据流的中位数。 class Solution { public:int lastStoneWeight(vector<int>& stones) {priority_queue<int> heap;for(auto s : stones) hea…