C# 用C语言重新组装串行消息#

C# 用C语言重新组装串行消息#,c#,serial-port,serial-communication,C#,Serial Port,Serial Communication,我对C#和串行通信的世界还不熟悉。在阅读了一些教程之后,我成功地实现了沟通。我问了另一个类似的问题,但我认为我问的问题不对。我按照上一个问题中给出的建议,稍微修改了代码,以便现在从我的微控制器发送一条串行消息,如下所示: Sxxxxxxx xxxxx xxxxESxxx sxxxxxxxxxxxxxxxxxxxxxxx x代表不同的数字、加号、减号和逗号。我发送的字符串长度将始终相同,并且始终以S开头,以E结尾(如果这不好,我可以更改它)。我遇到的问题是,当我尝试读取串行线时,一次只能获取部分

我对C#和串行通信的世界还不熟悉。在阅读了一些教程之后,我成功地实现了沟通。我问了另一个类似的问题,但我认为我问的问题不对。我按照上一个问题中给出的建议,稍微修改了代码,以便现在从我的微控制器发送一条串行消息,如下所示:

Sxxxxxxx
xxxxx
xxxxESxxx
sxxxxxxxxxxxxxxxxxxxxxxx

x代表不同的数字、加号、减号和逗号。我发送的字符串长度将始终相同,并且始终以S开头,以E结尾(如果这不好,我可以更改它)。我遇到的问题是,当我尝试读取串行线时,一次只能获取部分消息,因此类似于以下内容:

Sxxxxxxx
xxxxx
xxxxESxxx
我不断地从微控制器发送此信息,但只想在特定时间访问它,因此换句话说,我尝试编写一个函数,接收消息的所有部分,将其放回gether,然后从函数返回。问题是我现在不知道该怎么做

任何帮助都将不胜感激

这是我一直在玩的代码:

    SerialPort serialHC = new SerialPort(); // serial connection dealing with Hand Controller

     public string receiveCommandHC()
    {

        string messageHC = "";
        if (serialHC.IsOpen)
        {
            //serialHC.DiscardInBuffer();
            //messageHC = serialHC.ReadLine();
            messageHC = serialHC.ReadTo("*");
            //tempMsgHC = serialHC.ReadTo("*");
            //i = tempMsgHC.IndexOf("S");
            //tempMsgHC.Remove(0,i);
            //messageHC = tempMsgHC;

            //serialHC.Read(bufferHC = new byte[serialHC.BytesToRead], 0, serialHC.BytesToRead);
        }
        return messageHC;
我以前的邮件结尾是“*”

只是试着按照一个例子,这是我从中得到的。

这就是我要发送的内容(使用油灰检查)

当您收到数据时,似乎无法真正采取行动。你不一定有完整的信息。所以你需要缓冲你读到的内容,直到你检测到你有一个完整的消息

也许有更有效的方法可以做到这一点,但我对它们不太熟悉。所以这里有一个简单的算法来处理这个问题。它可以实现为一个简单的状态机

初始化:

  • 分配一个足够大的缓冲区,以容纳尽可能大的消息。这将在您读入传入数据时保留消息,直到您准备好处理它为止

  • 分配一个固定大小的缓冲区以将数据读入

  • 进入“等待消息”状态

  • 正在等待消息:

  • 阅读每个符号,直到找到“S”或到达消息的结尾
  • 如果发现“S”,则进入“正在阅读消息”状态
  • 如果未找到“S”,请等待下一条消息
  • 在留言中阅读:

  • 将数据中的每个符号复制到消息缓冲区中,直到找到“E”或到达消息末尾
  • 如果发现“E”,则计划要处理的消息缓冲区的内容,清除它并进入“等待消息”状态
  • 如果未找到“E”,请等待下一条消息

  • 下面是一些捕获算法本质的代码:

    enum ReadState { Waiting, Reading, Finished }
    static string ReadMessage(SerialPort port)
    {
        var messageBuffer = new StringBuilder("S");
        var state = ReadState.Waiting;
        while (state != ReadState.Finished)
        {
            switch (state)
            {
            case ReadState.Waiting:
                if (port.ReadChar() == 'S')
                {
                    state = ReadState.Reading;
                }
                break;
            case ReadState.Reading:
                messageBuffer.Append(port.ReadTo("E"));
                state = ReadState.Finished;
                break;
            }
        }
        return messageBuffer.ToString();
    }
    

    我最初是在一个更低级的层次上考虑这个问题的,
    SerialPort
    类似乎有一些方法可以使这个问题变得更简单。

    Hi,这是问题的一部分,我不知道如何解决它。到目前为止,我所拥有的一切都包括在问题中。谢谢你的回复!根据我的经验,你最好设置活动DataReceived@kenny谢谢你的提示,只是尝试了一下,当时仍然能收到一些零碎的信息。即使只使用msdn中的代码,你也可能想看看超级终端或其他什么东西的线路本身。我怀疑你的问题可能在微端。不,当我用Putty查看消息时,它每次都正确显示。(我会在显示我的超级终端的原始帖子中添加一个imageto)听起来正是我想要做的。作为一名机械工程师,我完全不知道如何做到这一点。。。帮忙?谢谢:)我可以提供一些伪代码,我实际上没有使用过
    SerialPort
    类,或者做过类似的通信,所以我不知道使用它的所有细节。您必须使用伪代码并将其转换为适当的调用。那就够了吗?实际上看起来比我想象的容易多了。看我的编辑。绝对漂亮的朋友!正如我在编辑前试过你在评论中所说的,我明白了。我的代码和你说的很像!谢谢你的帮助!!