포스트해주신 serial 통신에 대해서 궁금한점이 있습니다!

by Lee posted Mar 20, 2017
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄
안녕하세요!

ros serial 직렬통신에 대해서 올려주신걸 보았습니다. <ROS(Robot Operating System) 개념과 활용 - 4. ROS node를 이용하여 direct serial 통신하기>

다름이 아니라 제가 RS232 serial 통신을 이용하여 1/4 scale car를 구동시켜야 하는데

명령어를 보내는방법에 대해서 많이 부족해서 어려움을 겪고 있습니다.

 

밑에 같은 명령어를 보내어 speed, steer, brake 값을 제가 제어하고 싶은데 올려주신 코드에서 어느부분을 수정해서 보내야 제어가 가능할까요??

 

 Packet(14byte)

 BYTE NAME 

 S

T  

X  

AorM  

E-STOP  

GEAR  

SPEED0  

SPEED1  

STEER0  

STEER1  

BRAKE  

ALIVE  

ETX0  

EXT1  

 값

 0x53

0x54  

0x58  

0x00 or 0x01  

0x00 or 0x01  

0~2 

0~200  

 -2000~2000

1~33  

0~255  

0x0D  

0X0A  


#include <ros/ros.h>
#include <serial/serial.h>
#include <std_msgs/String.h>
#include <std_msgs/Empty.h>

serial::Serial ser;

void write_callback(const std_msgs::String::ConstPtr& msg){
    ROS_INFO_STREAM("Writing to serial port" << msg->data);
    ser.write(msg->data);
}

int main (int argc, char** argv){
    ros::init(argc, argv, "serial_example_node");
    ros::NodeHandle nh;

    ros::Subscriber write_sub = nh.subscribe("write", 1000, write_callback);
    ros::Publisher read_pub = nh.advertise<std_msgs::String>("read", 1000);

    try
    {
        ser.setPort("/dev/ttyACM0");
        ser.setBaudrate(9600);
        serial::Timeout to = serial::Timeout::simpleTimeout(1000);
        ser.setTimeout(to);
        ser.open();
    }
    catch (serial::IOException& e)
    {
        ROS_ERROR_STREAM("Unable to open port ");
        return -1;
    }

    if(ser.isOpen()){
        ROS_INFO_STREAM("Serial Port initialized");
    }else{
        return -1;
    }

    ros::Rate loop_rate(5);
    while(ros::ok()){

        ros::spinOnce();
        char testStr[]="Testype";
        ser.write(testStr);

        if(ser.available()){
            ROS_INFO_STREAM("Reading from serial port");
            std_msgs::String result;
            result.data = ser.read(ser.available());
            ROS_INFO_STREAM("Read: " << result.data);
            read_pub.publish(result);
        }
        loop_rate.sleep();

    }