找回密码
 马上注册

QQ登录

只需一步,快速开始

楼主: grant7788

记录用手机上Python编程用蓝牙控制NXT的学习过程(并提供相应资料下载)

 火.. [复制链接]
 楼主| 发表于 2011-2-13 20:15:20 | 显示全部楼层
糖伯虎 发表于 2011-2-13 10:56
回复 grant7788 的帖子

限制已经取消,你就放心发帖吧

哈哈,谢谢糖版... 最近在忙Python,等我有空了去水区灌水,嗯,没啥问题吧?


如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-13 20:15:59 | 显示全部楼层
回复 baby_snake 的帖子

是的。确实是个好东西。越来越喜欢了。不过还处在磨合期,要熟悉很多东西。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-13 22:59:25 | 显示全部楼层
在Python下写了一个类库,基本实现了之前用VC做的功能。类库代码(文件名:btcomm.py)
  1. #btcomm.py
  2. # class to handle the communication via bluetooth with NXT
  3. # need pyserial, download from: http://pyserial.sourceforge.net/
  4. # by Grant, 2011-2-13

  5. import sys, time
  6. import serial

  7. class BTComm:
  8.     def __init__(self, comport = "COM8"):
  9.         self.serial = serial.Serial()
  10.         self.serial.port = comport #"COM8"
  11.         self.serial.baudrate = 96000
  12.         self.serial.timeout = 3
  13.         self.serial.bytesize = 7
  14.         self.serial.parity = 'O'
  15.         self.serial.stopbits = 1

  16.     def btopen(self):
  17.         try:
  18.             self.serial.open()
  19.             if self.serial.isOpen():
  20.                 print("Bluetooth connection ok!")
  21.                 return(0)
  22.             else:
  23.                 return(-1)
  24.         except Exception as ex:
  25.             print("Error!\n%s" % ex)
  26.             if self.serial.isOpen():
  27.                 self.serial.close()

  28.     def btclose(self):
  29.         if self.serial.isOpen():
  30.             self.serial.close()

  31.     # read message string from NXT
  32.     def btreadmessage(self):
  33.         if self.serial.isOpen():
  34.             n = self.serial.inWaiting()
  35.             if n:
  36.                 readdata = slef.serial.read(n)
  37.                 return(readdata)
  38.             else:
  39.                 return("")
  40.             
  41.     # send a message string to NXT (by default: mailbox 1).
  42.     def btsendmessage(self, strMessage, mailbox = 0):
  43.         if self.serial.isOpen():
  44.             ilength = len(strMessage)
  45.             senddata = bytes([0x0, 0x80, 0x9])
  46.             senddata = (chr(ilength+5)).encode() + senddata
  47.             senddata = senddata + chr(mailbox).encode() + (chr(ilength+1)).encode()
  48.             senddata = senddata + strMessage.encode() + b'\0'
  49.             icount = self.serial.write(senddata)
  50.             return(icount)

  51.     # send a logic value (0 / 1) to NXT.
  52.     def btsetlogic(self, bLogic, mailbox = 0):
  53.         if self.serial.isOpen():
  54.             senddata = bytes([0x6, 0x0, 0x80, 0x9])
  55.             senddata = senddata + chr(mailbox).encode() + chr(0x2).encode()
  56.             senddata = senddata + (chr(bLogic)).encode()
  57.             senddata = senddata + (chr(0x0)).encode()
  58.             icount = self.serial.write(senddata)
  59.             return(icount)

  60.     # send a value to NXT. not ready yet.
  61.     def btsendvalue(self, value, mailbox = 0):
  62.         if self.serial.isOpen():
  63.             senddata = bytes([0x6, 0x0, 0x80, 0x9])
  64.             senddata = senddata + chr(mailbox).encode() + chr(0x5).encode()
  65.             for i in range(4):
  66.                 senddata = senddata + (chr(value & 0xff)).encode('latin-1')
  67.                 value = int(value / 256)
  68.             # senddata = senddata + (chr(value)).encode()
  69.             senddata = senddata + (chr(0x0)).encode()
  70.             icount = self.serial.write(senddata)
  71.             return(icount)

  72.     # function to read back the voltage of battery, in mili-volt
  73.     def btreadnxtbattery(self):
  74.         if self.serial.isOpen():
  75.             self.serial.write(bytes([0x2, 0x0, 0x0, 0xb]))
  76.             time.sleep(1)
  77.                
  78.             n = self.serial.inWaiting()
  79.             if n:
  80.                 c = self.serial.read(n)
  81.                 batterymilivolt = c[n-2] + c[n-1]*256
  82.                 return(batterymilivolt)
  83.             else:
  84.                 print("No data back from serial port!")
  85.                 return(0)
  86.         else:
  87.             print("Bluetooth port connect fail!")
  88.             return(-1)

  89.     # function to read back the firmware version.
  90.     def btgetfirmwareversion(self):
  91.         if self.serial.isOpen():
  92.             senddata = bytes([0x2, 0x0, 0x01, 0x88])
  93.             self.serial.write(senddata)
  94.             time.sleep(1)

  95.             n = self.serial.inWaiting()
  96.             if n:
  97.                 c = self.serial.read(n)
  98.                 firmwareversion = str(c[8]) + "." + str(c[7])
  99.                 return(firmwareversion)
  100.             else:
  101.                 return("")
  102.             
复制代码



如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-13 23:01:03 | 显示全部楼层
调试用的小程序。读回电池电量,以及固件版本。个人感觉使用起来还是比较方便的。
过两天写个图形界面出来。貌似Python下图形界面用起来还是比较方便的。
下一步,要去忽悠家里领导,批手机的预算...

  1. import sys,time
  2. import serial
  3. from btcomm import *

  4. btport = BTComm("COM8")
  5. if (btport.btopen() != 0):
  6.     print ("Error open Bluetooth port!")
  7. else:
  8.     volt = btport.btreadnxtbattery()
  9.     print("Voltage of NXT is %d mV." % volt)
  10.     firmwarever = btport.btgetfirmwareversion()
  11.     print("Firmware version is %s" % firmwarever)
  12. btport.btclose()
复制代码




如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-13 23:25:03 | 显示全部楼层
本帖最后由 grant7788 于 2011-2-13 23:25 编辑

再推荐一本Python的好书:
O'Reilly, Learning Python, 4th Edition, by Mark Lutz
我前面推荐的那本书,是一本快速入门书,让你可以很快地发现Python的魅力;
而这本书,是非常扎实的一本参考书,内容详实,可以备在手边随时参考。
我昨天写串口程序时,遇到byte和str的一些转换,在Python的网站上搜了半天不得要领,还是静下心来翻看这本书中相关的章节,最后才找到解决方法。
我把书名已经发上来了,大家有兴趣的可以自己去搜下载链接。如果找不到的话和我说,我再上传。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2011-2-14 15:59:39 | 显示全部楼层
回复 grant7788 的帖子

黑莓也可以
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2011-2-14 16:01:46 | 显示全部楼层
回复 grant7788 的帖子

pc与nxt通信的我大学时候毕业设计做出来过,在论坛发过,用的是C#
需要的话可以PM

如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-14 17:19:48 | 显示全部楼层
回复 webspider 的帖子

谢谢。黑莓也在我考虑的系列中,不过比较挣扎。
目前倾向Andriod系统,HTC G7之类的吧。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-14 17:20:58 | 显示全部楼层
回复 webspider 的帖子

谢谢,我用VC做的已经成功了。Python的也做好了。下面就是买手机,并写手机用的程序了。
中午有点时间看了一下google上的andriod文档,有专门的bluetooth相关的函数。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-14 17:32:48 | 显示全部楼层
不过我一直不擅长做界面,哈哈~
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-14 17:54:16 | 显示全部楼层
本帖最后由 grant7788 于 2011-2-14 17:54 编辑

Mark Lutz的Python的书,有三本:
Learning Python
Programming Python
Python Pocket Reference
这三本书读的顺序,应该就是我列出的这个顺序。
今天收齐了。找时间看。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-15 22:50:56 | 显示全部楼层
继续啃书... Learning Python, Part I。
虽然没写很大的程序,不过Mark在书中对各种变量的来龙去脉,写得很详实。例子都很短小精悍。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-15 22:51:31 | 显示全部楼层
手机初步定在HTC G7。目前大概要2850上下,不算便宜啊...
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-17 10:59:00 | 显示全部楼层
NND居然还涨价... 我再扛几天!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2011-3-5 20:50:56 | 显示全部楼层
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|中文乐高 ( 桂ICP备13001575号-7 )

GMT+8, 2024-3-29 09:25 , Processed in 1.225679 second(s), 16 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表