免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3347 | 回复: 5
打印 上一主题 下一主题

[驱动] ARM-linux应用程序调用串口的问题,求指点。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-06-24 19:45 |只看该作者 |倒序浏览
最近在学linux的串口驱动。开发板用的是TQ210,虚拟机用的是REDHAT。我想在应用程序中试一下串口通信,让开发板发送一些字符,在Windows中打开串口助手,看能否接受到开发板发送的字符。应用程序在虚拟机中编译好后,通过NFS文件系统拷贝到开发板上,然后在开发板运行这个程序,开发板上运行的内核版本是2.6.35,国嵌提供的内核。程序代码是书上来的,如下(头文件就不贴了):

  1. #define STTY_DEV "/dev/s3c2410_serial1" //串口设备文件

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

  3. int main()
  4. {
  5.         int stty_fd , n;
  6.         char buffer[BUFF_SIZE] = {'a','b','a','b','a','b','a','b','a'};
  7.         struct termios opt;
  8.        
  9.         /** open UART**/       
  10.         stty_fd = open(STTY_DEV, O_RDWR);
  11.         printf("%d\n", stty_fd);
  12.        
  13.        
  14.         if( stty_fd == -1)
  15.         {
  16.                 perror("open device");
  17.                 return 0;
  18.         }
  19.         printf("open device success, waiting user input....\n");
  20.        
  21.         /**取得当前串口配置**/
  22.         tcgetattr(stty_fd, &opt );
  23.         tcflush(stty_fd, TCIOFLUSH);
  24.        
  25.         printf("3\n");
  26.        
  27.         /***设置波特率为9600**/
  28.         cfsetispeed(&opt, B9600);
  29.         cfsetospeed(&opt, B9600);       
  30.        
  31.         /*****设置数据位为8位***/
  32.         opt.c_cflag &=~CSIZE;
  33.         opt.c_cflag |= CS8;
  34.        
  35.         /*****无奇偶校验位***/
  36.         opt.c_cflag &=~PARENB;
  37.         opt.c_iflag &=~INPCK;
  38.        
  39.         /****1位停止位***/
  40.         opt.c_cflag &=~CSTOPB;
  41.        
  42.         /***超时时间15秒***/
  43.         opt.c_cc[VTIME] = 150;
  44.         opt.c_cc[VMIN] = 0;
  45.        
  46.         /***将配置写入设备***/
  47.         if(0!=tcsetattr(stty_fd, TCSANOW, &opt))
  48.         {
  49.                 perror("set daudrate\n");
  50.                 return 0;       
  51.         }       
  52.         tcflush(stty_fd, TCIOFLUSH);
  53.                
  54.         while(1)
  55.         {
  56.                 printf("7\n");  //只是看看程序有没有执行到这里
  57.                
  58.                 n = write( stty_fd, buffer, BUFF_SIZE); //开始发送字符

  59.                 if(n<=0)
  60.                 {
  61.                         perror("read data\n");
  62.                         break;       
  63.                 }
  64.                 if(n>8)
  65.                 {
  66.                         printf("n is %d\n", n);        //输出write函数返回值
  67.                         break;
  68.                 }
  69.                
  70.                 printf("8\n");

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

  72.         close(stty_fd);        //关闭串口
  73.        
  74.         return 0;
  75. }
复制代码
程序编译没问题,在开发板上也能正常执行,但是Windows上的串口助手就是接收不到数据啊。执行情况如图:


可以看到程序执行后,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

论坛徽章:
0
2 [报告]
发表于 2016-06-24 19:46 |只看该作者
以上就是我的情侣,到底哪里出了问题?

论坛徽章:
0
3 [报告]
发表于 2016-06-24 19:46 |只看该作者
求大神指点一下

论坛徽章:
0
4 [报告]
发表于 2016-06-24 20:41 |只看该作者
情况回复 2# chenzysir


   

论坛徽章:
0
5 [报告]
发表于 2016-06-25 12:17 |只看该作者
问题解决了,程序没问题的。是USB转串口线的问题,换种线就好了。

论坛徽章:
0
6 [报告]
发表于 2016-06-25 15:30 |只看该作者
最初的接线是:主机USB——>USB转232——>开发板com2。开发板给主机发数据,主机的串口调试助手接收不到。但是板子上的COM1(对应UART1)就是这么连到主机上的,还用作了串口终端,为何COM1可以正常用?

后来直接:主机USB<————>USB转UART<——————>开发板UART2,这么接就OK了。

开发板上,COM2对应着UART2,两者之间有一个SP3232电平转换芯片。

为什么会这样?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP