在串口方面,我有一种奇怪的困境。我正在向具有微控制器并获得响应的设备发送一堆命令。很典型的东西。无论如何,我遇到了一个问题,当我发送命令时,DataReceived事件处理程序确实响应,但问题是我没有从中获取所有数据。结果,DataReceived事件处理程序最终被调用4次。
所以不要得到这样的东西:
geog
代码最终会像这样(不完全相反,只是举个例子):
0 - 2:16:38 PM: 126 23 100 69 0 0 99 3 225 2 203 2 174 2 179 2 125 93 3 15 3
0 0 0 15 255 0 214 12 105 15 33 15 33 15 13 15 54 15 39 5 68 4 197 5 199 5 57
5 0 0 0 134 225
1 - 2:16:38 PM: 126 23 100 69 0 0 99 3 226 2 203 2 174 2 179 2 125 93 3 16 3
0 0 0 15 255 0 224 12 105 15 23 15 33 15 2 15 74 15 39 5 58 4 197 5 198 5 57
5 0 0 0 65 163
2 - 2:16:38 PM: 126 23 100 69 0 0 99 3 226 2 202 2 174 2 178 2 125 93 3 15 3
0 0 0 15 255 0 214 12 95 15 23 15 33 15 23 15 105 15 39 5 58 4 197 5 198 5 57
5 0 0 0 63 128
第一条数据线需要4个事件调用,而不是1.我假设微控制器仍在发送数据,因为我一次性发送所有写入数据。但我希望有一种方法可以控制它,所以我不会得到所有这些事件调用(因为我更喜欢将字节数组放在一个单独的数组而不是块中)。
这一切都是由Visual Studio 2010编写的,但如果需要的话,我可以抓住2013。下面是我用来获得类似于上面结果的示例代码(我知道文件streamwriter在使用时没有关闭,但我只是使用主代码作为示例):
0 - 2:16:38 PM: 126 23 100 69 0 0 99 3 225 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 - 2:16:38 PM: 2 203 2 174 2 179 2 125 93 3 15 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 - 2:16:38 PM: 15 255 0 214 12 105 15 33 15 33 15 13 15 54 0 0 0 0 0 0 0 0 0
0 - 2:16:38 PM: 15 39 5 68 4 197 5 199 5 57 5 0 0 0 134 225 0 0 0 0 0 0 0 0 0
答案 0 :(得分:1)
如果您知道可以重复调用Read
的固定消息长度,直到您已读取所有字节以填充byte[]
,那么将多个读取调用组合到单个“消息”中是您的责任。然后你将该数组传递给其他函数。
const int MessageSize = 256;
byte[] test = new byte[MessageSize];
int offset = 0;
static void SerialPortDataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort port = (SerialPort)sender;
try
{
offset += port.Read(test, offset, MessageSize - offset);
if(offset == MessageSize)
{
string data2 = "";
for (int i = 0; i < 60; i++)
{
data2 += test[i] + " ";
}
string writeOut = count + " - " + DateTime.Now.ToString("h:mm:ss tt") + ": " + data2;
Console.WriteLine(writeOut);
file.WriteLine(writeOut);
count++;
offset = 0;
}
}
catch (Exception ex)
{
Console.WriteLine(ex.StackTrace);
}
}
答案 1 :(得分:0)
试试这个:
List<byte> dataBuffer = new List<byte>();
byte[] tempBuff;
var bytesReaded = pt.Read(inBuff, 0, inBuffSize);
while (bytesReaded > 0)
{
tempBuff = new byte[bytesReaded];
Array.Copy(inBuff, tempBuff, bytesReaded);
dataBuffer.AddRange(tempBuff);
bytesReaded = pt.Read(inBuff, 0, inBuffSize);
}