android 屏幕 占空比,24-ESP8266 SDK开发基础入门篇--Android TCP客户端.控制 Wi-Fi输出PWM的占空比,调节LED亮度...

刚才有人说需要点鸡汤....

我想想哈;我还没问关于哪方面的鸡汤呢!!!

我所一直走的路线

第一:能够帮到人

第二:能够获得好的人气

第三:获取利益,养活自己

其实第一和第二只要你有哪一方面的优点,又肯吃苦,那么就很好走到.

但是至于第三点,既要全心全意的帮助别人又要从别人那里获取利益养活自己.....其实不容易

很多人只能走到第一,第二,然后走到沾一点第三的边.

这个时候的人们就开始浮躁了,大部分人都会走极端,要么舍弃不干了,要么突然把自己的东西开始全部利益化......

怎么说呢!走到这个时候,你应该静下心来好好的想想自己的初心,很多时候人们都在说:不忘初心!!!

注意:事情总会有解决的办法,可能在那个时候你没有想出来很好的办法,就走了极端,你是否想过,你再坚持坚持自己的初心,无论何时都

不能动摇自己的初心.你要知道很多时候都是在人们感觉一点希望都没有的时候,才会想到办法,才看到了希望!所以才会有了那句:天道酬勤

其实我本身就是经历过这种日子,我曾经也动摇过初心,但是怎么说呢!我动摇过后不到3天就会立马改过来,因为我不敢欺骗自己的心.会让我难受!

那个马爸爸说过一句话:迷茫和彷徨过后,知道自己应该干什么才是最重要的!

关键还是放平自己的心态,现在遍地都是浮躁的人,一口吃不了胖子!

虽然说是金子总会发光,,但是我的理解是:谁一开始都不是金子,是经过了炼金的过程最终把自己炼成了金子.

增加一个SeekBar

475c903e033f468d9d93c19e8399e1f9.png

一个 Switch

87cf5cfc3eb704fd6a9205562e604991.png

协议:

00 01 70 C0 控制LED点亮  70 C0  为CRC高位和低位

00 00 B0 01 控制LED熄灭   B0 01  为CRC高位和低位

PWM数据

01固定  后四位为PWM数据(高位在前低位在后,按照IEEE754规约) 最后两位为CRC16校验位,高位在前,低位在后

列如:举几个例子,PWM数据是0-1000

01 00 00 03 E8 7E 19   注:00 00 03 E8  为1000          7E 19  为CRC检验数据高位在前,低位在后

01 00 00 01 F4 D7 19           500

01 00 00 00 64 2B 18            100

01 00 00 00 00 C0 19            0

大家可以用此工具生成CRC,用于验证咱写的CRC程序.

802fd15a837f98e150910507a331c9e7.png

注:01 00 00 03 E8 7E 19    其实可以省掉两个0          01 03 E8 7E 19

但是我所用过的大部分的仪器仪表都是4位的所以咱就还是用四位

现在看Android 端怎么写

036d0ba09a0919a39d144a88c7c95487.png

2b336517710953ccd0756d3478f8c31a.png

现在呢给大家计算CRC的程序,判断数据CRC是不是正确的程序

/**

* CRC检验值

* @param modbusdata

* @param length

* @return CRC检验值*/

protected int crc16_modbus(byte[] modbusdata, intlength)

{int i=0, j=0;int crc = 0xffff;//有的用0,有的用0xff

try{for (i = 0; i < length; i++)

{//注意这里要&0xff,因为byte是-128~127,&0xff 就是0x0000 0000 0000 0000 0000 0000 1111 1111//参见:https://blog.csdn.net/ido1ok/article/details/85235955

crc ^= (modbusdata[i]&(0xff));for (j = 0; j < 8; j++)

{if ((crc & 0x01) == 1)

{

crc= (crc >> 1) ;

crc= crc ^ 0xa001;

}else{

crc>>= 1;

}

}

}

}catch(Exception e)

{

}returncrc;

}/**

* CRC校验正确标志

* @param modbusdata

* @param length

* @return 0-failed 1-success*/

protected int crc16_flage(byte[] modbusdata, intlength)

{int Receive_CRC = 0, calculation = 0;//接收到的CRC,计算的CRC

Receive_CRC=crc16_modbus(modbusdata, length);

calculation= modbusdata[length];

calculation<<= 8;

calculation+=modbusdata[length+1];if (calculation !=Receive_CRC)

{return 0;

}return 1;

}

先去烧壶水,今天需要熬夜写文章,测试东西....

下面看使用

ca2e288afc8adecd814d837114510da9.png

我先和我的电脑的网络调试助手测试一下

618c2c6510b206aa63960820636f3c33.png

d88fec56981d5edf2c9c39e98cf2aba1.png    

c04196d1c76ac2851f432c9410a3d611.png

3f844a0f7a8065561af2682a6494f66a.png  

cda3ffbf356e5162c6859990f4d2f39e.png

好,现在写WIFI的程序

弄个crc.c和crc.h

d187004289d6c73543c02ce47da1646f.png

d5bbafbda9e2c300920a0a02f22e8f6f.png

官方的都是把h文件放到这里,咱也放到这里

f88e4a8ebae47ecbd65d8073541137d9.png

C语言的和java的其实差不多,只不过有些细节不一样,类如java用byte  java的byte需要&0xff

17af0f80af5a0be0063ccc2a6b0ff7e6.png

#include "esp_common.h"

/**

* @brief 计算CRC

* @param *modbusdata:数据指针

* @param length:需要计算的CRC的数据长度

* @param

* @retval 计算的CRC

* @example

**/

int crc16_modbus(u8 *modbusdata, intlength)

{inti, j;int crc = 0xffff;//有的用0有的用0xffff

for (i = 0; i < length; i++)

{

crc^=modbusdata[i];for (j = 0; j < 8; j++)

{if ((crc & 0x01) == 1)

{

crc= (crc >> 1) ^ 0xa001;

}else{

crc>>= 1;

}

}

}returncrc;

}/**

* @brief 判断CRC的校验是否正确

* @param *modbusdata:要判断的数据指针

* @param length:需要计算的CRC的数据长度

* @param

* @retval 1 OK· 0 err

* @example

**/

int crc16_flage(u8 *modbusdata, intlength)

{int Receive_CRC=0,calculation=0;

Receive_CRC= crc16_modbus(modbusdata, length);//用自带的函数计算数据的CRC

calculation = modbusdata[length];//获得接收的CRC的高位

calculation <<= 8;//获得接收的CRC的低位

calculation += modbusdata[length+1];//高低位组合

if(calculation != Receive_CRC)//看看CRC是否相等

{return 0;

}return 1;

}

声明一下

55b7c7c7dd83d3efc982ba2508a13008.png

然后

ee71d674a995fa857bd6ae77b8b979d8.png

2f4b2fafac01365d706e507338826393.png

下载测试

4c34f33874ad319a2fd74933c077dfc2.png

4cbe90a77737f1284cae95208b2bed61.png

开发板看上去有点旧........因为我把我使用的测试的那一块板子都卖了,现在还欠着别人的板子呢.....我使用的是以前自己焊接的一块..断货了....

最近由于一直忙,这块板子的下一批贴片可能要等大约2个星期.....

861f16347df12386164f5f6cd9e306d7.png   

7dea54fc951263204e02d764fa067ec7.png  

2aa7af4afb823b1e7067146268a96cbe.png

482fad5f2e5227f81dc12a51895be755.png  

8c61937dad1b5b22dd8030f5f13397c8.png  

aa14d10993837817c675cb3759695f31.png

接着做PWM部分

5303b2368b5d7a1f4372b3387490e3af.png

fc269d4720c3972b02b113cd2f9ad15b.png

和当时串口的时候一样,咱呢不能直接把发送放到里面,咱的TCP服务器设置的是5ms延时

所以咱呢,就10ms发送一次数据.

判断数据变化了,就把数据发送出去...

我测试了,出现了问题

WIFI的程序有问题,会粘包....

先说一下我的Android 的程序

0a461802257fad3737a7d2351780f3b0.png

4e6fd6db6da45049079f485e46a9eaf9.png

//TCP客户端发送数据

private voidstartTimer(){if (timer == null) {

timer= newTimer();

}if (timerTask == null) {

timerTask= newTimerTask() {

@Overridepublic voidrun() {try{if (seekBarValueCopy != seekBarValue){//数据改变

seekBarValueCopy =seekBarValue;if (socket!=null && socket.isConnected()){//如果TCP是正常连接的

int crc = 0;

TcpSendData[0] =(byte)0x01;

TcpSendData[1] =(byte)((seekBarValue>>24)&0xff);

TcpSendData[2] =(byte)((seekBarValue>>16)&0xff);

TcpSendData[3] =(byte)((seekBarValue>>8)&0xff);

TcpSendData[4] =(byte)(seekBarValue&0xff);

crc= crc16_modbus(TcpSendData, 5);//计算CRC

TcpSendData[5] = (byte)((crc >> 8) & 0xff);//CRC高位

TcpSendData[6] = (byte)(crc & 0xff);//CRC低位

outputStream.write(TcpSendData,0,7);//发送数据

}

}

}catch (Exception e){//接收数据有错误

Message msg = myHandler.obtainMessage();//从消息队列拉取个消息变量

msg.what = 9;//设置消息变量

myHandler.sendMessage(msg);//插入消息队列

}

}

};

}if(timer != null && timerTask != null)

timer.schedule(timerTask,10, 100);//启动定时器,100ms进一次

}//停止定时器

private voidstopTimer(){if (timer != null) {

timer.cancel();

timer= null;

}if (timerTask != null) {

timerTask.cancel();

timerTask= null;

}

}

1308ff3444a0fb04ed0ce1ddb6aaaa37.png

然后我用电脑的网络调试助手测试的

4e9b33021bd28ad2c04aceecf83778ba.png

滑动进度条,大约100ms发送一次数据,如果这次数据和上次数据不一样的话

而用8266测试的是

d8b0c5c5cc2a23af903777aa6eac6e5f.png

就是说粘包挺严重的了,本来是7个数据......

7b198be03b901341b93c96a87a44b2f0.png

这个问题我有时间用ENC28J60测试下,当然源码都是公开的,大家发现有什么问题可以告知,感谢!

9b3f0a9bff5a8cf15ae752aec6cdf2ba.png

04a1278def2926a477f9f0d057236271.png

咱再接着优化一个问题

由于打开了PWM,所以这个无效了

2e4b0c58daa82c59bbd5b049474ad010.png

所以

8cebc457e469ad693f828f641e4cb108.png

aa6c96cb13ae16e867135cc06a640b97.png

然后大家自己去测试哈,,,由于粘包问题,就是滑动进度条的时候不怎么好使,这个我再找找WIFI程序的问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值