我有这个代码,它通过串口发送数据,带有一个带有数据长度的简单头。
public void WriteToPort(string message)
{
byte[] messageBytes = System.Text.Encoding.UTF8.GetBytes(message);
int length = messageBytes.Length;
byte b0 = (byte)((length >> 24) & 0xFF);
byte b1 = (byte)((length >> 16) & 0xFF);
byte b2 = (byte)((length >> 8) & 0xFF);
byte b3 = (byte)((length >> 0) & 0xFF);
List<byte> bytes = new List<byte>() { b0, b1, b2, b3};
bytes.AddRange(messageBytes);
if (serialPort != null && !serialPort.IsOpen)
{
serialPort.Open();
}
serialPort.Write(bytes.ToArray(), 0, bytes.Count);
}
我使用此代码将数据从桌面应用程序发送到连接到串行端口的设备。
此代码运行正常,将数据发送到我的设备而没有任何问题。当我们在设备上集成一些其他应用程序时,问题就开始了,这使得它显着变慢。这是预期的,它根本不会影响沟通。
之后,我的桌面应用程序似乎发送了所有数据,但设备只收到8KB的数据。我们尝试使用RealTerm发送相同的数据并且它有效,所以问题可能出在这段代码上。
你知道为什么会这样吗?
编辑:抱歉,我忘了提到我已经尝试过以小块发送数据但它没有用。
答案 0 :(得分:0)
试试这个:
public void WriteToPort(string message)
{
// Throw exception if serialPort is not initialised.
// Old code would have thrown from serialPort.Write
if (serialPort == null) throw new InvalidOperationException();
// Convert message to bytes
byte[] messageBytes = System.Text.Encoding.UTF8.GetBytes(message);
// Convert message length to bytes
byte[] lengthBytes = BitConverter.GetBytes(messageBytes.Length);
// Convert message length bytes to big endian if needed
if (BitConverter.IsLittleEndian) Array.Reverse(lengthBytes);
// Open serial port if needed
if (!serialPort.IsOpen) serialPort.Open();
// Write length
serialPort.Write(lengthBytes, 0, lengthBytes.Length);
// Write message
serialPort.Write(messageBytes, 0, messageBytes.Length);
}
还有要检查的事项: