使用8266做串口调试工具一

日常有做工控的同学,一定有过这个经历,有的机器或设备使用串口通讯但是调试实物太麻烦或者成本太高。这个时候如果有一个能够模拟设备的东西将会事半工倍。一般来说使用串口通讯过程协议都比较简单,一般是简单的收发。网上找一圈软件串口一般都收费且使用驱动,兼容性和使用成本都比较高。

手里正好有一CH340的USB串口和8266,而8266又支持网络,那么如果用一个程序使用网络连接到8266。8266负责转发串口和网络的工具不是可以完美调试。当然展开来说还以的扩展出直接远程调试设备的效果,而且8266+340成本不过10块钱,加上随便写几行代码完美解决。

本文只讨论使用软件模拟设备的情况。在这种情况下8266就是一个中转,从上位机软件读取串口数据转发到和8266网络连接的软件上,这时在软件上可以收到上位发送来的数据,同时软件可以做出各种回应,以测试上位机处理数据的正确性。

为了方便测试和软件连接,这里把8266的IP写死。代码如下:

WiFi.mode(WIFI_STA);
    Serial.begin(115200);
    IPAddress local_IP(192, 168, 1, 166);
    IPAddress gateway(192, 168, 1, 1);
    IPAddress subnet(255, 255, 255, 0);
    //设置
    bool bConfigSucessed = WiFi.config(local_IP, gateway, subnet); //设置静态IP

接着连接到wifi,启动一个服务端以接收网络连接。

//全局服务端,监听端口9527
WiFiServer server(9527);

//启动服务端
 server.setNoDelay(true);
 server.begin();

处理里就比较简单了,接收串口数据软件到连接过来的网络端,接收网络数据软件给串口。

void loop()
{
    static WiFiClient client = server.available();
    if (!client)
    {
        client = server.available();
    }
    if (!client)
    {
        return;
    }

    client.setNoDelay(true);
    String comdata = "";
    char buf[101];
    while (Serial.available() > 0) // 串口收到字符数大于零。
    {
        int size = Serial.read(buf, 100);
        buf[size] = '\0';
        comdata += buf;
        delay(2);
    }
    /******************串口打印数据************************/
    if (comdata != "") //如果接受到数据
    {
        //Serial.println(comdata);
        client.print(comdata);
        client.flush();
    }

    while (client.available())
    {
        //读取客户端发起的TCP请求
        unsigned char len = 0;
        size_t readsize = client.readBytes((char *)&len, 1);
        //Serial.println(readsize);
        //Serial.println(len);
        if (len > 200)
        {
            client.stop();
            return;
        }
        char *buf = new char[len];
        readsize = client.readBytes(buf, len);
        buf[readsize] = '\0';
        String req = buf;
        delete[] buf;
        //Serial.println(req);
        if (req.startsWith("com:"))
        {
            //Serial.println("COM");
            String msg = req.substring(4);
            Serial.updateBaudRate(atoi(msg.c_str()));
        }
        else if (req.startsWith("send:"))
        {
            //Serial.println("SEND");
            String msg = req.substring(5);
            //Serial.println(msg.length());
            Serial.print(msg);
        }
    }
}

这里实现一个极简的协议,用了一个byte来保存数据长度,这里只能接收200以内的数据,当然完成可以扩展一下,不过一般通讯一条消息都在百以内,一般也够用,也可以把长数据拆分到200以内转发。还有这里只能接受一个客户端,如果需要也可以进行扩展处理。至此8266基本已经能正常工作。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值