ubuntu modbus 使用

目前使用的是一款测距传感器VL53L1, 再Ubuntu上用串口(usb转ttl)通信获取距离

程序如下:

#include <iostream>
#include <modbus/modbus.h>
#include <unistd.h>

using namespace std;

int main()
{
    cout << "Hello World!" << endl;

//     读取: 50 03 00 34 00 01 c8 45
//     接收: 50 03 02 01 2B 04 07
    uint8_t m_sendData[8] = {0x50,0x03,0x00,0x34,0x00,0x01,0xc8,0x45};
    uint8_t m_recvData[7] = {0}; //定义存放接收到的数据
    modbus_t *m_modbus = NULL; //定义指针

    //初始化串口
    m_modbus = modbus_new_rtu("/dev/ttyUSB0", 115200, 'N', 8, 1);
    if(0 == modbus_rtu_get_serial_mode(m_modbus)) {
        modbus_rtu_set_serial_mode(m_modbus, MODBUS_RTU_RS232);
        cout<<"serial is RS232"<<endl;
    } else {
        modbus_rtu_set_serial_mode(m_modbus, MODBUS_RTU_RS485);
        cout<<"serial is RS485"<<endl;
    }
    //设置等待时间,超过时间没连接上则报错。
    struct timeval response_timeout;
    response_timeout.tv_sec = 0;
    response_timeout.tv_usec = 500*1000;
    modbus_set_response_timeout(m_modbus,&response_timeout);

    //设置1可看到调试信息
    modbus_set_debug(m_modbus, 1);
    //设置slave ID
    modbus_set_slave(m_modbus, 1);

    //等待链接设备
    if(modbus_connect(m_modbus) == -1) {
        cout<<"connection failed: "<<modbus_strerror(errno)<<endl;
        return -1;
    }

    while (1) {
        printf("-------------send-----------------\n");
        modbus_send_raw_request(m_modbus, m_sendData, 8);

        printf("-------------recv-----------------\n");
        int rc = modbus_receive(m_modbus, m_recvData);
        if(rc == -1) {
            cout<<modbus_strerror(errno)<<endl;
        }

        for(int i=0;i<7;i++) {
            printf("reg[%d] = %d (0x%02x) \n", i, m_recvData[i], m_recvData[i]);
        }

        uint16_t dic = (m_recvData[3] << 8) | (m_recvData[4] & 0x00ff);
        printf("disc = %d\n", dic);

        usleep(100*1000);
    }

    modbus_close(m_modbus);
    modbus_free(m_modbus);

    return 0;
}

编译: g++ main.cpp -lmodbus

第一次使用modbus,还有很多不会的地方

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值