C#串口在重载时随机返回全0

时间:2017-11-28 10:15:36

标签: c# winforms uart

我正在为一个项目制作C#用户界面,使用MCU通过UART与PC通信。以这种格式从MCU发送的字符串(每组3个数字,3组):

<number>,<number>,<number>,.<number>,<number>,<number>,.<number>,<number>,<number>,.\n

每个号码都可以根据MCU发送而改变。我编写了一个适用于此配置的程序。通常,它将来自COM端口的数据作为字符串接收,过滤掉任何不是数字的字符,然后将它们单独保存到List中。

但是,当我们将格式扩展为每组使用7个数字时(总共21个):

<number>,<number>,<number>,<number>,<number>,<number>,<number>,.<number>,<number>,<number>,<number>,<number>,<number>,<number>,.<number>,<number>,<number>,<number>,<number>,<number>,<number>,.\n

当我尝试相同的方法时,会出现某种错误的错误。在数据中。当数据稳定时,它很好。当进入的数量发生任何快速变化时,数据图如下所示: enter image description here 图表中间的急剧下降并不是数据的变化; UART端口只是&#34;冻结&#34;并且在接收列表中为所有号码输出0,我已经自己检查了Hercules的数据。 我认为问题来自重载,因为3和7数字数据流之间的任何其他方面没有差异,但StackOverflow用户可以想到任何其他解决方案吗? 编辑:它应该有帮助,这是我使用的代码:

// Initialization
static SerialPort mySerialPort;
string receiveMessage = "";
public delegate void AddDataDelegate(string text);
public AddDataDelegate DELEGATE_WRITE;
DELEGATE_WRITE = new AddDataDelegate(writeConsole);
// com and baud are defined variables
mySerialPort = new SerialPort(com, baud);
mySerialPort.DataReceived += new SerialDataReceivedEventHandler(mySerialPort_datareceived);
mySerialPort.Open();

//Supporting functions
private void mySerialPort_datareceived(object sender, SerialDataReceivedEventArgs e)
{
    string input = mySerialPort.ReadExisting();
    textBox.BeginInvoke(method: DELEGATE_WRITE, args: new Object[] { input });
}

public void writeConsole(string text)
{
    receiveMessage += text;
    // check if the receiving data steam is valid: end with '\n' and not longer than 64 characters (21 value of maybe 2-3 digits each)
    if (receiveMessage.Length > 64)
    {
        receiveMessage = "";
    }
    if (receiveMessage.Length > 0)
        if (receiveMessage[receiveMessage.Length - 1] == '\n')
        {
            updateInterface(receiveMessage);
            receiveMessage = "";
        }
    return;
}

void updateInterface(string input)
{
    try
    {
        int[] result = calculate(input);
        if (result == null)
        {
            MessageBox.Show("Error", caption: "Algorithm fail to extract data", buttons: MessageBoxButtons.OK, icon: MessageBoxIcon.Error);
                return;
        }
//Save the data to List
}

static int[] calculate(string input)
{
    int[] outputs = new int[21];
    int index = 0;
    string s = "";
    for (int i = 0; i < input.Length; i++)
    {
        char c = input[i];
        if (c == '.')
        {
            int output = int.Parse(s);
            outputs[index] = output;
            index++;
            s = "";
        }
        else if (c >= '0' && c <= '9'|| c == '-')
        {
            s += c;
        }
     }
     return outputs;
  }

1 个答案:

答案 0 :(得分:0)

魔鬼总是在细节中
在我的代码的writeConsole函数中,我通过检查它们是否以'\ n'结尾(因为数据将实时进入)以及它们是否小于64个字符长(可能是21个值)来检查有效字符串每个2-3位)。事实证明,当数据变得足够快时数据很容易达到两倍时,这根本不是一个正确的假设(在我的例子中,变化可能达到100)。所以只需删除长度检查和程序正常工作。

PS:来吧,这是我第二次回答我自己的问题