当前位置: 技术问答>linux和unix
linux下串口无法输入的问题
来源: 互联网 发布时间:2016-05-20
本文导语: 小弟想在linux下自己写一个串口程序,通过它与嵌入式设备进行交互; 目前,读数据基本是正常的,因为在启动时,若打开串口程序,则会输出启动信息,和在windows下输出一样; 主要问题在于输入,例如我在设备启...
小弟想在linux下自己写一个串口程序,通过它与嵌入式设备进行交互;
目前,读数据基本是正常的,因为在启动时,若打开串口程序,则会输出启动信息,和在windows下输出一样;
主要问题在于输入,例如我在设备启动后,我想让设备重启,在windows下在串口中输入reboot就可以实现重启,我在我的程序中,想通过write(fd, "rebootrn", 8);实现设备重启,但是设备没有反应;
在console下,有时候会回显几个字符,类似reboot,而且有提示符#出现,证明命令是输进去了,可能经过串口处理后边成了r9、lt一类的乱码
可能是输出设置哪里有问题,我现在设的是波特率38400,8位数据位,1位停止位,没有校验,没有流控制,这也是windows下的设置
newtio.c_lflag |= (ECHO|ICANON|ECHOE);是否设回显一类的尝试了都没用。
我现在想得到最简单的功能就是,在主程序中write(fd, "rebootrn", 8);时能够重启,加入read只是为了看输入是否正确;
请教要怎样才能实现从串口输入命令控制嵌入式设备?
#include
#include
#include
#include
#include
#include
#include
#include
#include
int read_port(int fd);
int init_port(int fd);
int main(int argc, char *argv[])
{
int fd;
int nread;
char buff[512];
unsigned char wbuf[512]="rebootrn";
//unsigned char wbuf[512]="abcdefghijklmnopqrstuvwxyzrn";
int ret;
char *dev = "/dev/ttyS0";
fd = open("/dev/ttyS0", O_RDWR|O_NONBLOCK);
if( fd == -1)
perror("can't open serial 0n");
printf("open OKn");
init_port(fd);
printf("finished init the serial portn");
ret = write(fd, wbuf, strlen(wbuf));
read_port(fd);
close(fd);
return 0;
}
int init_port(int fd)
{
struct termios newtio;
tcgetattr(fd, &newtio);
bzero(&newtio, sizeof(newtio));
newtio.c_cflag &= ~CSIZE;
newtio.c_cflag |= CS8; //8bits data
newtio.c_cflag &= ~PARENB; //no parity
newtio.c_cflag &= ~INPCK; //no parity
newtio.c_cflag &= ~CSTOPB; //1 bit stop
newtio.c_cflag &= ~CRTSCTS; //no flow control
newtio.c_cflag |= (CLOCAL|CREAD);//open read
newtio.c_cc[VTIME] = 250; //set out time;
newtio.c_cc[VMIN] = 0; //update the options and do it NOW
newtio.c_oflag &= ~OPOST;
newtio.c_iflag &= ~(IXON|IXOFF|IXANY);//when | is software flow control
//newtio.c_iflag &= ~(ICANON|ECHO|ECHOE);
newtio.c_lflag |= (ECHO|ICANON|ECHOE);
cfsetispeed(&newtio, B38400);
cfsetospeed(&newtio, B38400);
tcflush(fd, TCIFLUSH);
if(tcsetattr(fd, TCSANOW, &newtio) != 0 )
{
perror("Setup serial 3");
return -1;
}
}
int read_port(int fd)
{
int n, max_fd, len, count=0;
fd_set input;
struct timeval timeout;
char buf[8196];
char *outbuf;
char *ptr = buf;
FD_ZERO(&input);
FD_SET(fd, &input);
max_fd = fd + 1;
while(1)
{
timeout.tv_sec = 5;
timeout.tv_usec = 0;
if( write(fd, "hello worldrn", 13)
目前,读数据基本是正常的,因为在启动时,若打开串口程序,则会输出启动信息,和在windows下输出一样;
主要问题在于输入,例如我在设备启动后,我想让设备重启,在windows下在串口中输入reboot就可以实现重启,我在我的程序中,想通过write(fd, "rebootrn", 8);实现设备重启,但是设备没有反应;
在console下,有时候会回显几个字符,类似reboot,而且有提示符#出现,证明命令是输进去了,可能经过串口处理后边成了r9、lt一类的乱码
可能是输出设置哪里有问题,我现在设的是波特率38400,8位数据位,1位停止位,没有校验,没有流控制,这也是windows下的设置
newtio.c_lflag |= (ECHO|ICANON|ECHOE);是否设回显一类的尝试了都没用。
我现在想得到最简单的功能就是,在主程序中write(fd, "rebootrn", 8);时能够重启,加入read只是为了看输入是否正确;
请教要怎样才能实现从串口输入命令控制嵌入式设备?
#include
#include
#include
#include
#include
#include
#include
#include
#include
int read_port(int fd);
int init_port(int fd);
int main(int argc, char *argv[])
{
int fd;
int nread;
char buff[512];
unsigned char wbuf[512]="rebootrn";
//unsigned char wbuf[512]="abcdefghijklmnopqrstuvwxyzrn";
int ret;
char *dev = "/dev/ttyS0";
fd = open("/dev/ttyS0", O_RDWR|O_NONBLOCK);
if( fd == -1)
perror("can't open serial 0n");
printf("open OKn");
init_port(fd);
printf("finished init the serial portn");
ret = write(fd, wbuf, strlen(wbuf));
read_port(fd);
close(fd);
return 0;
}
int init_port(int fd)
{
struct termios newtio;
tcgetattr(fd, &newtio);
bzero(&newtio, sizeof(newtio));
newtio.c_cflag &= ~CSIZE;
newtio.c_cflag |= CS8; //8bits data
newtio.c_cflag &= ~PARENB; //no parity
newtio.c_cflag &= ~INPCK; //no parity
newtio.c_cflag &= ~CSTOPB; //1 bit stop
newtio.c_cflag &= ~CRTSCTS; //no flow control
newtio.c_cflag |= (CLOCAL|CREAD);//open read
newtio.c_cc[VTIME] = 250; //set out time;
newtio.c_cc[VMIN] = 0; //update the options and do it NOW
newtio.c_oflag &= ~OPOST;
newtio.c_iflag &= ~(IXON|IXOFF|IXANY);//when | is software flow control
//newtio.c_iflag &= ~(ICANON|ECHO|ECHOE);
newtio.c_lflag |= (ECHO|ICANON|ECHOE);
cfsetispeed(&newtio, B38400);
cfsetospeed(&newtio, B38400);
tcflush(fd, TCIFLUSH);
if(tcsetattr(fd, TCSANOW, &newtio) != 0 )
{
perror("Setup serial 3");
return -1;
}
}
int read_port(int fd)
{
int n, max_fd, len, count=0;
fd_set input;
struct timeval timeout;
char buf[8196];
char *outbuf;
char *ptr = buf;
FD_ZERO(&input);
FD_SET(fd, &input);
max_fd = fd + 1;
while(1)
{
timeout.tv_sec = 5;
timeout.tv_usec = 0;
if( write(fd, "hello worldrn", 13)