SerialPort不使用长字符串写入数据 - 修复

时间:2013-05-14 15:07:45

标签: c# serial-port

我正在编写一个程序,将channel urlschannel names写入设备。我正在尝试编写长度为254的channel urls。更短的网址(我还没有找到阈值)可以正常工作。 更奇怪的是,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:这就是我设置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响应。

1 个答案:

答案 0 :(得分:-1)

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

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

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

更新1:

还尝试将BaudRate从115200降低到9600.