首页 > 其他分享 >s32k-I.MX8 基于串口通讯xrce-dds搭建

s32k-I.MX8 基于串口通讯xrce-dds搭建

时间:2023-12-14 14:12:28浏览次数:33  
标签:git xrce XRCE 编译 DDS Micro client 串口 MX8

s32k-iMX8平台XRCE-DDS的搭建

1. 引言

XRCE-DDS简述

      XRCE-DDS是可以在资源受限的MCU运行的DDS,在MCU侧运行客户端,通过代理服务参与DDS通信。

 

使用范围

       本文将描述整个XRCE-DDS在GEN2平台的搭建过程,包含SOC侧imx8上运行xrce-dds的anget和 s32k312单片机上运行的client的搭建。

2. 准备工作

Micro CDR库下载

eProsima Micro CDR是一个实现CDR标准序列化方法的C库。该库侧重于嵌入式和资源有限的系统。Micro CDR使用静态缓冲区,并允许在大端序和小端数中序列化和反序列化

Github下载:

git clone https://github.com/eProsima/Micro-CDR

 

Micro-XRCE-DDS-Agent下载

Anget端下载:

git clone https://github.com/eProsima/Micro-XRCE-DDS-Agent.git
 

Micro-XRCE-DDS-Client下载

Client端代码下载:
git clone https://github.com/eProsima/Micro-XRCE-DDS-Client.git
 

Installing the Micro XRCE-DDS Gen tool

git clone https://github.com/eProsima/Micro-XRCE-DDS-Gen.git
cd Micro-XRCE-DDS-Gen
git submodule init
git submodule update
./gradlew assemble
后续使用./scripts/microxrceddsgen xxx.idl生成数据结构的序列化和反序列化接口文件即可

Install S32DS tool

安装s32k编译环境,使得S32DS IDE中能进行编译和调试工作

3. 编译

Micro-cdr与Microxrcedds_client编译

Micro-cdr与mircoxrcedds_client需编译s32k环境对应版本,编译步骤如下:

 打开S32DS,选项栏中选择File->New->S32DS Library Project

 点击next->finish

  在项目目录端,右键点击src->import->File System

 

同上在项目include目录下import相应头文件

  修改config.h.in文件为config.h,内容如下

  右键项目Build Project,编译成功

   mircoxrcedds_client编译添加文件步骤同上,include/uxr/client/config.h对应的内容如下:

 

注意client选用的是UCLIENT_PROFILE_CUSTOM_TRANSPORT,我们将选用自定义的方式(通过lpuart)进行通讯

 

对microxrcedds_client进行裁剪

去掉非custom传输方式的代码

 

Client编译需包含cdr头文件,右键项目->Properties,cdr头文件路径加入Includes中

 

S32k主工程编译

        将上述编译的库链接到主工程中  

        添加头文件路径

        主工程中创建XRCE-DDS-Client发送接收的task

      将microdds Gen生成的.c和.h移至dds_task目录下

     结合LpUart自定义open/close/write/read接口

 

  建立会话后发送消息(参考client 例子example中CustomTransports消息发送)

Micro-XRCE-DDS-Agent编译

 修改CMakelists.txt,使得CMAKE_CXX_COMPILER与SYSROOT与Gen2平台匹配,以进行交叉编译

 自定义CustomAnget的init/fini/read/write函数,通过uart通讯实现

 设置串口通信的参数与单片机端保持一致

 完成编译

4. 通讯数据封装

由于串口通讯数据出现多包数据在缓冲区重叠的情况,导致在read的时候获取的数据包并非想得到的数据包,会导致xrce-dds在创建会话或者注册participant或者topic的时候失败,soc端和mcu端均存在此问题,需要对数据再次封装,识别数据帧的帧头和帧尾

7E 81 00 00 00 0A 01 05 00 02 00 00 00 80 7E  帧头和帧尾均添加7E,若数据中出现7E和7D, 转义为7D 02 和 7D 01

数据转义及处理

 

数据去头尾及解析

 

解析后的数据需要在recv_msg_function中多次返回,s32k端可将解析出的临时数据包放入ring_buf中,soc端可将解析出的数据放入二维容器中,再逐个返回

5. 备注

调试中遇到的问题及解决方案:

 

创建会话失败

    注册读写函数时,framing应设置为false

 

 Framing_io未使用可注释掉

my_custom_transport_open时,注意串口初始化不要多次进行,若其它地方已完成初始化,此处直接返回true即可

client端局部变量占空间较大,注意task创建线程时分配栈空间足够

 

创建participant/topic/publisher/datawriter失败

       此步骤发送字节约为388 Byte,并依次接收agent端注册成功返回消息,发送或接收字节丢失或者未解析出正确数据均会导致创建失败

此数据帧字节较多,需加上帧头帧尾后拆分发送,两端自定义write/read函数中加入sleep会导致数据接收不及时的问题,调试时需要注意

 

Soc端需采用O_NONBLOCK方式接收,通过select函数监视串口文件描述符实现数据端接收

 

注意read/write函数errorCode返回值的问题,若未接收到数据或者接收到异常buffer数据,返回errorCode > 0,否则交互会出现异常

 

uxr_run_session_time保持通讯失败,一个原因是timeout的时间过短,另外可修改client库中UXR_CONFIG_MIN_HEARTBEAT_TIME_INTERVAL的时间

 

      

标签:git,xrce,XRCE,编译,DDS,Micro,client,串口,MX8
From: https://www.cnblogs.com/doulcl/p/17901038.html

相关文章

  • NRF52832---串口通信
    我在做一个蓝牙demo,蓝牙主控用的nrf52832。在添加DFU功能后,使用“nRFConnect”app连接上demo后,点击“notify”,蓝牙就会断开连接,log打印如下图 没有提示出错的行号。我是用的蓝牙传输方式是透传。我查遍了关于nrf52832内存不足的帖子,都没有解决。我去问了技术售后(我买的开发......
  • ESP8266 01s,连接usb to ttl,结果电脑上不显示串口回应
    ESP826601s,连接usbtottl,结果电脑上不显示串口回应。     ———————————————————————————————————————————————————————————————————————————————————————————————......
  • 瑞萨RA串口打印排障过程
    在参考立创的教程进行电子时钟制作的时候,前期一直未能有效的实现串口日志输出,这里记录下排障过程。电子时钟制作教程:https://www.bilibili.com/video/BV12z4y1J7nQ/?spm_id_from=333.788&vd_source=516eee863e252e452d8dfe7cb01af5321、硬件阶段:参考教程,完成前期的原理图->PCB->......
  • [good]串口读取
    #include<stdio.h>#include<stdlib.h>#include<math.h>#include<limits.h>#include<string.h>#include<windows.h>#include"serialport.h"intmain(){//wordbyteWORD_BYTEwb;wb.word=0x12......
  • 51单片机串口通信
    51单片机串口通信​ 51单片机通过串口与PC通信1.发送一个字符a给PC#include"reg52.h"#include"intrins.h"sfrAUXR=0x8E;voidUartInit(void) //[email protected]{ AUXR=0x1; SCON=0x40;//选择串口工作方式1 TMOD&=0x0F; TMOD|=0x20;//定时器1工作在......
  • 极语言3-12绘图启动类、编解码类、串口通讯类、串口系统类、串口时间类、串口配置类—
    中文名字英文名称长度作用解释绘图启动类GdiplusStartupInput24包含GdiplusStartup函数所需的一个参数块。绘图启动类——成员表版本GdiplusVersion整数必须为1回调DebugEventCallback整数可以在调试版本上调用的回调函数的指针背景SuppressBackgroundThread整数指定是否禁止显示G......
  • 【驱动】串口驱动分析(一)-软件架构
    区分不同的终端类型串行端口终端(/dev/ttySn)串行端口终端(SerialPortTerminal)是使用计算机串行端口连接的终端设备。计算机把每个串行端口都看作是一个字符设备。有段时间这些串行端口设备通常被称为终端设备,因为那时它的最大用途就是用来连接终端。这些串行端口所对应的设备......
  • 虚拟串口工具vspd
     『实用教程』VSPD虚拟串口工具——从此告别硬件串口调试_虚拟串口vspd-CSDN博客   ......
  • 华为交换机设置串口密码
    [Huawei]user-interfaceconsole0//选择console口[Huawei-ui-console0]authentication-modeaaa//身份验证aaa模式[Huawei-ui-console0]quit[Huawei]aaa//进入aaa模式[Huawei-aaa]local-useradminpasswordcipher123//设置用户名和密码,密码采用密文(仅在本地有效)[Huawei-a......
  • 通用串口modbus转PROFIBUS DP网关PM-160在汽车行业的应用案例
    通用串口modbus转PROFIBUSDP网关PM-160在汽车行业的应用案例摘要:PM-160是泗博公司生产的,可以实现串口与PROFIBUSDP协议数据通信的网关。此案例讲述的是通过PM-160网关,成功将梅特勒-托利多电子秤上的自定义协议数据传递给西门子PLC的应用案例说明。背景:某公司做轴承和汽......