需要帮助修复pololu maestro的C代码吗

需要帮助修复pololu maestro的C代码吗,c,serial-port,C,Serial Port,我试图使用C语言移动多个伺服。我使用的是pololu mini maestro 24频道。我修改了用户手册中提供的代码。我在手册中粘贴了移动多个伺服的紧凑协议。但它不起作用。没有警告错误,但代码不起作用。我使用了一个串行监视器,查看了一下串行输出,得到了以下结果: [b] aa 0c 1f[u]0d[/u]0a 07 70 2e 70 2e 70 2e 70 2e 70 2e 70 2e 70 2e 70 2e 70 2e 70 2e 70 2e 70 2e[/b] 我不知道为什么里面有个“0d

我试图使用C语言移动多个伺服。我使用的是pololu mini maestro 24频道。我修改了用户手册中提供的代码。我在手册中粘贴了移动多个伺服的紧凑协议。但它不起作用。没有警告错误,但代码不起作用。我使用了一个串行监视器,查看了一下串行输出,得到了以下结果:

[b] aa 0c 1f[u]0d[/u]0a 07 70 2e 70 2e 70 2e 70 2e 70 2e 70 2e 70 2e 70 2e 70 2e 70 2e 70 2e 70 2e[/b]

我不知道为什么里面有个“0d”。它不应该在那里。哦,我正在从通道0获取pot位置,但我无法移动伺服。如果你能帮我,那就太好了

//使用POSIX函数从Maestro发送和接收数据。
//注意:Maestro的串行模式必须设置为“USB双端口”。
//注意:您必须更改下面的“const char*device”行。
#包括
#包括
#包括
#ifdef_WIN32
#定义O_NOCTTY 0
#否则
#包括
#恩迪夫
#包括
内部模式(内部a、内部b)
{
if(b<0)//您可以分别检查b==0并执行您想要的操作
返回模式(-a,-b);
int ret=a%b;
如果(ret<0)
ret+=b;
返回ret;
}
//获取Maestro通道的位置。
//请参阅《用户指南》的“串行伺服命令”部分。
int maestroGetPosition(int fd,无符号字符通道)
{
无符号字符命令[]={170,12,16,channel};
if(写入(fd,command,sizeof(command))=-1)
{
perror(“错误写入”);
返回-1;
}
无符号字符响应[2];
如果(读取(fd,响应,2)!=2)
{
perror(“错误读取”);
返回-1;
}
返回响应[0]+256*响应[1];
}
//设置大师频道的目标。
//请参阅《用户指南》的“串行伺服命令”部分。
//“目标”的单位是四分之一微秒。
int-maestroSetTarget(int-fd,无符号字符通道,int-target[]))
{
unsigned char命令[]={170,12,31,10,channel,//0x9f命令,0x0A要移动的通道数,channel是第一个通道号。
目标[1]&0x7f,目标[1]>>7&0x7f,//通道1位置,通道1速度
目标[2]&0x7F,目标[2]>>7&0x7F,/。。。
目标[3]&0x7F,目标[3]>>7&0x7F,
目标[4]&0x7F,目标[4]>>7&0x7F,
目标[5]&0x7F,目标[5]>>7&0x7F,
目标[6]&0x7F,目标[6]>>7&0x7F,
目标[7]&0x7F,目标[7]>>7&0x7F,
目标[8]&0x7F,目标[8]>>7&0x7F,
目标[9]&0x7F,目标[9]>>7&0x7F,
目标[10]&0x7F,目标[10]>>7&0x7F};//。。。
if(写入(fd,command,sizeof(command))=-1)
{
perror(“错误写入”);
返回-1;
}
返回0;
}
int main()
{
//打开Maestro的虚拟COM端口。
const char*device=“\\\\.\\USBSER000”//Windows,“\\\\\.\\COM6”也可以工作
//const char*device=“/dev/ttyACM0”;//Linux
//const char*device=“/dev/cu.usbmodem00034567”;//Mac OS X
int fd=打开(设备,O|RDWR | O|NOCTTY);
如果(fd==-1){
perror(装置);
返回1;
}
#ifndef\u WIN32
结构termios选项;
tcgetattr(fd和选项);
options.c|lflag&=~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
选项c(标签的U值)&=~(ONLCR | ocrl);
tcsetattr(fd、TCSANOW和选项);
#恩迪夫
int pot=0;
int位置=大师位置(fd、pot);
printf(“当前位置为%d%d.\n”,位置,pot);
int x[10];
x[1]=6000;
x[2]=6000;
x[3]=6000;
x[4]=6000;
x[5]=6000;
x[6]=6000;
x[7]=6000;
x[8]=6000;
x[9]=6000;
x[10]=6000;
maestroSetTarget(fd,7,x);
关闭(fd);
返回0;
}

您确定串行监视器没有在每次收到LF(0x0A)时添加CR(0x0D)吗?是的,我在matlab中运行了相同的代码,但在matlab中运行速度非常慢。所以我把它改成c。因此,当我在matlab上运行代码时,串行监视器上没有显示0d。但是当我在C中运行一个时,它就会显示出来。你确定你的串行监视器没有在每次收到LF(0x0A)时都添加CR(0x0D)吗?是的,我有同样的代码在matlab中运行,但在matlab中运行得非常慢。所以我把它改成c。因此,当我在matlab上运行代码时,串行监视器上没有显示0d。但当我运行C中的一个时,它就会出现。