在C ++ linux中将STRING写入串口

我知道这个问题遍布在互联网上,但是,还没有什么东西让我完全在那里。 我想在C ++(linux)中将数据写入到一个串行端口,以用于Propeller板。 当从控制台进行input时,程序工作正常,但是当我向其写入string时总是返回: ERROR - Invalid command来自设备的ERROR - Invalid command 。 我试图创build与hex值的char数组,然后它的工作。 下面是一个工作代码。 但是,我将如何才能够提供一个stringvariables的命令,并将其发送到串行端口? 也许,如果它是唯一的方法,我如何将它转换为hex值? 感谢大家

注意:循环是使用控制台的用户input。 我需要的是一种将串variables发送到串口的方法。

 #include <string.h> #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <termios.h> int main(int argc,char** argv){ struct termios tio; struct termios stdio; int tty_fd; fd_set rdset; unsigned char c='D'; printf("Please start with %s /dev/ttyS1 (for example)\n",argv[0]); memset(&stdio,0,sizeof(stdio)); stdio.c_iflag=0; stdio.c_oflag=0; stdio.c_cflag=0; stdio.c_lflag=0; stdio.c_cc[VMIN]=1; stdio.c_cc[VTIME]=0; tcsetattr(STDOUT_FILENO,TCSANOW,&stdio); tcsetattr(STDOUT_FILENO,TCSAFLUSH,&stdio); fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK); // make the reads non-blocking memset(&tio,0,sizeof(tio)); tio.c_iflag=0; tio.c_oflag=0; tio.c_cflag=CS8|CREAD|CLOCAL; // 8n1, see termios.h for more information tio.c_lflag=0; tio.c_cc[VMIN]=1; tio.c_cc[VTIME]=5; tty_fd=open(argv[1], O_RDWR | O_NONBLOCK); cfsetospeed(&tio,B115200); // 115200 baud cfsetispeed(&tio,B115200); // 115200 baud tcsetattr(tty_fd,TCSANOW,&tio); //char str[] = {'V','E','R','\r'}; //the above str[] doesn't work although it's exactly the same as the following char str[] = {0x56, 0x45, 0x52, 0x0D}; write(tty_fd,str,strlen(str)); if (read(tty_fd,&c,1)>0) write(STDOUT_FILENO,&c,1); while (c!='q') { if (read(tty_fd,&c,1)>0) write(STDOUT_FILENO,&c,1); // if new data is available on the serial port, print it out if (read(STDIN_FILENO,&c,1)>0) if(c!='q') write(tty_fd,&c,1); // if new data is available on the console, send it to the serial port } close(tty_fd); } 

Solutions Collecting From Web of "在C ++ linux中将STRING写入串口"

我很高兴能够解决自己的解决方案,但是却没有看到这个小事情。 默认情况下, char是用c ++来标记的,它使得它的范围在-128到127之间。但是,我们期望ASCII值是0到255.因此,就像声明它是unsigned char str[]一样简单应该管用。 傻我,傻我。

不过,谢谢大家帮助我!

你确定你应该以'\ r'结尾吗? 当从控制台输入文本时,返回键会导致'\ n'字符(在Linux上)而不是'\ r'

在大多数函数( open()fcntl()等)上也缺少错误检查。 也许这些功能之一失败。 要找出如何检查错误,请阅读手册页(例如man 2 open open()命令。如果是open() ,手册页解释它在无法打开文件/端口时返回-1。

编辑之后,你写道:

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

这是错误的。 strlen需要一个以'\ 0'结尾的字符串,这个字符串显然不是这样,现在它发送你的数据和内存中的任何东西,直到它看到一个'\ 0'。 你需要添加0x00到你的str数组中。