2

我是串行通信的新手。我已经阅读了相当多的教程,并且我想做的大部分工作都在工作,但是我有一个关于与 C# 进行串行通信的问题。我有一个微控制器,它不断通过串行线发送数据。数据格式如下:bxxxxxx.xx,xx.xx* 其中 x 代表不同的数字,+ 或 - 符号。有时想从我的 PC 上的 C# 程序中读取此信息。我遇到的问题是,即使我使用的是 ReadTo("*"); 我认为这会读取所有内容,直到 * 字符。如何确保我收到的消息是完整的?

谢谢您的帮助。

    public string receiveCommandHC()
    {

        string messageHC = "";
        if (serialHC.IsOpen)
        {
            serialHC.DiscardInBuffer();
            messageHC = serialHC.ReadTo("*");

        }
        return messageHC;
    }
4

3 回答 3

3

我不确定你为什么要这样做,但是你在读取之前丢弃了串行端口缓冲区中的所有内容,所以如果计算机此时已经收到“bxxx”,你就把它扔掉然后你只会阅读“xixx.xx,xx.xx”。

于 2012-01-27T08:20:07.050 回答
1

我猜测你实际上得到了命令的结尾,即你得到的是(说)而不是得到b01234.56.78.9(省略最后) 。那是因为您丢弃了输入缓冲区。不要那样做。您无法知道当时的状态(就在读取之前),因此丢弃缓冲区是完全错误的。删除线。*.56.78.9serialHC.DiscardInBuffer();

于 2012-01-27T08:21:54.420 回答
1

您几乎总是会在串行通信中发现数据消息(除非非常小)被拆分。这主要取决于通信速度和从端口检索数据的点。

通常,您会将代码设置为在单独的线程中运行(以帮助防止影响其余代码的性能),这会在收到完整消息时引发事件,并且还会接收完整消息进行传输。读写功能由工作线程处理(串行通信流量很慢)。

您将需要一个读取和写入缓冲区。这些应该足够大以保存几个周期的数据。

将从输入读取的数据附加到读取缓冲区的末尾。从缓冲区的开头循环读取完整消息的读取缓冲区。

根据所使用的协议,通常有一个数据开始,可能还有一个数据结束指示符,以及某个地方的消息大小(这可能是固定的,再次取决于您的协议)。我从您的协议中收集消息开始字符是'b',消息结束字符是'*'。丢弃消息开始字符 ('b') 之前的所有数据,因为这是来自不完整的消息。

当找到一条完整的消息时,将其从缓冲区的前面剥离并引发一个事件以指示它的到达。

发送数据运行类似的过程,除了您可能需要拆分消息,因此要发送的数据附加到缓冲区的末尾,并且从头开始读取正在发送的数据。

我希望这可以帮助您了解如何处理串行通信。

正如 Marc 所指出的,您目前正在以一种会导致问题的方式清除缓冲区。

编辑

正如我在评论中所说,我不认识serialHC,但如果处理原始数据,请考虑使用SerialPort该类。有关如何使用它的更多信息和一个示例(大致使用我上面描述的过程)可以在这里找到。

于 2012-01-27T08:46:51.500 回答