comunicación en serie ros (leer datos en serie)

La comunicación serial ros es un medio de comunicación muy importante, y generalmente se comunica con la computadora inferior o con varios periféricos del puerto USB a través del puerto serial.

Luego seguimos el tutorial para aprender a leer los datos enviados desde el teléfono móvil al ordenador a través del puerto serie inalámbrico.

Aquí utilizo una herramienta usb-ttl para conectar Bluetooth a la computadora, y luego conecto el teléfono móvil a Bluetooth para enviar datos al Bluetooth, y luego la computadora lee los datos de la herramienta usb-ttl y los muestra.

1. En primer lugar, hay un paquete de puerto serie correspondiente en ros para que lo usemos. Es muy conveniente para nosotros llamar al paquete del puerto serie para programar. Descargue la biblioteca de puertos serie:

sudo apt-get install ros-melodic-serial

Mi versión ros es melódica. Si es diferente a la mía, reemplace melodic con el código de versión correspondiente.

2. Cree un paquete de funciones ros y agregue las dependencias correspondientes. Confíe principalmente en roscpp y paquetes seriales

catkin_create_pkg serial_demo roscpp serial

3. En la carpeta src del paquete de funciones serial_demo, creamos un programa C ++ de serial_demo.cpp.

Luego copie el siguiente código en él ( recuerde cambiar la velocidad en baudios en el programa a continuación para que sea consistente con la velocidad en baudios de Bluetooth, y cambie al puerto serie correcto al mismo tiempo ):

//serial_demo.cpp
#include <ros/ros.h>
#include <serial/serial.h>
#include <iostream>
 
int main(int argc, char** argv)
{
    ros::init(argc, argv, "serial_port");
    //创建句柄(虽然后面没用到这个句柄,但如果不创建,运行时进程会出错)
    ros::NodeHandle n;
    
    //创建一个serial类
    serial::Serial sp;
    //创建timeout
    serial::Timeout to = serial::Timeout::simpleTimeout(100);
    //设置要打开的串口名称
    sp.setPort("/dev/ttyUSB0");
    //设置串口通信的波特率
    sp.setBaudrate(9600);
    //串口设置timeout
    sp.setTimeout(to);
 
    try
    {
        //打开串口
        sp.open();
    }
    catch(serial::IOException& e)
    {
        ROS_ERROR_STREAM("Unable to open port.");
        return -1;
    }
    
    //判断串口是否打开成功
    if(sp.isOpen())
    {
        ROS_INFO_STREAM("/dev/ttyUSB0 is opened.");
    }
    else
    {
        return -1;
    }
    
    ros::Rate loop_rate(500);
    while(ros::ok())
    {
        //获取缓冲区内的字节数
        size_t n = sp.available();
        if(n!=0)
        {
            uint8_t buffer[1024];
            //读出数据
            n = sp.read(buffer, n);
            
            for(int i=0; i<n; i++)
            {
                //16进制的方式打印到屏幕
                std::cout << std::hex << (buffer[i] & 0xff) << " ";
            }
            std::cout << std::endl;
            //把数据发送回去
            sp.write(buffer, n);
        }
        loop_rate.sleep();
    }
    
    //关闭串口
    sp.close();
 
    return 0;
}

Modificar el archivo CMakeList, agregar opciones

add_executable(serial_demo src/serial_demo.cpp)
 
add_dependencies(serial_demo ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
 
target_link_libraries(serial_demo
  ${catkin_LIBRARIES}
)

4. Luego compile y ejecute:

Pero lo que muestra aquí son los datos en formato prohibido.

¿Cómo puedo modificarlo si quiero mostrar caracteres o cadenas?

Busque la línea 58 del programa, coméntela y agregue una línea de código para generar caracteres en la línea 59:

std :: cout << búfer [i];

Se puede ver que los caracteres enviados desde el teléfono móvil se han emitido correctamente:

Enlace de referencia: https://blog.csdn.net/u014695839/article/details/81209082

Supongo que te gusta

Origin blog.csdn.net/qqliuzhitong/article/details/114384297
Recomendado
Clasificación