ESP8266 Serial.available()与Serial.read问题

ESP8266 Serial.available()与Serial.read问题

AMENG
2021-08-20 / 0 评论 / 4 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2021年08月26日,已超过971天没有更新,若内容或图片失效,请留言反馈。
ESP8266作为TCP服务端,电脑作为TCP客户端,单片机串口与ESP8266串口相连,目的是实现单片机与电脑客户端之间数据互传。
```c uint8_t readBuf[256]; char readBuf_1[256]; int inComingBytes_1; while (client.connected()) //如果客户端处于连接状态 { //接收客户端数据转发给串口 int inComingBytes = client.available(); if(inComingBytes > 0){ client.read(readBuf, inComingBytes); Serial.write(readBuf, inComingBytes); } //接收串口数据转发给客户端 inComingBytes_1 = Serial.available(); delay(5);//解决方法 if(inComingBytes_1 > 0){ Serial.read(readBuf_1, inComingBytes_1); client.write(readBuf_1, inComingBytes_1); } } ```
在利用ESP8266将串口数据与TCP数据互传时遇到问题,串口接收的数据不能一次发给TCP客户端,而是分为两次发送。
如发送:49 60 00 35 00 00 15 7b 时。客户端收到的数据为
49
60 00 35 00 00 15 7b  
可以看到数据被分为两次发送了。后来经过了解后发现Serial.available()读取接收的数据字节数时并不是一次性读取的,而是逐渐累加的,每次累加一个字节,直至读完。
而当我们使用Serial.read读取时,每读取一个字节时,Serial.available()的累加值就会减一,这样就造成我们在利用以上代码时,当有数据接收时,Serial.available()为1时便立马进行读取,然后发送给客户端,这样就有了第一次发送一个字节的数据,而当第二次发送时,由于第一次发送数据时有一段时间的阻塞延时,所以Serial.available()被全部累加起来了,所以第二次就能把数据全部发送出去。
解决办法就是在接收到第一个字节时不立马发送,而是添加一段时间的延时,使Serial.available()累加完再一次发送。
0

评论 (0)

取消