Vector - CAPL - RS232串口处理

摸鱼聊天、答疑解惑首选之地 --- 车载网络哪些事儿

你是否还在为VT板卡系统昂贵而发愁?是否为MCU log没办法而烦恼?当前车载网络协议测试这块,vector可以说是一家独大,因此各种骚操作一年比一年多,然而对于我们测试工程师来说,我们只想最快、最准确的完成测试,但是VT板卡的价格让大部分公司望而却步。但是对于测试网络唤醒、CAN总线短路等,我们又必须使用CANoe的高精度测试,这也形成了一个矛盾体;那该如何解决呢?继电器是个好东西,时延和准确度都是1ms左右,完全能够满足我们的测试需求,因此我们可以通过控制继电器来实现控制硬线唤醒或者其他硬线的操作,在保证测试结果的情况下做个折中的替代。

另外一方面,在测试过程中,测试工程最烦恼的一件事就是没有MCU log,我们没办法分析,你去复现一下 ,把MCU log抓取一下吧;如果是必现问题还好,但是如果是低概率问题,那无论是谁我想都是痛苦面具了,这不仅浪费我们的时间,实际情况是还不一定有很好的工作产出,那我们该如何去做呢?是的,我们可以直接通过自动化抓取MCU log,这样在每次测试完成,就可以同时抓取MCU log,减少我们的无意义工作量了,因此通过串口抓取log非常有必要了。 那RS232有非常有必要提上日程了,今天我们就来介绍下RS232相关函数。

RS232Open

功能:打开一个串口端口

说明:串行端口在当前执行CAPL代码的节点上可用,同一个端口可以由多个节点使用,如果端口已打开,其他程序将无法再访问串行端口。

port:串口端口号,取值范围1 - 255

返回值:

0:系统上不存在具有给定编号的串行端口或者另一个程序正在占用该串口端口号

1:打开成功

代码示例

if ( 1==RS232Open(1) ) 
{
    write("open serial port 1 success");
    TestStepPass("Check","open serial port 1 success");
}
else
{
    write("open serial port 1 fail");
    TestStepFail("Check","open serial port 1 fail");
}

RS232Close

功能:关闭一个已打开串口

说明:所有节点的串行端口都将关闭。同一个端口可以由多个节点关闭(或重复关闭);关闭后,其他程序可以使用串行端口。关闭串行端口后,端口的配置将丢失。下次打开端口时,将使用系统默认值进行配置。

总结起来就是一旦关闭port串口,CAPL与该串口断开连接,无法被使用;且配置全部恢复为默认配置,再次打开如果有特殊配置需要重新进行配置。

port:串口端口号,取值范围1 - 255

返回值:

0:系统上不存在具有给定编号的串行端口

1:打开成功

代码示例

if ( 1==RS232Close(1) ) 
{
    write("Close serial port 1 success");
    TestStepPass("Check","Close serial port 1 success");
}
else
{
    write("Close serial port 1 fail");
    TestStepFail("Close","open serial port 1 fail");
}

RS232Configure

功能:配置串口参数

说明:

如果是不使用该函数则使用默认配置

默认配置信息:默认波特率 9600,8个数据位,1个停止位,无奇偶校验。

port:串口端口号,取值范围1 - 255

baudrate:用于接收和传输的波特率,通常使用9600。一般根据设备支持的波特率进行设置。通常,115200是允许的最大值。

numberOfDataBits:传输帧内的数据位数;最多使用8,默认一般也是使用8。只有介于5和8之间的值是可能的。串行端口不支持所有值,也不支持与其他帧参数的所有组合。

numberOfStopBits:一种设置传输帧内停止比特数的值。

1

使用1个停止位

2

使用2个停止位

parity:标识要使用的奇偶校验模式的值

0

未使用奇偶校验,即帧不包含奇偶校验位

1

奇数奇偶校验

2

偶数奇偶校验

enableParityCheck:指示是启用还是禁用奇偶校验。如果参数奇偶校验设置为0(未使用奇偶校验),则忽略此参数。

0:奇偶校验已禁用

!=0 (≠0):奇偶校验已启用

返回值:

0:如果端口不存在或者端口未打开,则返回0

1:配置成功

代码示例

if (0!=RS232Configure(1,9600,8,1,0)) 
{
    write("configuration serial port 1 success");
    TestStepPass("Check","configuration serial port 1 success");
}
else
{
    write("configuration serial port 1 fail");
    TestStepFail("configuration","open serial port 1 fail");
}

RS232Send

功能:在串行端口上发送数据块。

说明:向串行端口发送一个字节块,该操作开始发送块,回调处理程序RS232OnSend将通知节点完成。

要了解操作后期发生的错误,请使用RS232OnError;出现错误时,不会自动重试。

port:串口端口号,取值范围1 - 255

buffer:将发送其数字的字节数组。

number:要发送的字节数。

返回值:

0:系统上不存在具有给定编号的串行端口;

端口尚未打开;

之前不久使用了另一个非阻塞发送操作;

前一个发送操作可能尚未完成,从而导致错误;

1:成功发送了串口数据。

代码示例

char text[20] = “Hello World !”;
byte buffer[20];
int i;
int length;
length=strlen(text)+1;
//初始化发送buffer
for (i=0;i<length;i++) buffer[i]=text[i];

if (1==RS232Send(1,buffer,length) ) 
{
    write("serial port 1 send data success");
    TestStepPass("Check","serial port 1 send data success");
}
else
{
    write("serial port 1 send data fail");
    TestStepFail("serial port 1 send data fail");
}

RS232Receive

功能:设置串行端口的接收器缓冲区。

说明:如果接收到任何数据,则回调处理程序RS232OnReceive将通知节点。

如果将给出另一个接收操作,则结果缓冲区将更改为上次接收操作给出的缓冲区。

要了解操作后期发生的错误,请使用RS232OnError。接收的重试将持续启动,但如果再次发生错误,将不会通知您。

port:串口端口号,取值范围1 - 255

buffer:接收串口数据的数组。

number:可接受的最大字节数。

返回值:

0:系统上不存在具有给定编号的串行端口;

端口尚未打开;

之前不久使用了另一个非阻塞发送操作;

前一个发送操作可能尚未完成,从而导致错误;

1:成功接收到了串口数据

代码示例

byte mybuffer[20];
int mysize=20;
if ( 1==RS232Receive(1,mybuffer,mysize) )
  write(“It works with port 1.”);

if(1 == RS232Receive(F_PowerPort,receivebyte,30))
{
      testWaitForTimeout(150);
      Byte2Str(gReceiverBuffer,receivebuf,30);
      ReSleCur = (atodbl(receivebuf))*500;
      if(gReceiverBuffer[0] == 0x22&&
            gReceiverBuffer[1] == 0x01&&
            gReceiverBuffer[2] == 0x11)
      {
        testWaitForTimeout(888);ReSleCur = 255; 
        return ReSleCur;
       }
      else
      {
          if((ReSleCur < @NM_test::Sleep_Current)&&(ReSleCur>=0))
          {
            testWaitForTimeout(3000);
            testStepPass("Check","DUT enter sleep success,current: %fmA",ReSleCur);
           }
       }
}

RS232OnSend

功能:在RS232Send发出的请求完成后,将调用处理程序。

说明:

用于完成对串行端口的发送操作的回调处理程序。

将仅在发出发送操作的节点上调用。

只有在成功时才会调用处理程序

port:串口端口号,取值范围1 - 255

buffer:将发送其数字的字节数组。

number:要发送的字节数。

返回值:

0:如果不使用发送操作,则会发生错误

1:发送成功

代码示例

char text[20] = “Hello World !”;
byte block[20];
int i;
int length;
length=strlen(text)+1;
for (i=0;i<length;i++) block[i]=text[i];

if ( 0!=RS232Send(1,block,length) )
   write(“Written block of bytes to port 1.”);

// 在发出发送请求的节点
RS232OnSend(dword port, byte buffer[], dword number)
{
   // send completed now, it may time to issue the next send
   // buffer==block, number==length
}

RS232OnReceive

功能:如果在端口接收到数据,将定期调用处理程序,从调用RS232Receive开始。

说明:

用于在串行端口接收数据的回调处理程序。

将仅在为给定端口发出RS232Receive操作的节点上调用,只有在成功时才会调用处理程序

缓冲区可能比数字大得多。对于非常慢的连接,可能会调用几个字节的处理程序。至少给出了一个字节。可以在多个节点监听同一个端口,将使用相同的数据调用所有节点。

port:串口端口号,取值范围1 - 255

buffer:接收串口数据的数组。

number:可接受的最大字节数。

返回值:

0:如果没有启动接收操作,则会发生错误

1:接收成功

代码示例

// at sender node
char text[20] = “Hello World !”;
byte block[20];
int i;
int length;
length=strlen(text)+1;
for (i=0;i<length;i++) block[i]=text[i];

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 here
   // buffer==mybuffer, number<=mysize
   // buffer contains some parts of block
}

RS232OnError

功能:如果发生错误,将调用处理程序。

说明:

用于在串行端口接收错误的回调处理程序。

将仅在发出发送/接收操作的节点处调用。

对于重复错误(稳定错误条件),只返回第一个错误。这种情况可能发生在接收错误的情况下,即在两个连接端的配置不匹配的情况下。

在配置不匹配的情况下,错误可能不会同时发生,例如,一个端口9600/8/1/无奇偶校验,另一端115200/8/1/没有奇偶校验的配置可能看起来有效(尽管接收到垃圾)。

port:串口端口号,取值范围1 - 255

errorFlags:位被设置为标记条件。

Bit

Error

0

发送操作失败。

1

接收操作失败。

2

帧错误,可能由奇偶校验失配或任何其他帧失配(例如停止位的数量)引起。

3

帧奇偶校验错误,是由奇偶校验不匹配引起的。

4

缓冲区溢出,如果发送方的驱动程序发送速度不够快,如果是接收方在太短的时间内获得了太多数据,或者其他任何情况,都没有指定。

5

接收器缓冲区溢出。

6

中断状态,另一端请求暂停。

7

超时,可能是由于错误设置的超时时间太短造成的。请参阅RS232SetHandshake以设置超时。

代码示例

RS232OnError(dword port, dword errorFlags)
{
   if ( errorFlags & 1 )
      writeLineEx(0,3,“send failed”);
   if ( errorFlags & 2 )
      writeLineEx(0,3,“receive failed”);
}

串口处理函数用的好能够在工作中帮助我们解决很多不必要的麻烦和问题,大家可以深度研究,我们一起交流!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【小猫爪】AUTOSAR学习笔记06-Communication Stack之ComM模块

【小猫爪】AUTOSAR学习笔记06-Communication Stack之ComM模块前言1 ComM简介2 ComM功能介绍2.1 PNC 状态管理2.2 Channel状态管理2.3 通信禁止功能2.4 不同类型的NM2.5 User、PNC 与 Channel 的映射2.6 状态保存END前言 因为一个偶然的机会让我接触到了AUTOSAR&#xff0c;所以…

数据库--进阶版-11--SQL优化

1.插入数据 insert优化&#xff1a; 例如要插入下面这些 insert into tb_test values(1,tom); insert into tb_test values(2,cat); insert into tb_test values(3,jerry); 我们可以通过以下几个方面进行操作&#xff1a; >批量插入&#xff08;如果一次性要插入多条…

排好队,一个一个来:宫本武藏教你学队列(附各种队列源码)

文章目录前言&#xff1a;理解“队列”的正确姿势一个关于队列的小思考——请求处理队列的两大“护法”————顺序队列和链式队列数组实现的队列链表实现的队列循环队列关于开篇&#xff0c;你明白了吗&#xff1f;最后说一句前言&#xff1a; 哈喽&#xff01;欢迎来到黑洞晓…

货物摆放 (蓝桥杯) JAVA

题目描述 小蓝有一个超大的仓库&#xff0c;可以摆放很多货物。 现在&#xff0c;小蓝有n 箱货物要摆放在仓库&#xff0c;每箱货物都是规则的正方体。 小蓝规定了长、宽、高三个互相垂直的方向&#xff0c;每箱货物的边都必须严格平行于长、宽、高。 小蓝希望所有的货物最终摆…

可换皮肤的Qt登录界面

⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨‍🎓。 如果觉得本文能帮到您,麻烦点个赞👍呗! 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三连支持一下呗。👍⭐️❤️ 可换皮肤的Qt登录界面 QSS的学习笔记 快…

真是一篇神奇的文章 动图DIY - 动图剪辑 - 录屏 - 画画动图 (无需VIP的软件推荐)

很多人想自己去搞一些 动图 &#xff0c;去了好多网址或者app&#xff0c;不是收费 &#x1f4b4; 就是 VIP &#x1f511; &#xff0c;博主也苦恼了好久&#xff0c;今天遇到一款超级、无敌、好用的软件 ScreeTogif &#xff0c;下载连接 &#x1f617;&#x1f619;&#x1…

高通开发系列 - Sensors Bring Up

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 返回高通开发系列 - 总目录 目录 问题背景高通android sensor信息Sensors Execution Environment (SEE)qxdm抓sensor log的方法android 调试…

Hadoop之Mapreduce序列化

目录 什么是序列化&#xff1a; 什么是反序列化&#xff1a; 为什么要序列化&#xff1a; Java的序列化&#xff1a; Hadoop序列化: 自定义序列化接口&#xff1a; 实现序列化的步骤&#xff1a; 先看源码进行简单分析&#xff1a; 序列化案例实操&#xff1a; 案例需…

蓝桥杯真题——自动售水机

2012年第四届全国电子专业人才设计与技能大赛“自动售水机”设计任务书1. 系统框图接下来我们将任务分块&#xff1a; 1. 按键控制单元 设定按键 S7 为出水控制按键&#xff0c;当 S7 按下后&#xff0c;售水机持续出水&#xff08;继电器接通&#xff0c;指示 灯 L10 点亮&…

Java中的JSON序列化和反序列化

文章目录Java 和 JSON 序列化JSON 简介JSON 是什么JSON 标准JSON 优缺点JSON 工具Java JSON 库JSON 编码指南Fastjson 应用添加 maven 依赖Fastjson API定义 Bean序列化反序列化Fastjson 注解JSONFieldJSONTypeJackson 应用添加 maven 依赖Jackson API序列化反序列化容器的序列…

开箱即用的密码框组件

写了一个小玩具&#xff0c;分享一下 - 组件功能&#xff1a; 初次进入页面时&#xff0c;密码隐藏显示&#xff0c;且无法查看真实密码 当修改密码时&#xff0c;触发键盘&#xff0c;输入框则会直接清空 此时输入密码&#xff0c;可以设置密码的隐藏或显示&#xff1a; …

Spark了解

目录 1 概述 2 发展 3 Spark和Hadoop 4 Spark核心模块 1 概述 Apache Spark是一个快速、通用、可扩展的分布式计算系统&#xff0c;最初由加州大学伯克利分校的AMPLab开发。 Spark可以处理大规模数据处理任务&#xff0c;包括批处理、迭代式算法、交互式查询和流处理等。Spa…

算法强化每日一题--组队竞赛

大家好 先看看题目 链接&#xff1a;组队竞赛__牛客网 [编程题]组队竞赛 牛牛举办了一次编程比赛,参加比赛的有3*n个选手,每个选手都有一个水平值a_i.现在要将这些选手进行组队,一共组成n个队伍,即每个队伍3人.牛牛发现队伍的水平值等于该队伍队员中第二高水平值。 例如: 一个队…

pytest学习和使用21-测试报告插件allure-pytest如何使用?

21-测试报告插件allure-pytest如何使用&#xff1f;1 Allure简介2 环境配置2.1 allure-pytest插件安装2.2 pytest安装2.3 allure文件下载2.4 allure环境变量配置2.5 配置java环境3 查看allure版本4 运行allure4.1 测试用例4.1 执行方法4.3 报告查看方法4.4 指定报告生成的端口4…

使用TensorFlow Serving进行模型的部署和客户端推理

目的&#xff1a;在一个server端使用TensorFlow框架对模型进行训练和保存模型文件后用TensorFlow Serving进行部署&#xff0c;使得能在客户端上传输入数据后得到server端返回的结果&#xff0c;实现远程调用的效果。环境&#xff1a;操作系统&#xff1a; ubuntu 20.04.1当然可…

函数(上)——“Python”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰的内容是Python的函数呀&#xff0c;下面&#xff0c;就让我们进入函数的世界吧 首先可以选择性地看一下小雅兰很久之前写的C语言函数章节的知识&#xff1a; 函数——“C”_认真学习的小雅兰.的博客-CSDN博客 函数递归&#xf…

【进阶数据结构】二叉搜索树经典习题讲解

&#x1f308;感谢阅读East-sunrise学习分享——[进阶数据结构]二叉搜索树 博主水平有限&#xff0c;如有差错&#xff0c;欢迎斧正&#x1f64f;感谢有你 码字不易&#xff0c;若有收获&#xff0c;期待你的点赞关注&#x1f499;我们一起进步 &#x1f308;我们在之前已经学习…

鸟哥的Linux私房菜 Shell脚本

第十二章、学习 Shell Scripts https://linux.vbird.org/linux_basic/centos7/0340bashshell-scripts.php 12.2 简单的 shell script 练习 #!/bin/bash# Program: # User inputs his first name and last name. Program shows his full name.read -p "Please in…

【SpringMVC】SpringMVC方式,向作用域对象共享数据(ModelAndView、Model、map、ModelMap)

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 向域对象共享数据一、使用 原生ServletAPI二、…

渲染机制(四):硬件加速

文章目录一、概述二、硬件绘制与软件绘制模型三、软件绘制刷新的逻辑四、总结五、参考一、概述 从 Android 3.0&#xff08;API 级别 11&#xff09;开始&#xff0c;Android 2D 渲染管道支持硬件加速&#xff0c;也就是说&#xff0c;在 View 的画布上执行的所有绘制操作都会使…