目前使用的是一款测距传感器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,还有很多不会的地方
