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