打印
[嵌入式Linux]

ARM-linux应用程序调用串口的问题,求指点

[复制链接]
520|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mrchenzy|  楼主 | 2016-6-24 20:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在学linux的串口驱动。开发板用的是TQ210,虚拟机用的是REDHAT。我想在应用程序中试一下串口通信,让开发板发送一些字符,在Windows中打开串口助手,看能否接受到开发板发送的字符。应用程序在虚拟机中编译好后,通过NFS文件系统拷贝到开发板上,然后在开发板运行这个程序,开发板上运行的内核版本是2.6.35,国嵌提供的内核。程序代码是书上来的,如下(头文件就不贴了):
#define STTY_DEV "/dev/s3c2410_serial1" //串口设备文件

#define BUFF_SIZE 9   //发送字符数量

int main()
{
        int stty_fd , n;
        char buffer[BUFF_SIZE] = {'a','b','a','b','a','b','a','b','a'};
        struct termios opt;
        
        /** open UART**/        
        stty_fd = open(STTY_DEV, O_RDWR);
        printf("%d\n", stty_fd);
        
        
        if( stty_fd == -1)
        {
                perror("open device");
                return 0;
        }
        printf("open device success, waiting user input....\n");
        
        /**取得当前串口配置**/
        tcgetattr(stty_fd, &opt );
        tcflush(stty_fd, TCIOFLUSH);
        
        printf("3\n");
        
        /***设置波特率为9600**/
        cfsetispeed(&opt, B9600);
        cfsetospeed(&opt, B9600);        
        
        /*****设置数据位为8位***/
        opt.c_cflag &=~CSIZE;
        opt.c_cflag |= CS8;
        
        /*****无奇偶校验位***/
        opt.c_cflag &=~PARENB;
        opt.c_iflag &=~INPCK;
        
        /****1位停止位***/
        opt.c_cflag &=~CSTOPB;
        
        /***超时时间15秒***/
        opt.c_cc[VTIME] = 150;
        opt.c_cc[VMIN] = 0;
        
        /***将配置写入设备***/
        if(0!=tcsetattr(stty_fd, TCSANOW, &opt))
        {
                perror("set daudrate\n");
                return 0;        
        }        
        tcflush(stty_fd, TCIOFLUSH);
               
        while(1)
        {
                printf("7\n");  //只是看看程序有没有执行到这里
               
                n = write( stty_fd, buffer, BUFF_SIZE); //开始发送字符

                if(n<=0)
                {
                        perror("read data\n");
                        break;        
                }
                if(n>8)
                {
                        printf("n is %d\n", n);        //输出write函数返回值
                        break;
                }
               
                printf("8\n");

        printf("program will exit!\n");        //数据发送结束

        close(stty_fd);        //关闭串口
        
        return 0;
}


程序编译没问题,在开发板上也能正常执行,但是Windows上的串口助手就是接收不到数据啊。执行情况如图:
C:\Users\czy\Desktop\CSDN

可以看到程序执行后,write返回值是9,说明9个字符都成功的写进了/dev/s3c2410_serial1文件。可是,串口调试助手没反应啊。

开发板的/dev目录下有s3c2410_serial0、s3c2410_serial1、s3c2410_serial2、s3c2410_serial4四个串口设备,s3c2410_serial0应该是用在了串口终端,所有我程序中用s3c2410_serial1,另外两个我也试了,一样不行。

当我用echo 124 > /dev/s3c2410_serial1测试串口1时,串口终端没有打印123,但是测试串口0时,能成功打印123

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝