qwuwp 2025-02-22 22:23 采纳率: 16.7%
浏览 7

两台电脑通过两个4G DTU对传时,想要发送几百kb的数据,采用分包1kb发送,间隔0.01s,在发送时,接收端DTU接受一会数据后开始停止接受,串口没有可读数据了

两台电脑通过两个4G DTU对传时(mqtt),想要发送几百kb的数据,采用分包1kb发送,间隔0.01s,在发送时,接收端DTU接受一会数据后开始停止接受,串口没有可读数据了,如何处理?是dtu设备问题吗

  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2025-02-22 22:23
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    问题分析

    您想要通过两个4G DTU对传时发送几百kb的数据,使用分包1kb发送,间隔0.01s。在发送时,接收端DTU接受一会数据后开始停止接受,串口没有可读数据了。您想知道如何处理这个问题。

    解决方案

    1. 在发送端,使用线程或协程来实现定时发送数据的功能。使用 Python 可以使用 threading 模块或 asyncio 模块来实现。
    2. 在接收端,使用串口读取数据的函数来读取数据。使用 C# 可以使用 System.IO.Ports 命名空间中的 SerialPort 类来实现。
    3. 在发送端和接收端之间,使用 MQTT 协议来实现数据传输。使用 Python 可以使用 paho-mqtt 库,使用 C# 可以使用 M2Mqtt 库。

    代码示例

    Python 代码示例:

    import threading
    import time
    import paho.mqtt.client as mqtt
    
    # 发送端
    def send_data():
        client = mqtt.Client()
        client.connect("localhost", 1883)
        data = b"1234567890" * 100  # 100KB 的数据
        for i in range(0, len(data), 1024):  # 1KB 的数据包
            client.publish("topic", data[i:i+1024])
            time.sleep(0.01)
    
    # 接收端
    def receive_data():
        serial_port = serial.Serial("COM1", 9600, timeout=0.1)
        while True:
            data = serial_port.readline()
            if data:
                print(data.decode())
    
    # 创建线程
    send_thread = threading.Thread(target=send_data)
    receive_thread = threading.Thread(target=receive_data)
    send_thread.start()
    receive_thread.start()
    

    C# 代码示例:

    using System;
    using System.IO.Ports;
    using M2Mqtt;
    
    // 发送端
    class SendData
    {
        public void Send()
        {
            MqttClient client = new MqttClient("localhost", 1883);
            client.Connect();
            byte[] data = new byte[1024];  // 1KB 的数据包
            for (int i = 0; i < 100; i++)  // 100KB 的数据
            {
                data = Encoding.UTF8.GetBytes("1234567890");
                client.Publish("topic", data);
                System.Threading.Thread.Sleep(10);  // 0.01s 的间隔
            }
        }
    }
    
    // 接收端
    class ReceiveData
    {
        public void Receive()
        {
            SerialPort serialPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
            serialPort.Open();
            while (true)
            {
                byte[] data = new byte[1024];
                serialPort.Read(data, 0, data.Length);
                if (data.Length > 0)
                {
                    Console.WriteLine(Encoding.UTF8.GetString(data));
                }
            }
        }
    }
    

    结论

    通过使用线程或协程来实现定时发送数据的功能,并使用 MQTT 协议来实现数据传输,可以解决您的问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月22日