|
本帖最后由 毛巾卷 于 2024-5-2 14:14 编辑
# MYD-YM62X 测评开发记录
## emmc扩容
板载是有8G的emmc,但收到的板子文件系统里面只开放了1GB左右的内存,剩余的量不多,本着有就不要浪费的原则,就把剩下的也用上,可以输入如下命令进行扩容。
然后我们再次查看容量已经是扩容成功了。
## libmodbus
GitHub - stephane/libmodbus:适用于 Linux、Mac OS、FreeBSD 和 Windows 的 Modbus 库
libmodbus是一个用C语言编写的开源Modbus通信协议库。它支持Modbus TCP、Modbus RTU和Modbus ASCII等通信方式,可以用于实现Modbus主机和从机设备之间的通信。libmodbus提供了一系列的函数和工具,使用户能够轻松地在自己的应用程序中集成Modbus通信功能。该库在Linux、Windows和其他操作系统上都可以运行,并且支持多种编程语言的接口,如C、Python和Java等。libmodbus的使用简单灵活,是开发Modbus通信应用程序的一个很好的选择。
YM62X上有两个带隔离的RS485接口,这是工业控制上常见的通讯接口,一般都是使用modbus协议,这里我们使用libmodbus来加速开发就不用自己重复造轮子了。
为了能在板子上使用,我们需要先交叉编译,交叉编译工具的安装具体参照米尔的教程。
- ./autogen.sh
- ./configure --prefix=*** --host=aarch64-oe-linux-musl --enable-static
- make -j4
- make install
复制代码 编译完成
然后就可以直接开始编写代码使用了。
###主机
- #include <stdio.h>
- #include <unistd.h>
- #include "modbus.h"
- #include "modbus-rtu.h"
- int main(int argc, char **argv)
- {
-
- modbus_t *ctx = modbus_new_rtu("/dev/ttyS0", 9600, 'N', 8, 1);
- if (ctx == NULL)
- {
- fprintf(stderr, "modbus_new_rtu error!\n");
- return -1;
- }
- modbus_set_debug(ctx, 1); //设置1可看到调试信息
- modbus_set_response_timeout(ctx, 0, 1000000);
- modbus_mapping_t *map =
- modbus_mapping_new_start_address(0,
- 10,
- 0,
- 10,
- 0,
- 10,
- 0,
- 10);
- if (modbus_connect(ctx) == -1) //等待连接设备
- {
- fprintf(stderr, "Connection failed\n");
- return -1;
- }
- while(1)
- {
- modbus_set_slave(ctx, 1); //设置slave ID
- int rc = modbus_read_registers(ctx, 0x03, 3, map->tab_registers);////读取保持寄存器的值,可读取多个连续输入保持寄存器
- if (rc == -1)
- {
- fprintf(stderr, "modbus_read_registers error \n");
- }
- else
- {
- modbus_flush(ctx);
- }
-
- sleep(1);
- }
- return 0;
- }
复制代码
###从机
- #include <stdio.h>
- #include <modbus.h>
- #include <modbus-rtu.h>
- #include <unistd.h>
- int main(int argc, char **argv)
- {
- uint8_t query[256];
- modbus_t *ctx = modbus_new_rtu("/dev/ttyS1", 9600, 'N', 8, 1);
- if (ctx == NULL)
- {
- fprintf(stderr, "modbus_new_rtu error!\n");
- return -1;
- }
- modbus_set_debug(ctx, 1); //设置1可看到调试信息
- modbus_set_slave(ctx, 1); //设置slave ID
- modbus_set_response_timeout(ctx, 0, 1000000);
-
- modbus_mapping_t *map =
- modbus_mapping_new_start_address(0,
- 10,
- 0,
- 10,
- 0,
- 10,
- 0,
- 10);
- if (modbus_connect(ctx) == -1) //等待连接设备
- {
- fprintf(stderr, "Connection failed\n");
- return -1;
- }
- while(1)
- {
- int rc = modbus_receive(ctx, query);
- int header_length = modbus_get_header_length(ctx);
- query[0] = modbus_get_slave(ctx);
- if (rc > 0)
- {
- modbus_reply(ctx, query, rc, map);
- }
- else
- {
- modbus_flush(ctx);
- }
- usleep(50000);
- }
- return 0;
- }
复制代码
执行一下看下效果,这里板子上的两个485串口接在了一起,就是ttyS0跟ttyS1。
两边是可以正常通讯的,ok!
|
|