正在分析pyserial中的数据

我正在尝试通过CMUCAM通过串行端口获取数据. 此Gizmo跟踪颜色并返回一包数据. 这 数据包具有九个数据点(嗯,自第一个以来实际上是八个 点只是一个数据包标题),如下所示:M xxx xxx xxx xxx xxx xxx xxx xxx xxx 这是我正在使用的代码(Python V24): 导入序列 ser = serial.serial('com1',baudrate = 115200,bytesize = 8, parity ='n',stopbits = 1,xonxoff = 0,超时= 1) ser.write(" PM 1")#这将CMUCAM设置为投票模式 对于我的范围(0,100,1): Ser.Write(" TC 016 240 100 240 016 240 \ r \ n") 阅读= ser.Read(40) 打印阅读 组件= reading.split() 打印组件 ser.close 这是一个示例输出: M 37 79 3 4 59 124 86 25 ['59','123','87','25','M','37','79','3','4','4','59',',59',, '124','86','25','m '] M 38 77 3 2 59 124 86 25 ['39','85','26','M','38','77','3','2','2','59','124','124','86',',86', '25','m','38' ,'7'] 我的问题是我正在尝试获取每个数据点 数据包成一个单独的变量. 通常,这很容易, 正如我只会解析数据包,阅读数组并分配每个数组 元素到可变的元素. mx =组件[1]. 但是,那是 在这里不起作用,因为原始数据包和数组 我从使用split()方法中得到的是不同的. 如果我要 尝试阅读第一个示例输出中创建的数组,MX将 是123,而不是37个像包在数据包中. 在第二 例如,阵列为85,而数据包为38. 我能想出的那样近乎 数据并有助于重新安排它,使其适合原始 数据包格式M XXX XXX XXX XXX XXX XXX XXX XXX. 我会 想到我在原始数据包上使用的split()方法(即 "读取"变量)刚刚返回一个数组 像数据包一样的九个元素. 事实并非如此,我 关于如何解决这个问题,我感到不知所措. 我在这里和其他地方搜索了档案,没有运气. 任何 帮助非常感谢! 狼 :) ________________________________________________________________ 获取自己的" 800"号码 语音邮件,传真,电子邮件和更多http://www.ureach.com/reg/tag

# 回答1

孤独的狼写道: 您要求40个字节数据. 您将获得40个字节的数据. 但是,您的数据包(大概是)可变长度,(大概是) 由CR和/或LF终止. 设备的文档是什么 告诉你? 从打印语句中看到的不一定是您的 得到. 将其更改为打印reter(阅读),并向我们展示您看到的内容. 让我们尝试重建"阅读": | >> a = ['59','123','87','25','m','37','79','3','3','4','4','59', | ...'124','86','25','m'] | >> ASTRG =''.join(a) | >> astrg | '59 123 87 25 M 37 79 3 4 59 124 86 25 M' | >> Len(Astrg) | 39 <<<<< ====哦! 差不多40! | >> b = ['39','85','26','M','38','77','3','2','2','59','124',',124', '86', | ...'25','m','38' | ...,'7'] | >> bstrg =''.join(b) | >> BSTRG | '39 85 26 M 38 77 3 2 59 124 86 25 m 38 7' | >> Len(BSTRG) | 40 <<<<< ====哦! 正好40 !!! 我的猜测:该设备的泵出数据包的速度比您可以处理的要快 他们. 因此,您将获得40个字节的字节. 抢夺很长 足以覆盖整个数据包,并在 每一端. 您将需要丢弃碎片. 如果您需要所有 数据,您最好就如何实现流量控制获得一些帮助 - 我从未使用过催化器,也不会阅读_all_ docs 你 :-) 我非常有兴趣查看实际显示的print reter(阅读). 我是 强烈怀疑每个小包末端都有一个CR(无LF). 在 显示的两个情况,这将导致"打印读数"显示为 只有一个包...考虑一下:返回马车,没有线额, 会导致覆盖. 这是与这两个样本的巧合 该行的第一部分并不奇怪,有4、5或 6位数字出现在尾片结束的地方 更好的是: mx,foo,bar,......,eighth_vbl =组件[start:start + 8] 一旦确定了应该开始的开始,例如 开始= 组件.index('M') + 1 如何阅读serial.read()方法的docstring,你有没有 得出结论? Pyserial对您的数据包格式一无所知. 有了一点reter()和一点RTFM,通常可以在没有的情况下进行管理 帮助 :-) 干杯, 约翰
# 回答2

孤独的狼写道: 只需在此处尝试ser.readline(),或者也许是ser.readline(eol =" \ r"). - - Giovanni Bajo
# 回答3

在2006-12-03,孤独的狼
# 回答4

在2006年12月2日星期六23:02:06 -0500,孤狼
# 回答5

在2006-12-03,si ballenger
# 回答6

2006年12月3日在阳光下16:52:33 -0000,格兰特·爱德华兹
# 回答7

格兰特·爱德华兹(Grant Edwards)写道: :-) 邪恶的普遍主义,蝙蝠侠! 为了受益,那些新的读者,可能没有 在字符串文字外看到python代码中的"字符"或 那些被遗忘的人,有一种治愈方法: | >> re.sub(r"`(. | '打印reter(whyt),reter(foo),reter(bar)'' :-)
# 回答8

在2006-12-03,Si Ballenger
# 回答9

在2006-12-03,John Machin
# 回答10

Si Ballenger写道: 为什么? 如果Gizmo忙于"做事",请读()等待 放弃之前最多一秒钟.
# 回答11

2006年12月3日在阳光下18:44:07 -0000,格兰特·爱德华兹
# 回答12

Si Ballenger写道: [狙击] 基于split()结果(大概比 "打印阅读"结果)在我看来是: 分段 '59','123','87','25' 数据包'm','37','79','3','4','59','124','86','25' 片段" m','39'[请参阅注释] 片段" 85",'26' 数据包'm','38','77','3','2','59','124','86','25', 片段'M','38' [注意] 39显然与37和38相符,而不是123 和124. 但是,2个拆分()结果的边界在于 39,不在之后. 令人困惑. 无论如何,我不会称之为"适当的数据正在 收到的" - 看起来我缺少块.
# 回答13

2006年12月3日17:33:59 -0800,"约翰·马奇"
# 回答14

Si Ballenger写道: 好吧,以下是发布的预期返回数据格式 凸轮和下面是据报道从 凸轮进行轮询时,这似乎是一个相当的 合理的比赛. 我认为每个xxx都是小数号 记录单个字节. 在二进制模式下,每个x在 字符串可能被视为ITEFF中的字节,并可能被评估 像这样. 无论如何,应该很容易看出是否接收字符串 当未通过 串行端口. 那会开始缩小不在哪里 理解正在发挥作用. m xxx xxx xxx xxx xxx xxx xxx xxx xxx M 37 79 3 4 59 124 86 25 尝试阅读以前的帖子. OP报告说要从 基于打印forty_bytes的凸轮不打印reter(forty_bytes). 我 认为每个人(包括OP)都愿意相信 凸轮正在 *生成 *正确的可放松物品,然后是'\ r' - 现在的问题是如何每秒获得尽可能多的样本 面对缺乏缓冲,流动等问题的合理 控制等
# 回答15

在2006-12-04,John Machin

标签: python

添加新评论