虚拟机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重新编辑 ]