型号
MDC300F, 刷的新的101版本, 操作系统是Ubuntu18. 除了Debug口, 有一路RS232的UART可以用, 不仅仅用于授时.
SOME/IP定义
mdc_uart_abstract_application.arxml
中定义的UDP端口号 54865(host, mcu的为51361).
uart_rx_service_interface.arxml
有 SOME/IP 的定义:
<EVENT-ID>32769</EVENT-ID>
...
<EVENT-GROUP-ID>16</EVENT-GROUP-ID>
...
<METHOD-ID>1</METHOD-ID>
...
<SERVICE-INTERFACE-ID>211</SERVICE-INTERFACE-ID>
数据上行 SOME/IP Event 定义
- EventID:0x8001
- ServiceID:0xd3
- InstanceID:1
- EventGroupID:0x10
数据下行 SOME/IP Method 定义
- MethodID:0x0001
- ServiceID:0xd3
- InstanceID:1
接收参数配置
UART通路配置参数定义 的路径: 产品文档 -> 接口说明 -> 数据透传 -> 通路配置说明 -> UART通路配置参数定义
假设我这里要给MDC发的UART数据如下:
- 波特率115200bps
- 帧头固定为 0x55, 0xAA
- 剩余有效数据长度为5
- 不要校验
本来是要写一下MMC的用法, 但是不晓得是MMC的问题, 还是MDS生成json出了错, 或者是我操作有问题, 总感觉101版本的生成的有bug, 特别是SyncData参数, 明明写的是uint8类型, 生成的json文件却是十六进制的string, 让人很无奈, 索性不走这条路了. 直接拷贝原有模版文件修改
# 如果是外面编写好的json文件上传到 /home/sftpuser/uploads/ 目录
# 如果传不了, 可能是文件的执行权限不够, 用chmod命令加权限
# 切换到配置文件目录
$ cd /opt/platform/mdc_platform/runtime_service/devmc/conf/
# 备份原有uart配置文件
$ cp mcu_uartbus_config.json mcu_uartbus_config.json.bak
# 拷贝模版文件修改
$ cp mcu_uartbus_config_m39.json mcu_uartbus_config.json
$ vi mcu_uartbus_config.json
# 主要修改如下
# 波特率是115200, 保持不变
{
"key": "BaudRate",
"value": {
"uint32": 115200
},
"checksum": 4213107651
},
# SyncData中的value修改为 85(0x55) 和 170(0xAA)
{
"key": "SyncData",
"value": {
"object[]": [
{
"key": "object",
"value": {
"uint8": 85
},
"checksum": 1360879489
},
{
"key": "object",
"value": {
"uint8": 170
},
"checksum": 264756932
}
]
},
"checksum": 572302646
}
# HeadFixLength 由原来的2修改为0
"key": "HeadFixLength",
"value": {
"uint8": 0
},
# DataFixLength 修改为 "uint8": 5
{
"key": "DataFixLength",
"value": {
"uint8": 5
},
"checksum": 1103247409
}
# 去掉校验 "uint8": 0
{
"key": "ChecksumSignalLengthSize",
"value": {
"uint8": 0
},
"checksum": 1103247409
},
# 下发uart配置到MCU
$ mdc-tool devm set-dev-cfg 0
# 复位MCU使配置生效
$ mdc-tool mcu reset mcu
新建UART工程
参考GPIO篇用MDS新建tk_uart工程, 导入官方的 uart_sample
. 文件树为
$ tree
.
├── cmake
│ └── toolchain.cmake
├── CMakeLists.txt
├── manifest
│ ├── application_sample
│ │ └── uart_sample
│ │ └── mdc_uart_abstract_application.arxml
│ └── common
│ ├── data_type
│ │ ├── mdc_data_type.arxml
│ │ └── mdc_mode_declaration.arxml
│ ├── machine
│ │ ├── dmini0_machine.arxml
│ │ ├── dmini1_machine.arxml
│ │ ├── dmini2_machine.arxml
│ │ ├── dmini3_machine.arxml
│ │ └── host_machine.arxml
│ └── service_interface
│ └── canfd_can_uart_gpio_sample
│ └── uart_rx_service_interface.arxml
└── modules
├── CMakeLists.txt
└── uart_sample
├── CMakeLists.txt
└── src
├── main.cpp
├── uart.cpp
└── uart.h
12 directories, 16 files
依次点击 Generate, Reload Cmake, Build 按钮, 点齿轮图标配置如下
点击Launch按钮运行
MDC发出的数据
115200波特率, 打开串口, HEX显示, 500ms发出一帧, 每帧发出69字节数据
发送数据到MDC
发送框输入 55 AA 01 02 03 04 05
, 勾选HEX发送, 定时发送, 100ms/次
可以在MDS的窗口中间隔大约100ms收到7字节数据:
命令行运行
命令行运行可以参照MDS运行时Console最上面的提示
$ export CM_CONFIG_FILE_PATH=/home/mdc/wks/tk_uart/etc/HostMachine/mdcuart/MdcUartProcess
$ /home/mdc/wks/tk_uart/bin/uart_sample
程序调用关系
日志调试
程序中开的有log, 可以查看MDC收发UART数据的log
# 删除掉之前的日志
$ rm -f /opt/log/host/platform_log/debug/MCU*
# 设置日志级别
# 日志总开关
# $ mdc-tool log-control level debug
# 设置MCU日志级别
$ mdc-tool mcu setloglevel debug
# https://bbs.huaweicloud.com/forum/thread-147089-1-1.html
# https://bbs.huaweicloud.com/forum/thread-146888-1-1.html
$ mdc-tool log-control appid MCU ctxid MCU level info
# 查看日志, 5s更新一次
# 串口助手发送数据给MDC
$ mdc-tool log-convert continue datatime /opt/log/host/platform_log/debug/MCU*.log | grep -i uGetMsg
2019/04/20 08:36:20.371737830 007 MCU MCU info [A I N 2019-4-20 0:36:20.349 cdd_datacen 26 uGetMsg:113443,PkgFrqHz:9]
2019/04/20 08:36:25.382858440 098 MCU MCU info [A I N 2019-4-20 0:36:25.359 cdd_datacen 26 uGetMsg:113765,PkgFrqHz:10]
2019/04/20 08:36:30.392578490 189 MCU MCU info [A I N 2019-4-20 0:36:30.369 cdd_datacen 26 uGetMsg:114087,PkgFrqHz:9]
2019/04/20 08:36:35.402783650 024 MCU MCU info [A I N 2019-4-20 0:36:35.379 cdd_datacen 26 uGetMsg:114402,PkgFrqHz:9]
...
# 可以看到 uGetMsg 的数据在增加, 频率大概9~10Hz
参考 【MDC300F】UART调试定位之MCU日志查看及分析_MDC智能驾驶计算平台_华为云论坛 (huaweicloud.com) UART相关的日志字段说明
第一部分 | ||
---|---|---|
打印名称 | 消息流动方向 | 描述 |
uCfg | host-mcu | 描述了UART配置下发的次数,无论成功与失败 |
uCfgPass | host-mcu | 描述了UART配置下发,其中通过校验的次数 |
uCfgTime | host-mcu | 描述了最后一次UART成功下发的次数 |
uGetMsg | uart-mcu | 描述了UART传输给MCU的UART报文(1Byte)的个数 |
PkgFrqHz | host-mcu | 描述了UART传输给MCU的数据包的速率,单位为个/秒,一个数据包包括多个Byte,长度不定 |
uPkgS | uart-mcu | 描述了UART传输给MCU的数据包的个数(通过同步头) |
RSIPp | mcu-host | 描述了MCU传输给SomeIP的成功的数据包的个数 |
RSIPf | mcu-host | 描述了MCU传输给SomeIP的失败的数据包的个数 |
uSIPReq | host-mcu | 描述了HOST传输给MCU的请求的个数 |
up | mcu-uart | 描述了MCU传输给UART成功的数据包的个数 |
uf | mcu-uart | 描述了MCU传输给UART失败的数据包的个数 |
uPkgLgtErr | uart-mcu | 描述了UART传送给MCU的数据包,长度错误的数据包的个数 |
uCtCurMs | uart-ram-mcu | 描述了UART将数据存在buffer中,MCU连续两次从buffer中获取数据的时间间隔,单位为毫秒 |
uCtMinMs | uart-ram-mcu | 描述了一段时间内,MCU连续两次从buffer中获取数据的最小时间间隔,单位为毫秒 |
uCtMaxMs | uart-ram-mcu | 描述了一段时间内,MCU连续两次从buffer中获取数据的最大时间间隔,单位为毫秒 |
第二部分 | ||
RSIPp | mcu-host | 描述了MCU传输给SomeIP的成功的数据包的个数 |
RSIPf | mcu-host | 描述了MCU传输给SomeIP的失败的数据包的个数 |
MDReq | host-mcu | 描述了HOST传输给MCU的Method数据包的个数 |