主题 : 虚拟机LINUX下打开ttyUSB0,写入东西,再在板子上打开COM1接收,但是接收不到东西,有哪些原因? 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 76822
精华: 0
发帖: 11
金钱: 55 两
威望: 11 点
贡献值: 0 点
综合积分: 22 分
注册时间: 2012-08-30
最后登录: 2012-09-25
楼主  发表于: 2012-09-07 14:46

 虚拟机LINUX下打开ttyUSB0,写入东西,再在板子上打开COM1接收,但是接收不到东西,有哪些原因?

虚拟机LINUX下打开ttyUSB0,写入东西,再在板子上打开COM1接收,但是接收不到东西,有哪些原因?

writre.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <termios.h>
#include <fcntl.h>
#include <time.h>
#include <unistd.h>
#include <ctype.h>
#define HOST_COM_PORT 1
#define MAX_COM_NUM 3
#define BUFFER_SIZE 4096

/*打开串口函数*/
int open_port(int com_port)
{
    int fd,flag;
//  #if (COM_TYPE==GNR_COM)
//    char *dev[]={"/dev/ttyS0","/dev/ttyS1","/dev/ttyS2"};
//  #else
    char *dev[]={"/dev/ttyUSB0","/dev/ttyUSB1","/dev/ttyUSB2"};
//  #endif
    if((com_port<=0)||(com_port>MAX_COM_NUM))
      {
         return(-1);
      }
        /*打开串口*/
    fd=open(dev[com_port-1],O_RDWR|O_NOCTTY|O_NDELAY);
    if(fd<0)
      {
        perror("open serinal port");
        return(-1);
      }
    /*恢复串口为阻塞状态*/
    flag=fcntl(fd,F_GETFL,0);
    if(fcntl(fd,F_SETFL,flag&(~O_NONBLOCK))<0)
      {
        perror("fcntl F_SETFL");
      }
    /*测试是否为终端设备*/
    if(isatty(STDIN_FILENO)==0)
      {
        perror("standard input is not a terminal device");
      }
    return fd;
}

/*设置串口函数*/
int set_com_config(int fd,int baud_rate,int data_bits,char parity,int stop_bits)
{
    struct termios new_cfg,old_cfg;
    int speed;
    /*保存并测试现有串口参数设置*/
    if(tcgetattr(fd,&old_cfg)!=0)
    {
        perror("tcgetattr");
        return(-1);
    }
    /*设置字符大小*/
    new_cfg=old_cfg;
    cfmakeraw(&new_cfg);/*配置为原始模式*/
    new_cfg.c_lflag |=(ICANON|ECHO|IEXTEN);
        new_cfg.c_lflag &=~(ECHOPRT|ECHOCTL);
    new_cfg.c_cflag &= ~CSIZE;
    /*设置波特率*/
    switch (baud_rate)
    {
        case 2400:
        {
            speed = B2400;
            break;
        }
        case 4800:
        {
            speed = B4800;
            break;
        }
        case 9600:
                {
                        speed = B9600;
                        break;
                }
        case 19200:
                {
                        speed = B19200;
                        break;
                }
        case 38400:
                {
                        speed = B38400;
                        break;
                }
         case 115200:
                {
                        speed = B115200;
                        break;
                }
        default:
        break;
    }
    cfsetispeed(&new_cfg,speed);
        cfsetospeed(&new_cfg,speed);
    /*设置数据位*/
    switch(data_bits)
    {
        case 7:
        {
            new_cfg.c_cflag |= CS7;
            break;
        }
        case 8:
        {
            new_cfg.c_cflag |= CS8;
            break;
        }
    }
    /*设置奇偶校验位*/
    switch(parity)
    {
        case 'n':
        case 'N':
        {
            new_cfg.c_cflag &= ~PARENB;
            new_cfg.c_iflag &= ~INPCK;
            break;
        }
        case 'o':
                case 'O':
                {
                        new_cfg.c_cflag |= (PARODD|PARENB);
                        new_cfg.c_iflag |= INPCK;
                        break;
                }
        case 'e':
                case 'E':
                {
                        new_cfg.c_cflag |= PARENB;
                        new_cfg.c_cflag &= ~PARODD;
            new_cfg.c_cflag |= INPCK;
                        break;
                }
        case 's':
                case 'S':
                {
                        new_cfg.c_cflag &= ~PARENB;
                        new_cfg.c_cflag &= ~CSTOPB;
                        break;
                }
        default:
        break;

    }
    /*设置停止位*/
    switch(stop_bits)
    {
        case 1:
        {
            new_cfg.c_cflag &= ~CSTOPB;
            break;
        }
        case 2:
        {
            new_cfg.c_cflag |= CSTOPB;
            break;
        }
        default:
        break;
    }
    /*设置等待时间和最小接收字符数*/
    new_cfg.c_cc[VTIME]=0;
    new_cfg.c_cc[VMIN]=1;
    /*处理未接收字符*/
    tcflush(fd,TCIFLUSH);
    /*激活新配置*/
    if((tcsetattr(fd,TCSANOW,&new_cfg))!=0)
    {
        perror("tcsetattr");
        return(-1);
    }
    return 0;
}

int main()
{
    int fd,ret;
    char buff[BUFFER_SIZE];
    if((fd=open_port(HOST_COM_PORT))<0)
    {
        perror("open_port");
        return 1;
    }
    printf("fd=%d",fd);
    if(set_com_config(fd,115200,8,'N',1)<0)
    {
        perror("set_com_config");
        return 1;
    }
    do
    {
        printf("input some words(enter \"quit\" to exit):");
        memset(buff,0,BUFFER_SIZE);
        if(fgets(buff,BUFFER_SIZE,stdin)==NULL)
        {
            perror("fgets");
            break;
        }
        printf("buf=%slen=%d\n",buff,strlen(buff));
        if((ret=write(fd,buff,strlen(buff)))<0)
        {
            perror("write");
        }
        printf("ret=%d\n",ret);

    }
    while(strncmp(buff,"quit",4));
    close(fd);
    return 0;
}

read.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <termios.h>
#include <fcntl.h>
#include <time.h>
#include <unistd.h>
#include <ctype.h>
#define TARGET_COM_PORT 2
#define MAX_COM_NUM 3
#define BUFFER_SIZE 4096

/*打开串口函数*/
int open_port(int com_port)
{
    int fd;
  #if (COM_TYPE==GNR_COM)
    char *dev[]={"/dev/ttySAC0","/dev/ttySAC1","/dev/ttySAC2"};
  #else
    char *dev[]={"/dev/ttyUSB0","/dev/ttyUSB1","/dev/ttyUSB2"};
  #endif
    if((com_port<=0)||(com_port>MAX_COM_NUM))
      {
         return(-1);
      }
        /*打开串口*/
    fd=open(dev[com_port-1],O_RDWR|O_NOCTTY|O_NDELAY);
    if(fd<0)
      {
        perror("open serinal port");
        return(-1);
      }
    /*恢复串口为阻塞状态*/
    if(fcntl(fd,F_SETFL,0)<0)
      {
        perror("fcntl F_SETFL");
      }
    /*测试是否为终端设备*/
    if(isatty(STDIN_FILENO)==0)
      {
        perror("standard input is not a terminal device");
      }
    return fd;
}

/*设置串口函数*/
int set_com_config(int fd,int baud_rate,int data_bits,char parity,int stop_bits)
{
    struct termios new_cfg,old_cfg;
    int speed;
    /*保存并测试现有串口参数设置*/
    if(tcgetattr(fd,&old_cfg)!=0)
    {
        perror("tcgetattr");
        return(-1);
    }
    /*设置字符大小*/
    new_cfg=old_cfg;
    cfmakeraw(&new_cfg);/*配置为原始模式*/
//    new_cfg.c_lflag |=(ICANON|ECHO|IEXTEN);
//    new_cfg.c_lflag &=~(ECHOPRT|ECHOCTL);
//    new_cfg.c_iflag |=ICRNL;
//    new_cfg.c_oflag |=ONLRET;
    new_cfg.c_cflag &= ~CSIZE;
    /*设置波特率*/
    switch (baud_rate)
    {
        case 2400:
        {
            speed = B2400;
            break;
        }
        case 4800:
        {
            speed = B4800;
            break;
        }
        case 9600:
                {
                        speed = B9600;
                        break;
                }
        case 19200:
                {
                        speed = B19200;
                        break;
                }
        case 38400:
                {
                        speed = B38400;
                        break;
                }
         case 115200:
                {
                        speed = B115200;
                        break;
                }
        default:
        break;
    }
    cfsetispeed(&new_cfg,speed);
        cfsetospeed(&new_cfg,speed);
    /*设置数据位*/
    switch(data_bits)
    {
        case 7:
        {
            new_cfg.c_cflag |= CS7;
            break;
        }
        case 8:
        {
            new_cfg.c_cflag |= CS8;
            break;
        }
    }
    /*设置奇偶校验位*/
    switch(parity)
    {
        case 'n':
        case 'N':
        {
            new_cfg.c_cflag &= ~PARENB;
            new_cfg.c_iflag &= ~INPCK;
            break;
        }
        case 'o':
                case 'O':
                {
                        new_cfg.c_cflag |= (PARODD|PARENB);
                        new_cfg.c_iflag |= INPCK;
                        break;
                }
        case 'e':
                case 'E':
                {
                        new_cfg.c_cflag |= PARENB;
                        new_cfg.c_cflag &= ~PARODD;
            new_cfg.c_cflag |= INPCK;
                        break;
                }
        case 's':
                case 'S':
                {
                        new_cfg.c_cflag &= ~PARENB;
                        new_cfg.c_cflag &= ~CSTOPB;
                        break;
                }
        default:
        break;

    }
    /*设置停止位*/
    switch(stop_bits)
    {
        case 1:
        {
            new_cfg.c_cflag &= ~CSTOPB;
            break;
        }
        case 2:
        {
            new_cfg.c_cflag |= CSTOPB;
            break;
        }
        default:
        break;
    }
    /*设置等待时间和最小接收字符数*/
    new_cfg.c_cc[VTIME]=0;
    new_cfg.c_cc[VMIN]=1;
    /*处理未接收字符*/
    tcflush(fd,TCIFLUSH);
    /*激活新配置*/
    if((tcsetattr(fd,TCSANOW,&new_cfg))!=0)
    {
        perror("tcsetattr");
        return(-1);
    }
    return 0;
}

int main()
{
    int fd;
    FILE *fp,*fp1;
    char buff[BUFFER_SIZE];
    if((fd=open_port(TARGET_COM_PORT))<0)
    {
        perror("open_port");
        return 1;
    }
    if(set_com_config(fd,115200,8,'N',1)<0)
    {
        perror("set_com_config");
        return 1;
    }  
    do
    {
//        printf("the received words(enter \"quit\" to exit):");
        memset(buff,0,BUFFER_SIZE);
        if(read(fd,buff,BUFFER_SIZE)>0)
        {      
//            printf("the received words(enter \"quit\" to exit):");
//            lseek(fd,0,SEEK_SET);
            write(fd,buff,strlen(buff));
            fp=fopen("receivedwords","a+");
            fputs(buff,fp);
            fclose(fp);
        }

    }
    while(strncmp(buff,"quit",4));
    close(fd);
    fp1=fopen("quit","a+");
    fclose(fp);
    return 0;
}
[ 此帖被a25046088在2012-09-07 14:59重新编辑 ]