hello_science 2015-11-23 08:45 采纳率: 0%
浏览 1715

mini2440与pc串口通信问题

下面的代码用来接收pc发送的数据并且打印,大神能看看问题在哪里吗?用的USB转串口线连接的:
代码:
/******************
Name:uart.c
Author:xiaohu
Date:2015/3/7
Descript:communicate by uart
********************/
#include
#include
#include
#include
#include
#include
#include
#include
#include

//设置串口的速率、数据位、奇偶校验位、停止位
int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)
{
struct termios newtio,oldtio;
if ( tcgetattr( fd,&oldtio) != 0)
{
perror("SetupSerial 1");
return -1;
}
bzero( &newtio, sizeof( newtio ) );
newtio.c_cflag |= CLOCAL | CREAD;
newtio.c_cflag &= ~CSIZE;

switch( nBits )
{
case 8:
    newtio.c_cflag |= CS8;
    break;
}

switch( nEvent )
{
case 'O':                     //奇校验
    newtio.c_cflag |= PARENB;
    newtio.c_cflag |= PARODD;
    newtio.c_iflag |= (INPCK | ISTRIP);
    break;
case 'E':                     //偶校验
    newtio.c_iflag |= (INPCK | ISTRIP);
    newtio.c_cflag |= PARENB;
    newtio.c_cflag &= ~PARODD;
    break;
case 'N':                    //无校验
    newtio.c_cflag &= ~PARENB;
    break;
}

switch( nSpeed )
{

case 9600:
    cfsetispeed(&newtio, B9600);
    cfsetospeed(&newtio, B9600);
    break;
case 115200:
    cfsetispeed(&newtio, B115200);
    cfsetospeed(&newtio, B115200);
    break;
default:
    cfsetispeed(&newtio, B9600);
    cfsetospeed(&newtio, B9600);
    break;
}
if( nStop == 1 )
{
    newtio.c_cflag &=  ~CSTOPB;
}
else if ( nStop == 2 )
{
    newtio.c_cflag |=  CSTOPB;
}
newtio.c_cc[VTIME]  = 0;
newtio.c_cc[VMIN] = 0;
tcflush(fd,TCIFLUSH);
if((tcsetattr(fd,TCSANOW,&newtio))!=0)
{
    perror("com set error");
    return -1;
}
printf("set done!\n");
return 0;

}
//根据串口文件描述符打开相应的串口端口
int open_port(int fd,int comport)
{
char *dev[]={"/dev/ttySAC0","/dev/ttySAC1","/dev/ttySAC2"};
long vdisable;
if (comport==1)
{ fd = open( "/dev/ttySAC0", O_RDWR|O_NOCTTY|O_NDELAY);
if (-1 == fd)
{
perror("Can't Open Serial Port0");
return(-1);
}
else
{
printf("open ttySAC0 .....\n");
}
}
else if(comport==2)
{ fd = open( "/dev/ttySAC1", O_RDWR|O_NOCTTY|O_NDELAY);
if (-1 == fd)
{
perror("Can't Open Serial Port1");
return(-1);
}
else
{
printf("open ttySAC1 .....\n");
}

}
else if (comport==3)
{
fd = open( "/dev/ttySAC2", O_RDWR|O_NOCTTY|O_NDELAY);
if (-1 == fd)
{
perror("Can't Open Serial Port2");
return(-1);
}
else
{
printf("open ttySAC2 .....\n");
}
}

if(fcntl(fd, F_SETFL, 0)<0)
{
    printf("fcntl failed!\n");
}
else
{
    printf("fcntl=%d\n",fcntl(fd, F_SETFL,0));
}
if(isatty(STDIN_FILENO)==0)
{
    printf("standard input is not a terminal device\n");
}
else
{
    printf("isatty success!\n");
}
printf("fd-open=%d\n",fd);
return fd;

}
//写数据到相应串口
int write_to_com(int fd, const void *buf, int count)
{
int ret = -1;
ret = write(fd,buf,count);
if(ret == -1)
{
perror("write to com error");
}
return ret;
}
//从相关串口读取数据
int read_from_com(int fd, void *buf, int count)
{
int ret = -1;
ret = read(fd,buf,count);
if(ret == -1)
{
perror("read from com error");
}
return ret;
}

int main(void)
{
int com_fd,j=0;
int i;
char buff_read[64];
if((com_fd=open_port(com_fd,2))<0) //change where necessary!
{
perror("open_port error");
return;
}
if((i=set_opt(com_fd,4800,8,'N',2))<0)
{
perror("set_opt error");
return;
}
printf("fd=%d\n",com_fd);
while(1)
{
memset(buff_read,0,sizeof(buff_read));
i=read_from_com(com_fd,buff_read,64);
sleep(1);
printf("%s",buff_read);
// printf("i:%d\n",i);
}
return 0;
}
![![图片说明](https://img-ask.csdn.net/upload/201511/23/1448268221_450379.jpg)图片说明](https://img-ask.csdn.net/upload/201511/23/1448268311_3930.jpg)图片说明

  • 写回答

1条回答 默认 最新

  • qq_33073685 2015-11-23 15:58
    关注

    wdawdawdwdadsadsadsadaw我阿达撒倒萨打算的

    评论

报告相同问题?

悬赏问题

  • ¥15 fluent的在模拟压强时使用希望得到一些建议
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样
  • ¥15 java的GUI的运用
  • ¥15 Web.config连不上数据库
  • ¥15 我想付费需要AKM公司DSP开发资料及相关开发。
  • ¥15 怎么配置广告联盟瀑布流
  • ¥15 Rstudio 保存代码闪退