设为首页收藏本站
查看: 769|回复: 0

[MYD-YM62X 测评] 开发记录1

[复制链接]

7

主题

2

回帖

97

积分

注册会员

积分
97
毛巾卷 发表于 2024-5-2 14:14:18 | 显示全部楼层 |阅读模式
本帖最后由 毛巾卷 于 2024-5-2 14:14 编辑


# MYD-YM62X 测评开发记录


## emmc扩容
板载是有8G的emmc,但收到的板子文件系统里面只开放了1GB左右的内存,剩余的量不多,本着有就不要浪费的原则,就把剩下的也用上,可以输入如下命令进行扩容。

  1. resize2fs /dev/mmcblk0p2
复制代码


然后我们再次查看容量已经是扩容成功了。


## 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来加速开发就不用自己重复造轮子了。
      为了能在板子上使用,我们需要先交叉编译,交叉编译工具的安装具体参照米尔的教程。
  1. ./autogen.sh
  2. ./configure --prefix=***  --host=aarch64-oe-linux-musl --enable-static
  3. make -j4
  4. make install
复制代码
     编译完成



     然后就可以直接开始编写代码使用了。

###主机
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include "modbus.h"
  4. #include "modbus-rtu.h"

  5. int main(int argc, char **argv)
  6. {
  7.        
  8.         modbus_t *ctx = modbus_new_rtu("/dev/ttyS0", 9600, 'N', 8, 1);
  9.         if (ctx == NULL)
  10.         {
  11.                 fprintf(stderr, "modbus_new_rtu error!\n");
  12.                 return -1;
  13.         }
  14.         modbus_set_debug(ctx, 1);      //设置1可看到调试信息
  15.     modbus_set_response_timeout(ctx, 0, 1000000);

  16.         modbus_mapping_t *map =
  17.                 modbus_mapping_new_start_address(0,
  18.                                                                                 10,
  19.                                                                                 0,
  20.                                                                                 10,
  21.                                                                                 0,
  22.                                                                                 10,
  23.                                                                                 0,
  24.                                                                                 10);
  25.         if (modbus_connect(ctx) == -1) //等待连接设备
  26.         {
  27.             fprintf(stderr, "Connection failed\n");
  28.             return -1;
  29.         }

  30.         while(1)
  31.         {
  32.                 modbus_set_slave(ctx, 1);      //设置slave ID

  33.                 int rc = modbus_read_registers(ctx, 0x03, 3, map->tab_registers);////读取保持寄存器的值,可读取多个连续输入保持寄存器
  34.                 if (rc == -1)                  
  35.                 {
  36.                         fprintf(stderr, "modbus_read_registers error \n");
  37.                 }
  38.                 else
  39.                 {
  40.                         modbus_flush(ctx);
  41.                 }
  42.                
  43.                 sleep(1);
  44.         }

  45.         return 0;
  46. }
复制代码


###从机
  1. #include <stdio.h>
  2. #include <modbus.h>
  3. #include <modbus-rtu.h>
  4. #include <unistd.h>

  5. int main(int argc, char **argv)
  6. {
  7.         uint8_t query[256];
  8.         modbus_t *ctx = modbus_new_rtu("/dev/ttyS1", 9600, 'N', 8, 1);
  9.         if (ctx == NULL)
  10.         {
  11.                 fprintf(stderr, "modbus_new_rtu error!\n");
  12.                 return -1;
  13.         }
  14.         modbus_set_debug(ctx, 1);      //设置1可看到调试信息
  15.         modbus_set_slave(ctx, 1);      //设置slave ID
  16.     modbus_set_response_timeout(ctx, 0, 1000000);
  17.        
  18.         modbus_mapping_t *map =
  19.                 modbus_mapping_new_start_address(0,
  20.                                                                                 10,
  21.                                                                                 0,
  22.                                                                                 10,
  23.                                                                                 0,
  24.                                                                                 10,
  25.                                                                                 0,
  26.                                                                                 10);
  27.         if (modbus_connect(ctx) == -1) //等待连接设备
  28.         {
  29.             fprintf(stderr, "Connection failed\n");
  30.             return -1;
  31.         }

  32.         while(1)
  33.         {
  34.         int rc = modbus_receive(ctx, query);
  35.         int header_length = modbus_get_header_length(ctx);
  36.         query[0] = modbus_get_slave(ctx);
  37.         if (rc > 0)
  38.         {
  39.                         modbus_reply(ctx, query, rc, map);
  40.         }
  41.         else
  42.         {
  43.             modbus_flush(ctx);
  44.         }

  45.         usleep(50000);
  46.         }

  47.         return 0;
  48. }
复制代码


执行一下看下效果,这里板子上的两个485串口接在了一起,就是ttyS0跟ttyS1。



两边是可以正常通讯的,ok!
回复

使用道具 举报

您需要登录后才可以回帖 登录

本版积分规则

Archiver|手机版|小黑屋|米尔科技论坛   

GMT+8, 2024-11-21 17:32 , Processed in 0.092996 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表