C++ 将字符串写入C+中的串行端口+;linux

C++ 将字符串写入C+中的串行端口+;linux,c++,c,linux,serial-port,C++,C,Linux,Serial Port,我知道这个问题分散在互联网上,但仍然没有什么能让我完全理解。我希望在一个螺旋桨板上用C++(Linux)编写数据到串口。当从控制台获取输入时,程序工作正常,但当我向其写入字符串时,程序总是返回:错误-设备发出的无效命令。我试着用十六进制值创建char数组,然后成功了。下面是一个工作代码。但是,我怎样才能只提供命令的字符串变量并将其发送到串行端口呢?也许,如果这是唯一的方法,我该如何将其转换为十六进制值?谢谢大家 注意:循环使用来自控制台的用户输入。我需要的是一种将字符串变量发送到串行端口的方法

我知道这个问题分散在互联网上,但仍然没有什么能让我完全理解。我希望在一个螺旋桨板上用C++(Linux)编写数据到串口。当从控制台获取输入时,程序工作正常,但当我向其写入字符串时,程序总是返回:
错误-设备发出的无效命令
。我试着用十六进制值创建
char
数组,然后成功了。下面是一个工作代码。但是,我怎样才能只提供命令的字符串变量并将其发送到串行端口呢?也许,如果这是唯一的方法,我该如何将其转换为十六进制值?谢谢大家

注意:循环使用来自控制台的用户输入。我需要的是一种将字符串变量发送到串行端口的方法

#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,字符**argv){
结构术语;
结构termios stdio;
int tty_fd;
fd_集rdset;
无符号字符c='D';
printf(“请以%s/dev/ttyS1开头(例如)\n”,argv[0]);
memset(&stdio,0,sizeof(stdio));
stdio.c_iflag=0;
标签的标准c_=0;
stdio.c_cflag=0;
stdio.c_lflag=0;
stdio.c_cc[VMIN]=1;
stdio.c_cc[VTIME]=0;
tcsetattr(标准文件号、标准命令和标准命令);
tcsetattr(STDOUT_文件号、TCSAFLUSH和stdio);
fcntl(STDIN_FILENO,F_SETFL,O_NONBLOCK);//使读取成为非阻塞
memset(&tio,0,sizeof(tio));
tio.c_iflag=0;
tio.c_of Lag=0;
tio.c|cflag=CS8 | CREAD | CLOCAL;//8n1,有关更多信息,请参阅termios.h
tio.c_lflag=0;
tio.c_cc[VMIN]=1;
tio.c_cc[VTIME]=5;
tty_fd=打开(argv[1],O_RDWR | O_非阻塞);
cfsetospeed(&tio,B115200);//115200波特
cfsetispeed(&tio,B115200);//115200波特
tcsetattr(tty_fd、TCSANOW和tio);
//char str[]={'V','E','R','\R'};
//上面的str[]不起作用,尽管它与下面的完全相同
char str[]={0x56,0x45,0x52,0x0D};
写(tty_fd,str,strlen(str));
如果(读取(tty_fd和c,1)>0)
写入(STDOUT_文件号,&c,1);
而(c!='q')
{
如果(读(tty_fd,&c,1)>0)写(STDOUT_FILENO,&c,1);//如果串行端口上有新数据可用,则将其打印出来
如果(读取(标准文件号,&c,1)>0)
如果(c!='q')
write(tty_fd,&c,1);//如果控制台上有新数据可用,则将其发送到串行端口
}
关闭(tty_fd);
}

您确定应该以“\r”结尾吗?从控制台输入文本时,返回键将产生“\n”字符(在Linux上),而不是“\r”

大多数函数上也缺少错误检查(
open()
fcntl()
,等等)。也许其中一个功能失败了。要了解如何检查错误,请阅读手册页(例如,
open()
命令的
man2 open
。如果是
open()
,手册页说明当无法打开文件/端口时返回-1

编辑后,您写道:

char str[] = {0x56, 0x45, 0x52, 0x0D}; 
write(tty_fd,str,strlen(str));

这是错误的。
strlen
需要一个以“\0”结尾的字符串,而str显然不是这样。它会发送您的数据和内存中的任何内容,直到它看到“\0”。您需要将
0x00
添加到
str
数组中。

我很高兴解决我自己的解决方案,但对没有看到太多琐碎的事情感到失望OAON.<代码> char < /C> >默认为“代码>符号< /COD> C++,这使得它保持范围128到127。但是,我们预期ASCII值是0到255。因此,它简单地声明为<代码>未签名的CHAR STR[]/Cord>并且所有其他的都应该工作。愚蠢的我,愚蠢的我。< /P>

仍然谢谢大家帮助我!!!< /P>是C还是C++?如果C++,为什么不使用<代码> STD::String < /Cord>?@ BaselestalyKyvyt:我已经尝试过:<代码> STD::String ST= =“VER”;写(Tyyfd,Str.DATA(),STRIX SIZE())我还是尝试过很多方法,但我尝试了很多方法,但是只有十六进制的工作。你知道吗?代码是C的,但是我的程序实际上是C++。是我吗?或者你没有告诉我们错误到底是怎么说的吗?串口只返回代码>错误-无效命令< /C>。所以我猜数据到达了设备,但不是有效格式。

char str[]
应该用空字节终止
\0
我同意,我没有做那些错误检查。但我认为这不是问题的原因,因为当前命令正常工作(这意味着连接正常)但是,如果你能告诉我应该在哪里进行检查,那就太好了——所有这些低级IO对我来说都是第一次。关于
\r
,我认为这不是问题所在,因为我甚至测试了下面的代码,它仍然返回相同的错误。
char str[]={V',0x45,0x52,0x0D};编写(tty_fd、str、strlen(str));
。此外,我在ASCII表上检查了
0x0D
正是
\r
,出于测试目的,我也尝试了
\n
,但效果不佳。好的,你现在需要停止查看代码。将你的串行端口连接到另一个框上的另一个端口,并使用终端应用程序读取这两个框中发送的内容ases(应该是相同的,但不是)。@rve,谢谢,但我解决了我的问题。关于你的解决方案,我甚至努力编码了确切的值(4)这是假设的工作,但它仍然没有。但谢谢,真的。无论如何,请查看我的更新问题,它有解决方案。我现在不能发布它作为解决方案,因为我没有足够的信誉点。