蓝牙模块接收到监测设备传输来的数据,封装格式为十六进制的数据帧,蓝牙模块将数据通过串口发送给wrtnode 2p,wrtnode通过ser2net服务将数据转为网络数据,可以通过监听192.168.8.1:2001实现对数据的抓取,环境为python3时通过socket编程接收收据并无问题,但是当环境为python2时出现了数据解析乱码问题。于是经过以下测试完成对数据的转换。
python3.5
#python3
taylen@ubuntu:~$ python3
Python 3.5.2 (default, Oct 8 2019, 13:06:37)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> s='\xaa'
>>> print(s)
ª
>>> s=s.encode('raw_unicode_escape')
>>> s
b'\xaa'
>>> print(s)
b'\xaa'
>>> s[0]
170
>>> print(s[0])
170
python2.7
对于ASCII中无对应的数据,例如'\xaa'
>>> s
'\xaa'
>>> print(s)
�
>>> ss =s.encode('string_escape')
>>> ss
'\\xaa'
>>> ss[0]
'\\'
>>> ss[1]
'x'
>>> ss[2]
'a'
>>> sss=int(ss[ss.find('x')+1:],16)
>>> sss
170
对于ASCII对应的,无法通过encode('string_escape')将转义字符‘\’去掉,可通过ord()实现。
while True:
recvDate = tcpClientSocket.recv(1)
#print(recvDate)
#time.sleep(0.01)
print("run--------")
rs = recvDate[0]
rs = rs.encode('string_escape')
rslen = len(rs)
if rslen > 2:
rd = int(rs[rs.rfind('x')+1:],16)
else:
if rslen == 1:
rd = ord(rs)
else:
rs = rs.decode('string_escape')
rd = ord(rs)
print rd
最后发现上述所有操作都是多余。。。。。。。。。。。。。
只需ord()一步即可完成!!!!!!!!!!!!!!!!!
#!/usr/bin/python
from socket import *
import time
tcpClientSocket = socket(AF_INET, SOCK_STREAM)
print('start')
serAddr = ('192.168.8.1', 2002)
tcpClientSocket.connect(serAddr)
while True:
recvDate = tcpClientSocket.recv(1)
#print(recvDate)
#time.sleep(0.01)
print("run--------")
rs = recvDate[0]
rd = ord(rs)
print rd
if rd == 170:
print('yes')
tcpClientSocket.close()
print('end')
int(x [,base ]) 将x转换为一个整数
long(x [,base ]) 将x转换为一个长整数
float(x ) 将x转换到一个浮点数
complex(real [,imag ]) 创建一个复数
str(x ) 将对象 x 转换为字符串
repr(x ) 将对象 x 转换为表达式字符串
eval(str ) 用来计算在字符串中的有效Python表达式,并返回一个对象
tuple(s ) 将序列 s 转换为一个元组
list(s ) 将序列 s 转换为一个列表
chr(x ) 将一个整数转换为一个字符
unichr(x ) 将一个整数转换为Unicode字符
ord(x ) 将一个字符转换为它的整数值
hex(x ) 将一个整数转换为一个十六进制字符串
oct(x ) 将一个整数转换为一个八进制字符串
chr(65)='A'
ord('A')=65
int('2')=2;
str(2)='2'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)