4057|1

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

急急急!!!UART串口通信(可发送数据,不能接收数据) [复制链接]

我从网上找到一个串口通讯的程序,自己改了一些设置。可是能发送数据,接收不到数据
#include    
#include    
#include    
#include    
#include    
#include    
#include    
#include    
#include    
  
/*uart_open_function*/  
int open_port(int fd,int comport)  
{  
    char *dev[]={"/dev/ttyS0","/dev/ttyS1","/dev/ttyS2"};  
    long vdisable;  
      
    if(comport==1)//uart1   
        {  
                fd=open("/dev/ttyS0",O_RDWR|O_NOCTTY|O_NDELAY);  
                if(-1==fd){  
                        perror("Can't Open Serial Port1!");  
                        return(-1);  
                }  
        }  
    else if(comport==2)//uart2   
    {  
        fd=open("/dev/ttyS1",O_RDWR|O_NOCTTY|O_NDELAY);  
        if(-1==fd){  
            perror("Can't Open Serial Port2!");  
            return(-1);  
        }  
    }  
    else if(comport==3)//uart3   
        {  
                fd=open("/dev/ttyS2",O_RDWR|O_NOCTTY|O_NDELAY);  
                if(-1==fd){  
                        perror("Can't Open Serial Port3!");  
                        return(-1);  
                }  
        }  
    /*return uart status is block*/  
    if(fcntl(fd,F_SETFL,0)<0)  
        printf("fcntl failed!\n");  
    else  
        printf("fcntl=%d\n",fcntl(fd,F_SETFL,0));  
    /*test terminal device*/  
    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;  
  
}  
  
/*uart_set_function*/  
int set_opt(int fd,int nSpeed,int nBits,int nFctl,char nEvent,int nStop)
{  
    struct termios newtio,oldtio;  
    /*save local informion of uart,if uart port error,then about it informion be appeard*/  
    if(tcgetattr(fd,&oldtio)!=0){  
        perror("SetupSerial 1");  
        return -1;  
    }  
    bzero(&newtio,sizeof(newtio));  
    /*step 1,set fontsize*/  
    newtio.c_cflag |=CLOCAL | CREAD;  
    newtio.c_cflag &=~CSIZE;  
    /*set bit_stop*/  
    switch(nBits)  
    {  
    case 7:  
        newtio.c_cflag |=CS7;  
        break;  
    case 8:  
        newtio.c_cflag |=CS8;  
        break;  
    }  
   
    /*set flow control */
    switch(nFctl)
    {
     case 0:
      newtio.c_cflag &= ~CRTSCTS;     //no flow control
     break;
     case 1:
      newtio.c_cflag |= CRTSCTS;   //hardware flow control
     break;
     case 2:
      newtio.c_cflag |= IXON|IXOFF|IXANY;//software flow control
     break;
    }
      
    /*set jo_check_bit*/  
    switch(nEvent)  
    {  
    case 'O'://j   
        newtio.c_cflag |=PARENB;  
        newtio.c_cflag |=PARODD;  
        newtio.c_iflag |=(INPCK | ISTRIP);  
        break;  
    case 'E'://O   
        newtio.c_iflag |=(INPCK | ISTRIP);  
        newtio.c_cflag |=PARENB;  
        newtio.c_cflag &=~PARODD;  
        break;  
    case 'N'://no   
        newtio.c_cflag &=~PARENB;  
        break;  
    }  
    /*set bps*/  
    switch(nSpeed)  
    {  
        case 2400:  
            cfsetispeed(&newtio,B2400);  
            cfsetospeed(&newtio,B2400);  
            break;  
        case 4800:  
            cfsetispeed(&newtio,B4800);  
            cfsetospeed(&newtio,B4800);  
            break;  
        case 9600:  
            cfsetispeed(&newtio,B9600);  
            cfsetospeed(&newtio,B9600);  
            break;  
        case 115200:  
            cfsetispeed(&newtio,B115200);  
            cfsetospeed(&newtio,B115200);  
            break;  
        case 460800:  
            cfsetispeed(&newtio,B460800);  
            cfsetospeed(&newtio,B460800);  
            break;  
        default:  
            cfsetispeed(&newtio,B115200);  
            cfsetospeed(&newtio,B115200);  
            break;  
    }  
    /*set stop bit*/  
        if(nStop==1)  
            newtio.c_cflag &=~CSTOPB;  
        else if(nStop==2)  
            newtio.c_cflag |=CSTOPB;  
    /*set waittime and mincharsize*/  
        newtio.c_cc[VTIME]=0;  
        newtio.c_cc[VMIN]=0;  
    /*process char unrece*/  
        tcflush(fd,TCIFLUSH);  
    /*action newsetinfo*/  
        if((tcsetattr(fd,TCSANOW,&newtio))!=0)  
        {  
            perror("com set error");  
            return -1;  
        }  
        printf("set done!\n");  
        return 0;  
}  
  
int main(void)  
{  
    int fd;  
    int nwrite,nread,i,j;  
    char buff[4]={'R','S','T',0x0D};  
    char buffer[8];
      
    if((fd=open_port(fd,3))<0){  
        perror("open_port error");  
        return;  
    }  
      
    if((i=set_opt(fd,115200,8,0,'N',1))<0){  
        perror("set_opt error");  
        return;  
    }  
    printf("fd=%d\n",fd);  
  
    nwrite=write(fd,buff,4);  
    printf("nwrite= %d.\n",nwrite);  
    printf("buff= %s.\n",buff);
   
   
     nread=read(fd,buffer,8);  
     printf("buffer= %c.\n",*buffer);  //gewüscht Antwort:OK!
     if (nread>0)  
     {  
        for(i=0;i                 {
            printf("nread= %d,%s", nread, buffer);
        }
     }
     else
        printf ("error_nread= %d \n",nread);
   
    close(fd);  
    return;  
}
我发送的是“RST回车”,给我的与这个UART相接的硬件,硬件在接到这个指令后会返回一个“OK!”,可是在接收buffer中显示是乱码,nread=0

谢谢各位高手指导!!

最新回复

用示波器量一下TX和RX信号,看看发的数据和接收的数据有没有,正确不正确.write/read函数体呢?  详情 回复 发表于 2009-8-4 23:24
点赞 关注

回复
举报

1

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
用示波器量一下TX和RX信号,看看发的数据和接收的数据有没有,正确不正确.write/read函数体呢?
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表