找回密码
 马上注册

QQ登录

只需一步,快速开始

查看: 6297|回复: 10

NXT如何辨别蓝牙传送过来的数字??

[复制链接]
发表于 2011-8-17 23:03:04 | 显示全部楼层 |阅读模式
本帖最后由 沉默 于 2011-8-18 09:09 编辑

花了几天时间总算基本搞好了。
用C#编写了程序在PC-NXT之间通过蓝牙传出和接受数据。
最后还有一个问题,我参考网上的程序由PC传送数字,NXT总是接收不到。
PC发送的数值在NXT上辨认不出来,而字符串可以。
请问数字要用什么格式发送才能让NXT辨认出来
求解




如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
 楼主| 发表于 2011-8-18 10:09:18 | 显示全部楼层
本帖最后由 沉默 于 2011-8-18 10:28 编辑

//用C#写的发送int部分的源代码,不少是抄别人的,所以有些也搞不太懂
//comm是串口
//rawData数组是所要发送的串口信号,5-8位是所要发送的int数值
//sendRawData方法是rawData加上两位数据长度后发送至串口
public byte[] sendRawData(byte[] rawData)   
     {
           const int byteSize = 256;
            Byte[] sendLength = new Byte[rawData.Length+2];
            sendLength[0] = (byte)(rawData.Length % byteSize);
            sendLength[1] = (byte)(rawData.Length / byteSize);
            for (int i = 0; i < rawData.Length; i++)
            {
                sendLength[i + 2] = rawData;
            }
            comm.Write(sendLength, 0, sendLength.Length);
            return sendLength;//为了格式,要有个返回值乱填的,发送字符串的时候无影响 ,应该不是这里的问题

        }

public byte[] sendInt(int data)
        {
            const int mask =
0xff;
            //串口所要发送的
            byte[] rawData = { 0x00, 0x09, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00 }; // 4 bytes data
            //rawData[2] 数组的第三个值,也就是邮箱,偷懒就用一号邮箱
            rawData[2] = (byte)(0);
            //8位8位的取值依次放入数组rawData的5-8位
         //错误应该是在这里
            for (int i = 0; i < 4; i++)
            {
                rawData[4+i] = (byte)(data & mask);
                data >>= 8;
            }
            return sendRawData(rawData);
        }


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

使用道具 举报

 楼主| 发表于 2011-8-18 10:15:59 | 显示全部楼层
本帖最后由 沉默 于 2011-8-18 10:42 编辑

//设置串口打开串口
private SerialPort comm = new SerialPort();
comm.PortName = "com5";//看蓝牙的串口号更改
comm.BaudRate = 9600;
comm.Open();
//主程序入口运行下面的语句,NXT的邮箱应该收到20这个数字,可是没有
sendInt(20);
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2011-8-18 10:20:03 | 显示全部楼层
虽然我没有学过c#,但是感觉和java区别还是不大,我这里有一个原来我用android写的程序的片段,可以在手机上获取NXT的固件版本,下面的代码是一个按键监听器,监听按钮按下,发送并接收,然后显示在手机的屏幕上,程序有点糙,将就看吧。
  1.   private class firmwareListener implements OnClickListener{
  2.                 @Override
  3.                 public void onClick(View v) {
  4.                         System.out.println("firmwareListener");
  5.                         try{                                
  6.                                 buffer[0] = 0x02;
  7.                                 buffer[1] = 0x00;
  8.                                 buffer[2] = 0x01;
  9.                                 buffer[3] = (byte) 0x88;
  10.                                 System.out.println("" + buffer[3]);
  11.                                 nxtOutputStream.write(buffer);
  12.                                 nxtOutputStream.flush();
  13.                                 Thread.sleep(1000);
  14.                                 byte[] sizebuffer = new byte[6];
  15.                                 int bytesRead = nxtInputStream.read(sizebuffer, 0, 2);
  16.                                 int bytesReady = sizebuffer[0];
  17.                                 byte [] retBuf = new byte[bytesReady];
  18.                                 bytesRead = nxtInputStream.read(retBuf);
  19.                                 firmware.setText("firmware version:"  + retBuf[6] + "." + retBuf[5]);
  20.                         }
  21.                         catch (Exception e){
  22.                                 System.out.println("Error write buffer!");
  23.                         }
  24.                 }
  25.     }
复制代码
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2011-8-18 10:21:45 | 显示全部楼层
这个和上面的差不多,是获取电池电量的,做参考吧,太多是也帮不上了,欢迎你研究好了写个教程造福后人。
  1. private class batterylevelListener implements OnClickListener{
  2.                 @Override
  3.                 public void onClick(View v) {
  4.                         try{
  5.                                 System.out.println("batteryListener");
  6.                                 buffer[0] = 0x02;
  7.                                 buffer[1] = 0x00;
  8.                                 buffer[2] = 0x00;
  9.                                 buffer[3] = 0x0B;
  10.                                 nxtOutputStream.write(buffer);
  11.                                 nxtOutputStream.flush();
  12.                                 Thread.sleep(1000);
  13.                                 byte[] sizebuffer = new byte[2];
  14.                                 int bytesRead = nxtInputStream.read(sizebuffer, 0, 2);
  15.                                 int bytesReady = sizebuffer[0];
  16.                                 byte [] retBuf = new byte[bytesReady];
  17.                                 bytesRead = nxtInputStream.read(retBuf);
  18.                                 int sVolt = retBuf[4] * 256 + retBuf[3];
  19.                                 System.out.println("Volt = " + sVolt + " mV");
  20.                                 batterylevel.setText("Volt = " + sVolt + " mV");
  21.                         }
  22.                         catch (Exception e){
  23.                System.out.println("Error write buffer!");
  24.                         }
  25.                 }
  26.     }
复制代码
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2011-8-18 10:24:52 | 显示全部楼层
nxc编写?
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-8-18 10:30:04 | 显示全部楼层
本帖最后由 沉默 于 2011-8-18 10:34 编辑

版主 谢谢
不过 我现在遇到的问题是没法正常的发送和接受int数值,格式不对
你的代码里面能够指出哪里是发送int数值的吗??不要先把int转成string发送...nxt-G没法把字符串转为int
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-8-18 10:35:41 | 显示全部楼层
本帖最后由 沉默 于 2011-8-18 10:39 编辑

版主 谢谢
不过 我现在遇到的问题是没法用邮箱正常的发送和接受int数值,格式不对
你的代码里面能够指出哪里是发送int数值的吗??看的有点头晕 不要先把int转成string发送...因为nxt-G没法把字符串转为int
楼上的别灌水 求助中,别捣乱哈
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2011-8-18 10:48:18 | 显示全部楼层
我的代码里,所有数据都是按照byte来接收的,我想其他的应该也是这样,都是8bit一组,int和string在发送时候没有却别的,只是看你怎么处理接收到的值。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-8-18 11:02:57 | 显示全部楼层
本帖最后由 沉默 于 2011-8-18 11:44 编辑

是用byte发送和接收的,可是不知道要怎么还原成原来的值,我还用一个工具nxtbluetooth通过蓝牙读取邮箱里面的值,还是没搞懂,水平太低了,协议里面可能有吧 哎 那些E文搞得我头晕,太难理解了。
如果用NXT-G编写程序让nxt发送整数1 邮箱里读取的值是 00 00 80 3F
2对应的是 00 00  00 40
3:         00 00  40 40
20:       00 00  A0 41
20.1:    CD CC A0 41
1.1111X10^16也可以
还可以放非整数的....1.1111X10^16也可以.
可是我完全找不到规律,到底是怎么换算的呢 吐了 求高手指点
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-8-19 15:56:54 | 显示全部楼层
没有人遇到这种问题吗?
以前的NXT邮箱可能只能放整数,现在可以放浮点数,格式可能不同
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 09:04 , Processed in 0.088807 second(s), 18 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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