我正在编写一个程序,将channel urls
和channel 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响应。
答案 0 :(得分:-1)
这取决于您正在使用的设备。如果你向它发送了太多字节,那么它有可能无法全部处理它们。
您可以尝试将等待时间从1000毫秒减少到例如200毫秒。
您也可以尝试发送数据包...例如,将长字符串发送到50个字符的包中,等待它们之间的一段时间(例如,100毫秒)。
更新1:
还尝试将BaudRate从115200降低到9600.