C# 用C语言重新组装串行消息#
我对C#和串行通信的世界还不熟悉。在阅读了一些教程之后,我成功地实现了沟通。我问了另一个类似的问题,但我认为我问的问题不对。我按照上一个问题中给出的建议,稍微修改了代码,以便现在从我的微控制器发送一条串行消息,如下所示:C# 用C语言重新组装串行消息#,c#,serial-port,serial-communication,C#,Serial Port,Serial Communication,我对C#和串行通信的世界还不熟悉。在阅读了一些教程之后,我成功地实现了沟通。我问了另一个类似的问题,但我认为我问的问题不对。我按照上一个问题中给出的建议,稍微修改了代码,以便现在从我的微控制器发送一条串行消息,如下所示: Sxxxxxxx xxxxx xxxxESxxx sxxxxxxxxxxxxxxxxxxxxxxx x代表不同的数字、加号、减号和逗号。我发送的字符串长度将始终相同,并且始终以S开头,以E结尾(如果这不好,我可以更改它)。我遇到的问题是,当我尝试读取串行线时,一次只能获取部分
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;
我以前的邮件结尾是“*”
只是试着按照一个例子,这是我从中得到的。
这就是我要发送的内容(使用油灰检查)
当您收到数据时,似乎无法真正采取行动。你不一定有完整的信息。所以你需要缓冲你读到的内容,直到你检测到你有一个完整的消息 也许有更有效的方法可以做到这一点,但我对它们不太熟悉。所以这里有一个简单的算法来处理这个问题。它可以实现为一个简单的状态机 初始化:
下面是一些捕获算法本质的代码:
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
类,或者做过类似的通信,所以我不知道使用它的所有细节。您必须使用伪代码并将其转换为适当的调用。那就够了吗?实际上看起来比我想象的容易多了。看我的编辑。绝对漂亮的朋友!正如我在编辑前试过你在评论中所说的,我明白了。我的代码和你说的很像!谢谢你的帮助!!