从串口读取字符串并存储到2个不同的数组

时间:2015-09-09 00:04:28

标签: c# arrays serial-port

我正在制作键盘项目。第一个用户输入是一个10位数的ID。然后按6位密码。我一直在考虑如何在从串口接收输入时将两个输入分配到不同的阵列。这是我到目前为止的尝试。

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    char[] id = new char[11];
    char[] pass = new char[7];
    int length;

    try
    {
        serialPort1.ReadTimeout = 100;
        do
        {
            length = serialPort1.Read(id, 0, 11);
        } while (length > 0);
    }
    catch (TimeoutException) { MessageBox.Show(id.ToString()); }

    try
    {
        serialPort1.ReadTimeout = 100;
        do
        {
            length = serialPort1.Read(pass, 0, 7);
        } while (length > 0);
    }
    catch (TimeoutException) { MessageBox.Show(pass.ToString()); }
}

调试后,问题是:

  1. MessageBox.Show()只会显示空的char数组。
  2. 数组可能没有任何内容。
  3. 使用ReadTimeout,用户需要在给定时间内按下键盘,这在设计上并不灵活。
  4. 真的欢迎任何帮助或提示。提前致谢。如果你这么做,我不介意从头开始构建。

2 个答案:

答案 0 :(得分:3)

我的建议是:

  • 在第一行解开事件DataReceived 来自serialPort1_DataReceived对象
  • 的方法serialPort1 {li>对于id char数组,缩小为10而不是11,因为您正在读取10位数字
  • 同样适用于pass char数组,将其缩减为6

建议代码:

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    // unhook event
    serialPort1.DataReceived -= serialPort1_DataReceived;

    char[] id = new char[10];
    char[] pass = new char[6];

    try
    {
        // send unique start bit from connected serial port device to indicate begin of transmission
        byte ack = serialPort1.ReadByte();
        while (ack != 0xC0)
        {
            ack = serialPort1.ReadByte(); // <- continuously read from serial port until start bit is found
        }

        // try to increase timeout as 100 ms is too fast
        serialPort1.ReadTimeout = 1000;
        for (int i = 0; i < 10; i++)
        {
            id[i] = (char)serialPort1.ReadByte();
        }
    }
    catch (TimeoutException) { MessageBox.Show(id.ToString()); }

    try
    {
        // send unique start bit from connected serial port device to indicate begin of transmission
        byte ack = serialPort1.ReadByte();
        while (ack != 0xC0)
        {
            ack = serialPort1.ReadByte(); // <- continuously read from serial port until start bit is found
        }

        // try to increase timeout as 100 ms is too fast
        serialPort1.ReadTimeout = 1000;
        for (int i = 0; i < 6; i++)
        {
            pass[i] = (char)serialPort1.ReadByte();
        }
    }
    catch (TimeoutException) { MessageBox.Show(pass.ToString()); }

    // rehook event
    serialPort1.DataReceived += serialPort1_DataReceived;
}

答案 1 :(得分:2)

这是出错的地方

id

代码意味着尝试将11字节读入id,然后返回实际读取的字节数。因此,如果有100个字节可用,则长度为11.如果只有5个字节可供读取,则长度将为5.因为长度> 1。 0,它再次循环尝试再次读取11个字节,直到它什么都不读。当您将数据读入同一阵列时,后续读取将覆盖上一次读取中的数据。

相同
4