(转载请注明中文乐高)
程序的关键是参考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程序如下:
===============================================
===============================================