串口不写入长字符串数据-修正

本文关键字:数据 修正 字符串 串口 | 更新日期: 2023-09-27 18:13:24

我正在编写一个将channel urlschannel names写入设备的程序。我试着写长度为254的channel urls。较短的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");
                }
            }

将写入调试行,而字符串不通过编译器写入。

我的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:这是我如何设置我的serialport:

                    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响应。

串口不写入长字符串数据-修正

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

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

你也可以尝试发送数据包…例如,将长字符串以50个字符的包为单位发送,在它们之间等待一定的时间(例如,100毫秒)。

更新1:

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