C# - SerialPort接收不能一次获取所有数据

时间:2017-01-26 03:39:38

标签: c#

在串口方面,我有一种奇怪的困境。我正在向具有微控制器并获得响应的设备发送一堆命令。很典型的东西。无论如何,我遇到了一个问题,当我发送命令时,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

2 个答案:

答案 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);
}