2

我正在编写一个向设备写入channel urls和写入的程序channel names。我正在尝试以channel urls254 的长度编写。较短的 url(我还没有找到阈值)确实有效。更奇怪的是,channel names它们只有 16 个字符长,而且它们也只会在channel urls更短的时候才写。

我有以下有效的代码:

            for (int i = 0; i < numberOfChannels; i++)
            {
                string hexString = String.Format("{0:X1}", i);
                Serialport.WriteLine("channel 2 " + hexString + " " + channelURLs[i]);
                System.Threading.Thread.Sleep(1000);
                Serialport.WriteLine("channel 1 " + hexString + " " + channelnames[i]);
                System.Threading.Thread.Sleep(1000);
            }

但是,我不想让我的代码为编写 1 个通道而休眠 2 秒。问题:如何在不等待 2 秒的情况下通过串行端口写入那些长字符串?

这不起作用:

            for (int i = 0; i < numberOfChannels; i++)
            {
                string hexString = String.Format("{0:X1}", i);
                if (Serialport.WriteLine("channel 2 " + hexString + " " + channelURLs[i]))
                {
                    Debug.WriteLine("this should happen before the string is written");
                }
                if(Serialport.WriteLine("channel 1 " + hexString + " " + channelnames[i]))
                {
                    Debug.WriteLine("this should happen before the string is written");
                }
            }

调试行被写入,字符串不是通过 comport 写入的。

我的Serialport.WriteLine功能如下所示:

    public static bool WriteLine(string data)
    {
        if (SerPort.IsOpen)
        {
            Debug.WriteLine("PORT OPEN, WRITING "+ data);
            SerPort.WriteLine(data);
            return true;
        }
        else return false;

    }

更新:我发现当我断开连接并重新连接时,会写入第一个 URL。显然它与一些缓冲区有关?

UPDATE2:这就是我设置串行端口的方式:

                    SerPort.BaudRate = 115200;
                    SerPort.DataBits = 8;
                    SerPort.StopBits = StopBits.One;
                    SerPort.PortName = comnr;
                    SerPort.Handshake = Handshake.None;
                    Serialport.SerPort.ReadTimeout = 1000;
                    Serialport.SerPort.WriteTimeout = 1000;
                    SerPort.DataReceived += SerPort_Datareceived;
                    SerPort.Open();
                    SerPort.DiscardInBuffer();
                    SerPort.DiscardOutBuffer();

更新 3:修复了我发现问题所在的问题。在发送此处显示的命令之前,我发送了一个需要一些时间来处理的命令。如果设备在此过程中收到数据,它将停止接收数据。我用计时器更新了我的代码,以在发送下一个命令之前检查设备的 OK 响应。

4

1 回答 1

-1

这取决于您正在使用的设备。如果您向它发送太多字节,它可能无法全部处理。

您可以尝试将等待时间从 1000 毫秒减少到例如 200 毫秒。

您还可以尝试发送数据包...例如,以 50 个字符的包发送长字符串,在它们之间等待一段时间(例如,100 毫秒)。

更新 1:

还要尝试将波特率从 115200 降低到 9600。

于 2013-05-14T15:13:07.417 回答