打开,写入和读取ttyUSB0

时间:2015-01-08 07:42:55

标签: c++ c

我正在做一个打开,写入和读取端口ttyUSB0的程序,我有下一个程序而且我什么都不写。任何人都可以帮我吗????

我的问题是我的写入或读取功能有问题,因为我无法读取和写入ttyUSB0端口,而是搜索解决方案以写入和读取ttyUSB0端口。

#include <sys/time.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <termios.h>

#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>

using namespace std;

int serial_open(char *serial_name, speed_t baud)
{
      struct termios newtermios;
      int fd;
      fd = open(serial_name,O_RDWR | O_NOCTTY);
      newtermios.c_cflag= CBAUD | CS8 | CLOCAL | CREAD;
      newtermios.c_iflag=IGNPAR;
      newtermios.c_oflag=0;
      newtermios.c_lflag=0;
      newtermios.c_cc[VMIN]=1;
      newtermios.c_cc[VTIME]=0;
      cfsetospeed(&newtermios,baud);
      cfsetispeed(&newtermios,baud);
      if (tcflush(fd,TCIFLUSH)==-1) return -1;
      if (tcflush(fd,TCOFLUSH)==-1) return -1;
      if (tcsetattr(fd,TCSANOW,&newtermios)==-1) return -1;
      return fd;
}    
void serial_send(int serial_fd, char *data, int size)
{
  write(serial_fd, data, size);
}

int serial_read(int serial_fd, char *data, int size, int timeout_usec)
{
      fd_set fds;
      struct timeval timeout;
      int count=0;
      int ret;
      int n;
      do {
        FD_ZERO(&fds);
        FD_SET (serial_fd, &fds);
        timeout.tv_sec = 0;
        timeout.tv_usec = timeout_usec;
        ret=select (FD_SETSIZE,&fds, NULL, NULL,&timeout);
        if (ret==1) {
          n=read (serial_fd, &data[count], size-count);
          count+=n;
          data[count]=0;
   }
 } while (count<size && ret==1);
 return count;
}

void serial_close(int fd)
{
   close(fd);
}

int main(int argc, char *argv[])
{
   int serial_fd, n, longitud,;
   char *device=”at”;
   char *data;
   longitud=strlen(device);

   serial_fd = serial_open("/dev/ttyUSB0",B38400);
    if (serial_fd == -1) {
            printf ("Error opening the serial device: %s\n",argv[1]);
            perror("OPEN");
            exit(0);
    }
    printf("SERIAL OPEN:%s\n", device);
    serial_send(serial_fd, device, longitud);
    printf ("String sent------> %s\n",device);
    n=serial_read(serial_fd,data,longitud,10000);
    printf("Se ha recibido %s \n Tamaño: %d\n n:%d \n serial_fd:%d\n",data, longitud,n,serial_fd);
puts(data);
    serial_close(serial_fd);
//    cout << "Hello world!" << endl;
    return 0;
}

1 个答案:

答案 0 :(得分:0)

您的程序在写作和阅读方面效果很好,但您还有另一个问题:Undefined behavior

您的main函数中有一个名为data的指针变量,并将其传递给serial_read函数。但是你没有在任何地方使这个指针实际指向任何地方,所以当该指针被取消引用时你有未定义的行为。

本地(非静态)变量未初始化,其值不确定。您需要初始化变量,使其实际指向某处。我建议你把它变成一个数组。

然后当你调用serial_read时,你只需要读取两个字节(字符串"at"的长度),而不是实际的数据大小(当前为无),你需要改为传递缓冲区的实际大小。

总结一下:

int main(void)
{
    ...
    char data[256];
    ...
    n = serial_read(serial_fd, data, sizeof(data), 10000);
    ...
}