C++ 从IRobot Create 2打印串行数据
我正在为irobot create 2开发一个接口,在读取单个传入数据包时遇到问题。在哪里可以找到有关使用termios、read()、write()和printf()执行此操作的详细信息?除了大学期间的一些机器人项目外,我对这类编程还相当陌生,可能还遗漏了一些关键点。请原谅我的无知 到目前为止,我已经成功确认发送了初始化机器人、以各种模式启动机器人、启动/停止IO以及关闭机器人的命令。为了读取数据(以单个字节的形式输入),我通过write函数发送命令来定位指定的传感器数据包,这就是我感到困惑的地方。我为一个字节分配了一个向量,并尝试读取()返回值,然后打印它。我不确定打印值时使用哪种数据类型,或者我是否得到了想要的数据类型C++ 从IRobot Create 2打印串行数据,c++,byte,robotics,C++,Byte,Robotics,我正在为irobot create 2开发一个接口,在读取单个传入数据包时遇到问题。在哪里可以找到有关使用termios、read()、write()和printf()执行此操作的详细信息?除了大学期间的一些机器人项目外,我对这类编程还相当陌生,可能还遗漏了一些关键点。请原谅我的无知 到目前为止,我已经成功确认发送了初始化机器人、以各种模式启动机器人、启动/停止IO以及关闭机器人的命令。为了读取数据(以单个字节的形式输入),我通过write函数发送命令来定位指定的传感器数据包,这就是我感到困惑的
*yungBot.cpp*
#include "yungBot.h"
#include <iostream>
/*initialize robot*/
int yungBot::init(const char *yungin){
fd = open(yungin, O_RDWR | O_NOCTTY | O_NDELAY);
if(fd == -1){
perror("Error, failed to connect");
}
else{
fcntl(fd,F_SETFL,0);
tcflush (fd, TCIFLUSH);
}
struct termios parameters;
int get = tcgetattr(fd, ¶meters);
if(get == -1){
perror("Error getting attributes");
}
else{
printf("%s\n", "Get attributes: success");
}
cfmakeraw (¶meters);
//sets input and output baud rate
cfsetispeed(¶meters,B115200);
cfsetospeed(¶meters,B115200);
// or forces values to 1; and forces all values to 0 (off);
parameters.c_iflag &= ~(IXON | IXOFF); //flow control off;
parameters.c_cflag |=(CLOCAL | CREAD);
parameters.c_cflag &= ~(PARENB | CSTOPB);//no parity
parameters.c_cflag &= ~CSIZE; //mask the character bits
parameters.c_cflag |= (CS8); //8 bit character size
parameters.c_oflag = 0;
parameters.c_lflag = 0;//ICANON=canonical mode
parameters.c_cc[VMIN] = 0; // 1 input byte is enough to return from read()
parameters.c_cc[VTIME] = 1;// Timer off
//set attribute immediately
int set = tcsetattr(fd, TCSANOW, ¶meters);
if(set == -1){
perror("Error setting attributes \n");
}
if (fd == -1){
perror(yungin);
return -1;
}
usleep(200000);
return fd;
}
/*stream desired data packets of 1 unsigned byte*/
int yungBot::stream(int packet){
unsigned char command[]={142,packet};
if(write(fd, command, sizeof(command))==-1){
perror("failed to retrieve data packet");
return -1;
}
unsigned char response[1];
if(read(fd,response,sizeof(response))!=1){
perror("failed to write data packet");
return -1;
}
//shift through the byte for individual bits
/*unsigned char bit = response[1];
for(int i = 0; i < CHAR_BIT; i++){
printf("%d", (bit>>i)&1);
}
*/
printf("%i",response[0]);
return response[0];
}
这就是我所需要的吗?哦,这很简单。你可以用类似于
#define LEFT_BUMPER 1
#define RIGHT_BUMPER 2
#define REAR_BUMPER 4
#define FRONT_BUMPER 8
if(bumper_state & LEFT_BUMPER){ printf("left bumper actuated\n") }
if(bumper_state & RIGHT_BUMPER){ printf("right bumper actuated\n") }
使用的最佳数据类型通常是与您正在读取的数据大小相同的无符号类型,在这种情况下,uint8\u t就好了
此外,您不需要数组,如果需要,可以读入单个字节。这可能有助于避免以后的混淆。好的,那么这些是正确的值/我做得对吗?我想我只是没有意识到我需要手动计算这些值。我必须对所有传感器都这样做吗?另外,与无符号字符相比,使用uint8\u t是否有好处?中间凹凸是左凹凸和右凹凸的组合吗?如果两个传感器都启动,“中间”是两者的组合,则3可能是正确的。uint8_t是一种更具体的类型;无符号字符99.999%的时间是8位无符号整数,但并不能保证在所有体系结构上都是这样。基本上,他们使用8位的数量来存储一组布尔值,第一位是一回事,第二位是另一回事,等等。。。您可以按位和以2的幂来获取该特定位的状态。是的,只有左右两个传感器,因此中间传感器或两个车轮只是碰撞/车轮跌落传感器的组合。这太好了,我想我看到了如何获得单个比特,这是一个巨大的帮助。您能提供一个示例或资源来读取单个字节吗?仅使用过数组/编写过几个使用C系统调用的程序。我目前正在阅读,但任何建议都会有所帮助。数据以0、1或N+1字节的形式输入。因此,我认为需要一个阵列来覆盖各种尺寸。但我可能会感到困惑。还有很长的路要走,哈哈。与你可能使用过的其他语言相比,C语言非常简单。从根本上说,对read()的调用并不关心要写入的类型,它只需要一个指向某个内存的指针。如果您计划读取不同大小的内容,请继续使用一个数组作为读取缓冲区,但如果您愿意,可以读取单个字节(仅供参考)。
#define LEFT_BUMPER 1
#define RIGHT_BUMPER 2
#define REAR_BUMPER 4
#define FRONT_BUMPER 8
if(bumper_state & LEFT_BUMPER){ printf("left bumper actuated\n") }
if(bumper_state & RIGHT_BUMPER){ printf("right bumper actuated\n") }