免费注册 查看新帖 |

Chinaunix

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

[Linux] 串口读写性能优化的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-05-22 10:36 |只看该作者 |倒序浏览
本帖最后由 tang_m_cong 于 2015-05-22 10:40 编辑

        2个程序分别对2个互连的串口进行读写,我使用的是select来判断IO的读写,程序大致如下:

写串口的程序:
  1. while (1)
  2. {
  3.     FD_ZERO(&writefds);
  4.     FD_SET(wfd, &writefds);
  5.     to.tv_sec = 5;
  6.     to.tv_usec = 50000;

  7.     if ( select(wfd, &writefds, NULL, NULL, &to) )
  8.     {
  9.         if ( FD_ISSET(wfd, &writefds) )
  10.         {
  11.                 n = write(wfd, buf, 1024);
  12.                 if (n<0)
  13.                 {
  14.                     perror("write");
  15.                     return -1;
  16.                 }
  17.         }
  18.     }
  19. }
复制代码

读串口:
  1. while (1)
  2. {
  3.     FD_ZERO(&readfds);
  4.     FD_SET(rfd, &readfds);
  5.     to.tv_sec = 5;
  6.     to.tv_usec = 50000;

  7.     if ( select(rfd, &readfds, NULL, NULL, &to) )
  8.     {
  9.         if ( FD_ISSET(rfd, &readfds) )
  10.         {
  11.             do{
  12.                     n = read(rfd, (char *)&buf+offset, 1024);
  13.                     offset += n;
  14.                 }while (n > 0 );
  15.               
  16.             if ( offset == 1024)
  17.             {
  18.                  offset = 0;
  19.             }
  20.         }

  21.     }

  22. }
复制代码

我发现的问题是尽管我在读动作时,采用了do while结构,把数据读尽为止,但是实际上是,我写入1024个字节,并且我在写时也打印过实际写入的字节数,是1024,但读的函数部分却出现了无法读尽的现象。比如第一次跳出do while循环时offset的值会小于1024,我得多次进入do while才能读完数据。
我的猜想是:因为我读写的是串口,波特率是115200,那么1024个字节写完需要 (8+2) * 1024 /115200 = 0.088 s,也就是88毫秒,而读的速度远大于数据传输的速度,这样就导致读到某个位置时n为0了。

我感觉这样影响了数据的传输速度,有什么办法优化吗?按照理论值,115200波特率的传输速率大约是11KB/S左右,但是实际上我测试大概只有3KB/S。我整个程序类似于一个xmodem传输协议,采用1k-mode,排除应答,校验计算耗时,我想应该速度不会这么差。


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP