我想弄清楚是否有比我現在要做的更有效的方式來建立一個串口上進來的消息並驗證它是正確的信息,然後再解析它。一條完整的消息以$開頭,以CR/LF結尾。我使用事件處理程序來獲取字符,因爲它們顯示在串口上,因此消息不一定會作爲一個完整的塊顯示。只是爲了混淆事物,串行端口上有許多其他消息不一定以$開頭或以CR/LF結尾。我想看到那些但不解析它們。我知道連接字符串可能不是一個好主意,所以我使用StringBuilder來構建消息,然後使用幾個.ToString()調用來確保我有正確的消息來解析。 .ToString調用是否會產生很多垃圾?有沒有更好的辦法?尋找一種有效的方法來構建和解析沒有GC的字符串
我不是一個特別有經驗的程序員,所以感謝您的幫助。
private void SetText(string text)
{
//This is the original approach
//this.rtbIncoming.Text += text;
//First post the raw data to the console rtb
rtbIncoming.AppendText(text);
//Now clean up the text and only post messages to the CPFMessages rtb that start with a $ and end with a LF
incomingMessage.Append(text);
//Make sure the message starts with a $
int stxIndex = incomingMessage.ToString().IndexOf('$');
if (stxIndex == 0)
{ }
else
{
if (stxIndex > 0)
incomingMessage.Remove(0, stxIndex);
}
//If the message is terminated with a LF: 1) post it to the CPFMessage textbox,
// 2) remove it from incomingMessage,
// 3) parse and display fields
int etxIndex = incomingMessage.ToString().IndexOf('\n');
if (etxIndex >= 0)
{
rtbCPFMessages.AppendText(incomingMessage.ToString(0, etxIndex));
incomingMessage.Remove(0, etxIndex);
parseCPFMessage();
}
}
當您使用串行端口(不是最快的設備)並且處理「小」字符串時,請不要擔心垃圾收集。在分配/處理大內存塊時會出現一些GC問題,但情況並非如此 – Graffito