menu
AMENG
Carpe Diem and Do what I like.
ESP8266 Serial.available()与Serial.read问题

access_time
brush 374个字
whatshot 122 ℃
ESP8266作为TCP服务端,电脑作为TCP客户端,单片机串口与ESP8266串口相连,目的是实现单片机与电脑客户端之间数据互传。
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()累加完再一次发送。

#如无特别声明,该文章均为 AMENG 原创,转载请遵循 署名-非商业性使用 4.0 国际(CC BY-NC 4.0) 协议,即转载请注明文章来源。
#最后编辑时间为: 2021 年 08 月 26 日


create 添加新评论


account_circle
email
language
textsms