public bool Motor5(int index, ushort id1, int value)
{
    const int function = 4;
    try
    {
        var byteList = new List<byte>
        {
            // 地址 1个字节,取低位
            (byte)(id1 % 256),
            // 功能码 1个字节 取低位
            (byte)(function % 256),
            // 起始地址2个字节  高位
            0x00,
            0x02,
            0x00,
            0x02
        };
        // 校验码
        byteList = CRC16(byteList);
        // 发送报文
        port.Write(byteList.ToArray(), 0, byteList.Count);
        Thread.Sleep(50);
        var buffer = new byte[port.BytesToRead];
        port.Read(buffer, 0, buffer.Length);
        if (RecordTimes > 30)
        {
            RecordTimes = 0;
            return true;
        }
        RecordTimes++;
        if (buffer[2] == 04)
        {
            var value3 = value <= 65535
                ? buffer[3] * 256 + buffer[4]
                : 65535 + buffer[3] * 256 + buffer[4] + buffer[6];
            if (value == value3)
            {
                RecordTimes = 0;
                return true;
            }
        }
        return false;
    }
    catch (Exception)
    {
        return false;
    }
}

代码功能说明:

  • 该函数通过串口发送指令控制电机,并根据返回值判断指令是否执行成功。
  • 代码使用 CRC16 校验码计算,确保指令传输的完整性。
  • 函数接收电机 ID、功能码和目标值,并根据返回值判断电机是否成功执行指令。
  • 代码中使用了 try-catch 块,捕获异常并返回 false,确保程序的健壮性。

代码使用方法:

  1. 将代码复制到您的项目中。
  2. port 变量设置为您的串口对象。
  3. 调用 Motor5 函数,并传入电机 ID、功能码和目标值。
  4. 根据返回值判断指令是否执行成功。

注意:

  • CRC16 函数需要根据您的具体实现进行替换。
  • RecordTimes 变量需要根据您的具体需求进行调整。
  • 代码中的 value 参数表示目标值,具体取值范围请参考电机规格。

示例:

// 初始化串口对象
SerialPort port = new SerialPort("COM1", 9600);

// 控制电机 ID 为 1 的电机转速为 1000
bool success = Motor5(1, 1, 1000);

// 判断指令是否执行成功
if (success)
{
    Console.WriteLine("电机控制成功!");
}
else
{
    Console.WriteLine("电机控制失败!");
}
C# Motor5 函数:控制电机,并验证返回值

原文地址: https://www.cveoy.top/t/topic/jFFw 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录