利用EasyTransfer转移ESP8266中的数据

本文介绍了如何使用EasyTransfer库在ESP8266和Arduino之间传输数据,特别是二进制数据。文章详细阐述了数据结构、发送过程以及遇到的16位和32位整数存储问题,提供了解决方案。
摘要由CSDN通过智能技术生成


在这篇文章中,我将介绍如何像在 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

原文地址:http://tech.scargill.net/easytransfer-for-esp8266/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值