比这篇新的文章:
Codee#8644
比这篇旧的文章: Codee#8642
作者: Ace Strong, 点击139次, 评论(0), 收藏者(0), , 打分:
所有评论,共0条:( 我也来说两句)
比这篇旧的文章: Codee#8642
转发串口接收的GNRMC,处理为GPRMC数据~
语言: Python, 标签: NMEA GPS 2010/01/04发布 2个月前更新作者: Ace Strong, 点击139次, 评论(0), 收藏者(0), , 打分:
Python语言: 转发串口接收的GNRMC,处理为GPRMC数据~
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()
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条:( 我也来说两句)
代码
