免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: ljwilliam
打印 上一主题 下一主题

[驱动] 串口接收GPS模块发送的信息,接收上丢失数据 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2010-11-16 13:42 |只看该作者
办法总是有的,就怕你不去寻找

论坛徽章:
0
32 [报告]
发表于 2010-11-16 14:00 |只看该作者
回复 31# EZWORD


    也不是不去找。。。只是有关的东西,真的比较少。
   还有,我用read函数去读取,结果和直接用cat是一样的。在内核中添加打印数据的语句,从里面ptintk打印出来的信息和应用层函数read读取的信息是相一致的,但是两者都和应该从GPS模块上读取出来的信息差距很大,而且这个现象在我打印更多内核数据的相关信息(比如之前printk的overrun计数等)的时候就更严重,在内核中打印较少的信息(比如只是打印接收到的数据)情况会稍好些。这样使得这么调试起来有很大的难度,因为说不好是哪里的问题了,也不是很清楚为什么会这样。

论坛徽章:
0
33 [报告]
发表于 2010-11-16 14:05 |只看该作者
贴上你读的代码我看看吧?

论坛徽章:
0
34 [报告]
发表于 2010-11-16 14:13 |只看该作者
站内短信吧,这上面说话太累了。

论坛徽章:
0
35 [报告]
发表于 2010-11-16 14:26 |只看该作者
回复 33# EZWORD

  1.                 int fd;
  2.         int nread, i;
  3.         fd = open ("/dev/ttyS3", O_RDWR| O_NONBLOCK);
  4.         if(fd<0)
  5.         {
  6.                 perror("open error");
  7.                 return;
  8.         }
  9.         printf("fd=%d\n", fd);
  10.         int b;
  11.         char buf[512];
  12.         while(1){
  13.                 b=read(fd,buf,512);
  14.                 if(b!=-1)
  15.                 {
  16.                         printf("%s",buf);
  17.                         memset(buf,0,512);
  18.                 }
  19.         }
复制代码
这个问题不会有吧。。。。

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
36 [报告]
发表于 2010-11-17 19:30 |只看该作者
本帖最后由 damcool 于 2010-11-17 19:31 编辑

做过这个,每条语句都有校验码,利用校验码检验单条语句完整性;不完整的丢弃。跟软件缓存大小无关,跟硬件缓存大小有关,跟读取频度有关!

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
37 [报告]
发表于 2010-11-17 19:34 |只看该作者
  1. Function ChkSumNMEA(Const S: String): String;
  2. Var
  3.     I, N: Byte;
  4. Begin
  5.     N := Ord(S[2]);
  6.     For I := 3 To Length(S) Do
  7.     Begin
  8.         If S[I] = '*' Then Exit(IntToHex(N, 2));
  9.         N := N xor Ord(S[I]);
  10.     End;
  11. End;

  12. Function IsValidNMEA(Const S: String): Boolean;
  13. Var
  14.     N: Integer;
  15. Begin
  16.     N := Pos('*', S);
  17.     Exit(Copy(S, N + 1, 2) = ChkSumNMEA(S));
  18. End;
复制代码
上面是PASCAL的实现,自己转换吧!

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
38 [报告]
发表于 2010-11-17 20:41 |只看该作者
回复 1# ljwilliam


    做个简单实验.先cat 到某个磁盘文件试下

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
39 [报告]
发表于 2010-11-17 20:56 |只看该作者
另外16个字节缓冲 还是把门槛设置小点.比如一个字节或者2个字节.这样overrun的概率会低很多

论坛徽章:
0
40 [报告]
发表于 2010-11-17 21:01 |只看该作者
回复 37# damcool


    不知道您说的丢弃是不是我这里说的,一条信息里面的一部分数据丢失了,还是如果最后的校验位不对就整条信息丢弃。。
   那么读取频率的话,cat可能是比较快的,我试试看在应用程序read里面加sleep试试看
   
   另外。。。这个语句好高端。。。完全看不懂。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP