Linux系统下使用cutecom进行串口通信(二)


Linux系统下使用cutecom进行串口通信(一)中简要介绍了cutecom的安装及使用方法,本文将结合ros程序(C++),进一步探究Linux系统下的串口通信。

一、Serial库

1)安装

前人栽树,后人乘凉。在ros中,前辈们早就将串口通信编成了库,直接使用如下命令行安装:

$ sudo apt-get install ros-rosdistro-serial

添加头文件,引入serial库:

$ #include <serial/serial.h>

当然,为了保证能够找到serial.h文件,还需修改CMakeLists,将serial库包含进来:

find_package(catkin REQUIRED COMPONENTS
  serial
)

在package.xml中添加:

<build_depend>serial</build_depend>
<build_export_depend>serial</build_export_depend>
<exec_depend>serial</exec_depend>

笔者在创建功能包时直接包含了serial,所以CMakelists.txt和package.xml文件无需再次添加编译规则:

$ catkin_create_package [PACKAGE_NAME] roscpp rospy serial

2)类的方法

串口通信并不复杂,掌握其中参数的设置就能够正常使用了。想要使用serial库,需要创建一个对象:

$ serial::Serial sp;

执行构造函数时会对参数进行初始化:

Serial (const std::string &port = "",
	uint32_t baudrate = 9600,
    Timeout timeout = Timeout(),
    bytesize_t bytesize = eightbits,
    parity_t parity = parity_none,
    stopbits_t stopbits = stopbits_one,
    flowcontrol_t flowcontrol = flowcontrol_none);

具体serial的函数调用的方法:

方法说明备注
sp.setPort("/dev/ttyUSB0")设置串口名称Linux下usb口名称
sp.setBaudrate(115200)设置波特率为115200保证波特率一致
serial::Timeout to = serial::Timeout::simpleTimeout(1000)
sp.setTimeout(to)
设置Timeout默认
sp.setBytesize(serial::bytesize_t(8))设置数据位fivebits = 5; sixbits = 6;
sevenbits = 7; eightbits = 8
sp.setParity(serial::parity_t(0))设置奇偶校验parity_none = 0; parity_odd = 1;
parity_even = 2; parity_mark = 3;
parity_space = 4
sp.setStopbits(serial::stopbits_t(1))设置停止位stopbits_one = 1; stopbits_two = 2, stopbits_one_point_five = 3
sp.setFlowcontrol(serial::flowcontrol_t(0))设置串口流控flowcontrol_none = 0; flowcontrol_software = 1; flowcontrol_hardware = 2
sp.open()打开串口在设置参数后打开
sp.isOpen()判断串口是否打开返回bool类型
sp.available()获取缓冲区内的字节数返回size_t类型
sp.read(buffer, n)读取数据从缓冲区读取n个数据,
放入uint8_t类型的buffer数组
sp.write(buffer, n)写入数据将uint8_t类型的buffer数组中的前n个数据,
写入缓冲区
sp.flush()清空串口存储空间写入数据后即时清空
sp.close()关闭串口程序结束前关闭

除此之外还有一些其他的函数,具体可参考serial的头文件。

二、程序及解析

使用trycatch语句尝试打开串口:

try { 
	//设置串口属性,并打开串口 
	sp.setPort("/dev/ttyUSB0"); 
    sp.setBaudrate(115200); 
    serial::Timeout to = serial::Timeout::simpleTimeout(1000); 
    sp.setTimeout(to); 
    sp.open(); 
} catch (serial::IOException& e) { 
	ROS_ERROR_STREAM("Unable to open port "); 
	return -1; 
} 
//检测串口是否已经打开,并给出提示信息 
if(sp.isOpen()) { 
	ROS_INFO_STREAM("Serial Port initialized"); 
} else { 
	return -1; 
}

当终端输入如下信息时,说明串口能够正常使用:

Serial Port initialized

1)node→cutecom

假设发送两个数据:x和y。串口数据格式为:x用4个字节表示,y用两个字节表示,先发低位后发高位。为了保证数据能够被准确解析,在实际数据前增加标志位数据0xaa,0xbb和0xcc。编码程序如下所示:

int serSize = 10;
uint8_t serData[serSize];		//定义串口数据存放数组,注意防止数据溢出

int error = 3;
serData[0] = 0xaa;
serData[1] = 0xbb;
serData[2] = 0xcc;

int32_t x_32 = int32_t(30123.0);
char *pt0 = (char*)&x_32;
serData[0+error] = pt0[0];
serData[1+error] = pt0[1];
serData[2+error] = pt0[2];
serData[3+error] = pt0[3];

int16_t y_16 = int16_t(1575.0);
char *pt1 = (char*)&y_16;
serData[4+error] = pt1[0];
serData[5+error] = pt1[1];

sp.write(serData, serSize);

运行程序,并打开cutecom,即可观察到数据。

2)cutecom→node

由cutecom发送串口数据,数据格式同1)node→cutecom。发送的数据如下:

aa bb cc ab 75 00 00 27 06

解码程序如下所示:

int serSize = 10;
uint8_t serData[serSize];		//定义串口数据存放数组,注意防止数据溢出
double x_;
double y_;

ser.read(serData,serSize);//从缓冲区中读取80位数据,存放到定义好的数组中
for (int i =0; i < 2 * serSize; i++) {
	if (serData[i] == 0xaa) {
		if (serData[i+1] == 0xbb) {
			if (serData[i+2] == 0xcc) {
				x_ = comb32(serData[i+6], serData[i+5], serData[i+4], serData[i+3]) * 1.0;
				y_ = comb16(serData[i+8], serData[i+7]) * 1.0;
			}		
		}	
	}
}
ROS_INFO("x_: %f, y_: %f", x_, y_);

按照通信协议格式解析数据,需要用到解析函数comb16()comb32()。我用的是师兄kailon写的,具体如下:

int16_t comb16(uint8_t high, uint8_t low)  //数据解析2个8位->16位
{
    int16_t temp = 0;
    temp = ((int16_t)high << 8);
    temp |= ((int16_t)low);
    return temp;
}

int32_t comb32(uint8_t first, uint8_t second, uint8_t third, uint8_t fourth)  //数据解析4个8位->32位
{
    int32_t temp = 0;
    temp = ((int32_t)first << 24);
    temp |= ((int32_t)second << 16);
    temp |= ((int32_t)third << 8);
    temp |= ((int32_t)fourth);
    return temp;
}

三、测试结果

1)node→cutecom

在这里插入图片描述
串口数据为:

aa bb cc ab 75 00 00 27 06

2)cutecom→node

在这里插入图片描述

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 在Linux使用版本为0.30.3的CuteCom修改设备是可行的。CuteCom是一个串口监视器和调试工具,可以用于与串口设备进行通信和调试。 首先,确保已经在Linux系统中安装了CuteCom。如果没有安装,可以通过包管理器(例如apt、yum等)进行安装。安装完成后,打开CuteCom。 在CuteCom的菜单栏中,选择 "文件" 选项,并选择 "打开设备"。在弹出的对话框中,你可以看到当前可用的串口设备列表。 要修改设备,首先选择你想要修改的串口设备。然后,点击 "属性" 按钮,这将打开一个新的对话框。 在 "属性" 对话框中,你可以更改串口的名称、波特率、数据位、校验位、停止位等参数。确保根据你实际的要求进行配置。 完成设备的修改后,点击 "确定" 按钮保存更改,并关闭 "属性" 对话框。 现在,你已经成功修改了设备。你可以在CuteCom的界面中看到更新后的串口设备信息。你可以点击 "打开设备" 按钮,开始使用修改后的设备进行通信和调试。 总的来说,通过CuteCom的界面,你可以方便地修改串口设备,并根据需要配置相关的参数。这为你在Linux系统中与串口设备进行通信和调试提供了便利。 ### 回答2: 在Linux使用版本为0.30.3的cutecom修改设备,你可以按照以下步骤进行操作: 1. 首先,确保已经安装了cutecom软件包。可以通过终端使用以下命令安装:sudo apt-get install cutecom 2. 打开cutecom应用程序。你可以在应用程序菜单中找到它,或者从终端输入cutecom命令来打开它。 3. 在cutecom中,点击菜单栏中的"Options"(选项)> "Serial Port"(串口)。 4. 在打开的串口设置对话框中,选择你想要修改的串口设备。 5. 你可以通过设置波特率、数据位、停止位、校验位等来修改串口设备的配置。这些设置可以根据你与设备的通信需求来调整。 6. 在修改完设备配置后,点击对话框底部的"OK"按钮保存更改。 7. 现在,你可以使用cutecom来与修改后的设备进行通信了。在cutecom主界面上方的工具栏中,你可以找到发送、接收和其他与设备通信相关的功能。 请注意,具体的设备修改步骤可能会因设备类型和通信协议的不同而有所差异。上述步骤仅适用于使用cutecom版本0.30.3进行一般串口设备的修改。如果需要修改复杂的设备或其他通信协议,请参考设备文档或在线资源以获取更详细的指导。 ### 回答3: 要在Linux使用版本为0.30.3的Cutecom来修改设备,首先需要确保已经安装了该版本的Cutecom软件。可以通过在终端中运行以下命令来安装Cutecom: ``` sudo apt-get install cutecom ``` 安装完成后,可以在应用程序菜单或通过终端运行Cutecom。 在Cutecom界面中,选择设备菜单,并选择要修改的设备。你可以在菜单中找到设备的列表,或者选择"扫描设备"来查找可用的设备。 选择要修改的设备后,可以通过在设置菜单中调整设备的各种参数。例如,你可以更改串口号、波特率、数据位、停止位、校验位等参数。 在设置好设备参数后,你可以通过在界面上方的工具栏中选择发送数据按钮来发送数据到设备。你可以在文本框中输入要发送的数据,并选择发送方式,例如ASCII或进制。 如果你需要接收设备发送的数据,你可以在界面上方的工具栏中选择接收数据按钮。接收到的数据将显示在文本框中。 最后,如果你对设备的修改完成,可以通过选择设备菜单中的保存选项来保存修改后的配置。这样,下次使用Cutecom时,你可以直接加载你之前保存的设备配置。 总之,使用版本为0.30.3的Cutecom来修改设备在Linux中是相对简单的。你只需要安装Cutecom,选择要修改的设备,调整设备参数,发送和接收数据,并保存修改后的配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值