在这篇文章中,我将介绍如何像在 Arduino 中利用 EasyTransfer 转移数据,我这么做是因为我想把 ESP8266 中的一些二进制数据转移到 Arduino 开发板中,在 Arduino 开发板中,我有一个挂载 LCD 显示器的装置,所以我没有必要重新开发。
EasyTransfer 的格式非常简单,它以 0x6 和 0x85 为开头,后面是你希望发送的内容(都以字节表示),数据本身以及一个字节的校验和,这个校验和是数据中 XOR’d 的长度(不包括以 0x6 和 0x85 的校验和本身)。
此时,你为它指定一个结构,然后程序开始运行,在另一端,结构被重新复制出来。或者是如下情况?
struct transmit_lcdX {
//put variable definitions here for the data you want to receive
//THIS MUST BE EXACTLY THE SAME ON THE DISPLAY BOARD
uint8_t cmd;
int16_t passed;
uint8_t humidity;
uint32_t thetime;
int8_t internal;
int8_t external;
uint8_t pre;
uint8_t heat;
uint8_t hold;
int8_t offset;
uint8_t set;
uint8_t fallback;
uint8_t falltemp;
uint8_t thermenable;
uint8_t dusk_hour;
uint8_t dusk_min;
uint8_t dawn_hour;
uint8_t dawn_min;
} ;
struct transmit_lcdX transmit_lcd;
//Sends out struct in binary, with header, length info and checksum
void ICACHE_FLASH_ATTR EasyTransfer_sendData( uint8_t *bfr, uint8_t size){
uint8_t buf[40];
uint8_t CS;
CS = size;
buf[0]=0x06;
buf[1]=0x85;
buf[2]=CS;
for(int i = 0; i<size; i++){
CS^=*(bfr+i);
buf[i+3]=*(bfr+i);
}
buf[size+3]=CS;
uart0_tx_buffer(buf,size+4);
}
这样很好。更简单的方法是,给结构下定义,创建一个名为 transmit_lcd 的实例,调用函数将结构的地址和长度都传送过去。
我做错的第一件事是我以碎片化的形式发送了数据。我并没有意识到乐鑫的函数 uart0_tx_buffer(buf,len) 无法立刻开始工作,很明显,这个函数是在中断的情况下才能工作。我以为使用说明中的“以后”这个词语会让我明白实际情况的,但事实并非如此。所以,最重要的是,buf[] 这个结构必须是静止的,这样,即使函数已经完成工作而且清理干净,它仍然处于原先位置。
这很好,然后我调用了自己的函数,结果什么都没有出现。LCD 并不接受数据,我花了很多时间解决这个问题。最后,我使用了一个带有十六进制输出的终端,然后,设定时间,不出所料,此时我的校验和开始工作了,但是时间的位置却出错了。28位的整数和16位的整数最终只有4个字节,我看到的结果本来应该是06 86 0xff 00 00 00 00 aa bb cc dd,在这里 ff 应该是校验和,aa bb cc dd 则是32位的时间。
但事实并非如此!时间一直延续了下去!这怎么可能!事实证明,如果没有进行特别的优化,尽管我调用了结构中一些8位变量,但是它们却以16位变量的形式被存储了起来!这究竟是怎么回事!
下面这个是可以工作的版本。当然,你可以用任何旧的变量替换结构化数据。下面是我的版本:
struct transmit_lcdX {
//put variable definitions here for the data you want to receive
//THIS MUST BE EXACTLY THE SAME ON THE DISPLAY BOARD
uint8_t cmd;
int16_t passed;
uint8_t humidity;
uint32_t thetime;
int8_t internal;
int8_t external;
uint8_t pre;
uint8_t heat;
uint8_t hold;
int8_t offset;
uint8_t set;
uint8_t fallback;
uint8_t falltemp;
uint8_t thermenable;
uint8_t dusk_hour;
uint8_t dusk_min;
uint8_t dawn_hour;
uint8_t dawn_min;
} __attribute__((packed)) ;
struct transmit_lcdX transmit_lcd;
//Sends out struct in binary, with header, length info and checksum
void ICACHE_FLASH_ATTR EasyTransfer_sendData( uint8_t *bfr, uint8_t size){
static uint8_t buf[40];
uint8_t CS;
CS = size;
buf[0]=0x06;
buf[1]=0x85;
buf[2]=CS;
for(int i = 0; i<size; i++){
CS^=*(bfr+i);
buf[i+3]=*(bfr+i);
}
buf[size+3]=CS;
uart0_tx_buffer(buf,size+4);
}
请注意上面添加的加粗部分内容,如果缺少两者中的任何一个,它都无法正常工作。
现在,如果你的 Arduino 上有一些遗留信息,而且你需要使用 EasyTransfer 向其发送一个结构,那么现在你可以这么做了。
版权声明:
本译文仅用于学习和交流目的。非商业转载请注明译者、出处,并保留文章的完整链接。
原文来源:http://tech.scargill.net/
原文标题:EasyTransfer for ESP8266