C# 从串行端口读取-出现问号而不是值

C# 从串行端口读取-出现问号而不是值,c#,serial-port,C#,Serial Port,我目前正在将一个旧的vbs应用程序转换为c#应用程序,以便提供更多功能。此应用程序的目的是扫描身份证并从中提取身份证。然后,我可以通过CSV文件将数据导入门禁系统 现在我的问题来了。当我使用vb应用程序通过COM端口扫描卡时,其值为: 3E8783D0 我看这是正确的。然而,当我开始在c#中使用我的新程序并扫描条形码时,我得到以下输出: 2??E878 所以我可以看到卡片正在扫描。但代码的一部分用问号填充 我已经研究过改变波特率等,这是我能得到的最接近有意义的数据。COM端口的设置与旧的VB程序

我目前正在将一个旧的vbs应用程序转换为c#应用程序,以便提供更多功能。此应用程序的目的是扫描身份证并从中提取身份证。然后,我可以通过CSV文件将数据导入门禁系统

现在我的问题来了。当我使用vb应用程序通过COM端口扫描卡时,其值为:

3E8783D0

我看这是正确的。然而,当我开始在c#中使用我的新程序并扫描条形码时,我得到以下输出:

2??E878

所以我可以看到卡片正在扫描。但代码的一部分用问号填充

我已经研究过改变波特率等,这是我能得到的最接近有意义的数据。COM端口的设置与旧的VB程序相同,所以我不会认为这不应该是一个问题

我使用的编码如下所示。有人能解释为什么会出现问号吗?我错过了什么明显的东西吗?我正在使用的表单中有一个文本按钮和一个启动/停止按钮,用于准备从接近传感器输入的设备

    public Form1()
    {
        InitializeComponent();
    }

    private void buttonStart_Click(object sender, EventArgs e)
    {
        serialPort1.PortName = "COM1";
        serialPort1.BaudRate = 4800;
        serialPort1.Parity = System.IO.Ports.Parity.None;
        serialPort1.DtrEnable = true;
        serialPort1.RtsEnable = false;
        serialPort1.ReadTimeout = 500;
        serialPort1.WriteTimeout = 500;
        serialPort1.Open();
        if (serialPort1.IsOpen)
        {
            buttonStart.Enabled = false;
            buttonStop.Enabled = true;
            textBox1.ReadOnly = false;
        }
    }

    private void buttonStop_Click(object sender, EventArgs e)
    {
        if (serialPort1.IsOpen)
        {
            serialPort1.Close();
            buttonStart.Enabled = true;
            buttonStop.Enabled = false;
            textBox1.ReadOnly = true;
        }
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (serialPort1.IsOpen) serialPort1.Close();
    }

    private void DisplayText(object sender, EventArgs e)
    {
        textBox1.AppendText("!");
        textBox1.AppendText(RxString);
    }

    private string ExtractPACID(string s)
    {
        return s.ToString() + "";
    }

    private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
        RxString = serialPort1.ReadExisting();
        this.Invoke(new EventHandler(DisplayText));
    }

您没有配置数据位或停止位。您也在设置DTR,但尚未配置握手-您的设备是否需要硬件握手?你能从VB程序中显示完整的配置吗?您正在连接到哪个设备?原始VB程序设置为:端口=COM1波特=4800奇偶校验=N数据位=7停止位=1。我曾尝试将数据位和停止位添加到我的代码中,但当我这样做时,我会在扫描身份证时得到返回数据“I7WN7a6Gl”,因此我认为我会删除它,因为我认为上面的解决方案只有问号,并且更接近我需要的结果。我正在连接一个“PAC智能卡读卡器40192”。原始代码没有握手,所以我省略了这个。很抱歉听起来很愚蠢,因为你知道这不是我知识最渊博的主题,任何帮助都会得到很大的帮助3E8783D0也可以是4字节的值,以十六进制表示法显示。在这种情况下,使用ReadExisting()是错误的,并且会生成问号,因为像87和D0这样的值不是ASCII码。然后需要使用Read()。@HansPassant谢谢您的输入。问题现在解决了。我需要读取十六进制数据。使用-波特率:4800;数据位:7;平价:无;停止位:1;将其转换为字节后,将显示正确的值。@PhilC Challinor先生,请在回答中填写此解决方案,并将其标记为已接受,以允许其他社区成员使用此帖子。