在Linux上使用SOCAT与USB进行串行通信

时间:2013-12-18 20:38:01

标签: c++ linux arduino termios socat

我想对socat对串行通信的作用做一点澄清,因为出于某种原因,我只能在使用socat时与Arduino进行通信。

这是我用来设置socat的命令:

socat -d -v -x PTY,link=/tmp/serial,wait-slave,raw /dev/ttyACM0,raw

我在C ++中使用的代码是:

int file;

file = open("/tmp/serial", O_RDWR | O_NOCTTY | O_NDELAY);
if (file == -1)
  {

    perror("open_port: Unable to open \n");
  }
  else
    fcntl(file, F_SETFL, 0);

struct termios options;


 //* Get the current options for the port...


tcgetattr(file, &options);

cfsetispeed(&options, B9600);
cfsetospeed(&options, B9600);

options.c_oflag = 0;
//options.c_oflag &= ~(OCRNL | ONLCR | ONLRET | ONOCR | OFILL | OLCUC | OPOST);


options.c_cflag |= (CLOCAL | CREAD);

cfmakeraw(&options);

tcsetattr(file, TCSANOW, &options);

sprintf(sendpack,"$C000C000C000C000\r");
num = write(file,sendpack,18);  
tcflush(file, TCIOFLUSH); // clear buffer

因此,当我通过socat运行时,arduino会按照预期的方式做出反应,但是如果我将open()行从/ tmp / serial更改为/ dev / ttyACM0,则arduino根本不再执行。有人能告诉我socat正在做什么来使数据生效,以及我如何改变我的C代码来做同样的事情?我不能在最终实现中使用socat,因为它会导致延迟,导致我的机器人无法预测。

0 个答案:

没有答案