问题描述
我知道这个问题是分散在互联网上,不过,没有什么是让我完全还没有。我想将数据写入到C ++(Linux版)的一个螺旋桨板上的串行端口。从控制台输入取程序时工作正常,但是当我写字符串它总是返回:错误 - 无效的命令
从设备。我尝试创建字符
的数组十六进制值,然后它的工作。这里有一个工作code,下文。但是我怎么能够只提供命令的字符串变量,并将其发送到串行端口?也许,你怎么把它转换成十六进制值,如果它是唯一的方法?谢谢大家。
I know this question is scattered all over the internet, but still, nothing is getting me completely there yet. I want to write data to a serial port in C++ (linux) for a a Propeller board. Program works fine when taking input from the console, but when I write strings to it always return: ERROR - Invalid command
from the device. I tried creating array of char
with Hex values then it worked. here's a working code, below. But how will i be able to just provide a string variable of command and send it to the serial port? perhaps, how do you I convert it to hex values if it's the only way? Thanks everyone
请注意:该循环使用从控制台的用户输入。我需要的是一个字符串变量发送到串行端口的方式。
note: the loop is to use user input from console. What i need is a way to send a string variable to the serial port.
#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);
}
推荐答案
我很高兴能解决我自己的解决方案,但还没有失望,没有更快看到的小事。 字符
默认情况下是签署
在C ++中,这使得它保持的范围从-128到127。然而,我们期待ASCII值而0到255因此,它作为宣称它是无符号字符海峡[]
和其他一切应该工作一样简单。我傻,我傻。
I'm happy to solve my own solution but yet disappointed to not have seen the trivial matter much sooner. char
by default are signed
in c++, which makes it holding the range -128 to 127. However, we are expecting the ASCII values which are 0 to 255. Hence it's as simple as declaring it to be unsigned char str[]
and everything else should work. Silly me, Silly me.
不过,谢谢大家对我的帮助!
Still, Thank you everyone for helping me!!!
这篇关于字符串写入到串行端口在C ++中的Linux的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!