在 C++ linux 中将字符串写入串口 [英] Writing STRINGS to serial port in C++ linux
问题描述
我知道这个问题散布在整个互联网上,但仍然没有什么能让我完全做到这一点.我想将数据写入 C++ (linux) 中的串行端口,用于 Propeller 板.从控制台获取输入时程序工作正常,但是当我向它写入字符串时,总是返回: ERROR - Invalid command
从设备.我尝试使用十六进制值创建 char
数组,然后它起作用了.这是一个工作代码,如下.但是我如何能够只提供命令的字符串变量并将其发送到串行端口?也许,如果这是唯一的方法,我如何将其转换为十六进制值?谢谢大家
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)
",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','
'};
//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);
}
推荐答案
我很高兴自己解决了问题,但对没有早点看到这个小事感到失望.默认情况下,char
在 c++ 中是 signed
,这使得它的范围为 -128 到 127.但是,我们期望 ASCII 值是 0 到 255.因此它是简单的声明它是 unsigned char str[]
其他一切都应该工作.傻我,傻我.
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 中将字符串写入串口的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!