马上注册 登录
中文乐高 返回首页

ntwuhui的个人空间 https://bbs.cmnxt.com/?16108 [收藏] [复制] [分享] [RSS]

日志

通过EV3蓝牙读取ardunio传感器模拟量试验

已有 3070 次阅读2015-6-8 20:03 |个人分类:Ardunio| 传感器, 蓝牙, 程序, 通信

(转载请注明中文乐高)

程序的关键是参考EV3 发送消息协议进行通信,通信协议如下:

 WRITEMAILBOX:
  -------------
    Bytes sent to another brick:
    Mailbox name has to be zero terminated but name length has to be number of chars excluding
    the zero termination.
    xxxxxxxx819Exxxxxxxxxxxxxxxxxxxx
    bbbbmmmmttssllaaaaa...LLLLppp...
    bbbb = bytes in the message, mmmm = message counter, tt = type of message, ss = system command,
    ll = Name Length, aaa... = Name, LLLL = Payload length, ppp... = Payload
    Reply received from another brick:
    - Not valid

简单解释如下:
bbbb: 消息总长度(不包括这2个字节)
mmmm:信息个数 (程序中默认使用1个,即0x01 0x00)
tt:消息类型(不回复系统命令,0x81)
ss:系统命令(写邮箱,0x9E)
ll: 消息标题长度
aaaaa...: 标题名称(字符串类型)
LLLL:消息内容长度(2个字节)
ppp..:消息内容
具体消息类型如下:
文本:字符串
数字:浮点数,固定4个字节
逻辑:1个字节(0为假,1为真)

读取温度程序如下:(LM35,A0)
===========================================
#define SYSTEM_COMMAND_REPLY          0x01
#define SYSTEM_COMMAND_NO_REPLY  0x81
#define SYSTEM_REPLY                                 0x03
#define SYSTEM_REPLY_ERROR                  0x05
#define DIRECT_COMMAND_REPLY           0x00
#define DIRECT_COMMAND_NO_REPLY   0x80
#define DIRECT_REPLY                                  0x02
#define DIRECT_REPLY_ERROR                    0x04
// EV3 System command
#define WRITEMAILBOX                                0x9E

#define MIN_PACKET_SIZE                          11
#define MAX_PACKET_SIZE                         64
#define RCV_MSG_TIMEOUT                       5000

void Float2Byte(float floatNum,unsigned char* byteArry)
{
    char* pchar=(char*)&floatNum;
    for(int i=0;i<sizeof(float);i++)
    {
     *byteArry=*pchar;
     pchar++;
     byteArry++;
    }
}

float Byte2Float(unsigned char* byteArry)
{
  return *((float*)byteArry);
}

void sendMessage(char sendMessage[])
{
   for(int i=0; i<(word(sendMessage[1], sendMessage[0])+2); i++)
   {
      Serial.write(sendMessage[i]);
      delay(1);
   }
   Serial.flush(); // Waits for the transmission of outgoing serial data to complete
}

/* Send a text message to EV3 */
void sendTextMessage(char text[])
{
   char replyMessage[64]={0x15,0x00,0x01,0x00,SYSTEM_COMMAND_NO_REPLY,WRITEMAILBOX,
                          0x05,'T','e','x','t','\0'};
   int i=-1;
   do {
        i++; 
        replyMessage[14+i]= text[i];
   } while (text[i]!='\0');
   replyMessage[0] = (i+13);
   replyMessage[12] = (i+1);
   replyMessage[13] = 0;                                  
   sendMessage(replyMessage);
}

/* Send a Logic message to EV3 */
void sendLogicMessage(byte value)
{
   char replyMessage[16]={0x0E,0x00,0x01,0x00,SYSTEM_COMMAND_NO_REPLY,WRITEMAILBOX,
                          0x06,'L','o','g','i','c','\0',
                          0x01,0x00,0x00};
   replyMessage[15] = value;                               
   sendMessage(replyMessage);
}

/* Send a Number message to EV3 */
void sendNumberMessage(float value)
{
   char replyMessage[20]={0x12,0x00,0x01,0x00,SYSTEM_COMMAND_NO_REPLY,WRITEMAILBOX,
                          0x07,'N','u','m','b','e','r','\0', 
                          0x04,0x00,0x00,0x00,0x00,0x41};
   unsigned char temp[4];   
   Float2Byte(value, temp);
   for (int i=0;i<4;i++)  replyMessage[16+i] = temp[i];           
   sendMessage(replyMessage);
}

void setup()
{
  Serial.begin(9600);
}

void loop()
{ 
        sendNumberMessage( analogRead(0)*125/256.0);
        delay(1000);
}
===============================================

EV3G程序如下:
===============================================

===============================================


路过

雷人

握手

鲜花

鸡蛋

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 马上注册

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

GMT+8, 2026-10-27 20:39 , Processed in 0.015522 second(s), 20 queries .

Powered by Discuz! X5.0

Copyright © 2001-2020, Tencent Cloud.

返回顶部