比这篇新的文章: Codee#8644
比这篇旧的文章: Codee#8642

转发串口接收的GNRMC,处理为GPRMC数据~

语言: Python, 标签: NMEA GPS 2010/01/04发布 2个月前更新
作者: Ace Strong, 点击139次, 评论(0), 收藏者(0), , 打分:

背景
主题: 字体:
01 #! /usr/bin/env python
02 #coding=utf-8
03
04 import time
05 import pty
06 import os
07 import serial
08 import re
09
10 COM = '/dev/ttyUSB0'
11 BAUDRATE = 115200
12
13 def mkpty():
14     # 打开伪终端
15     master, slave = pty.openpty()
16     slaveName = os.ttyname(slave)
17     print 'slave device names: ', slaveName
18     return master
19
20 def getFrame(data):
21     '''从data中寻找完整的frame。
22     frame, data = getFrame(data)
23     如果能找到的话,就返回完整的frame和剩下的数据;
24     否则返回None和剩下的可能与后续数据组成有效frame的残余数据。
25     一个完整的frame形如
26     "$GNRMC,120717.00,A,3202.3429739,N,11848.8475274,E,0.0254,314.086,040110,,,A*74"。
27     '''
28     # 匹配frame
29     mat_pattern = re.compile(r'(\$.*?\*\w{2}\r\n)', re.DOTALL)
30     # 匹配frame及之前的无用数据
31     sub_pattern = re.compile(r'^.*?(\$.*?\*\w{2}\r\n)', re.DOTALL)
32     m = re.search(mat_pattern, data)
33     frame = None
34     if m:
35         frame = m.group(0)
36         data = re.sub(sub_pattern, '', data)
37     return (frame, data)
38
39 def getChecksum(nmeadata):
40     '''
41     计算value对应的校验码,采用XOR方式产生校验码。
42     '''
43     result = 0
44     for s in nmeadata:
45         result ^= ord(s)
46    
47     return hex(result)[2:].upper()
48
49
50 if __name__ == "__main__":
51     master = mkpty()
52     ser = serial.Serial(COM, BAUDRATE, timeout=0)
53     pattern = re.compile(r'GNRMC')
54     value_pattern = re.compile(r'\$(.*?)\*')
55     checksum_pattern = re.compile(r'\*\w{2}\r\n')
56
57     data = ser.read(128)
58     try:
59         while True:
60 #            print "before getFrame: ", len(data)
61             gnrmc, data = getFrame(data)
62 #            print "after getFrame: ", len(data)
63             if gnrmc is not None:
64                 print "Before: %s" % gnrmc
65                 gprmc = re.sub(pattern, 'GPRMC', gnrmc)
66                 value = re.match(value_pattern, gprmc).group(1)
67                 checksum = getChecksum(value)
68                 gprmc = re.sub(checksum_pattern, '*'+str(checksum)+"\r\n", gprmc)
69                 print "After: %s" % gprmc
70                 os.write(master, gprmc)
71 #            elif len(data) > 5:
72 #                print 'mismatch: %s' % data
73             time.sleep(0.05)
74             data += ser.read(128)
75     except Exception, e:
76         print "error: %s" % e
77     finally:
78         ser.close()


所有评论,共0条:( 我也来说两句)


发表评论

注册登录后再发表评论