C#SerialPort类接收到不正确的数据

C#SerialPort类接收到不正确的数据,c#,serial-port,C#,Serial Port,我目前有一个使用VB6代码制作的程序,该程序使用MSCOMM控件从串行端口提取数据。这成功地从我的串行端口接收数据,其中连接了Denso BHT-904B设备 我现在正试图将这段代码转移到C语言中,以便它与我正在开发的一款新软件相适应。为此,我使用SerialPort类。然而,问题是,当我打开端口时,仅当设备无法通信时(我猜测这是由于超时)才会触发数据接收事件。随后在事件中接收到的数据为'↑↑↑↑↑'. 我的SerialPort控件设置如下: DtrEnable=True PortName=C

我目前有一个使用VB6代码制作的程序,该程序使用MSCOMM控件从串行端口提取数据。这成功地从我的串行端口接收数据,其中连接了Denso BHT-904B设备

我现在正试图将这段代码转移到C语言中,以便它与我正在开发的一款新软件相适应。为此,我使用SerialPort类。然而,问题是,当我打开端口时,仅当设备无法通信时(我猜测这是由于超时)才会触发数据接收事件。随后在事件中接收到的数据为'↑↑↑↑↑'.

我的SerialPort控件设置如下:

  • DtrEnable=True
  • PortName=COM3
  • ReadBufferSize=1024
  • WriteBufferSize=512
我在表单控件后面使用的代码是:

namespace BHTTestingDotNet
{
public partial class Form1 : Form
{
    private string rxString;


    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var serialPort = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One);

        serialPort.DtrEnable = true;
        serialPort.Encoding = Encoding.Default;

        serialPort.DataReceived += serialPort_DataReceived;
        serialPort.ErrorReceived += serialPort_ErrorReceived;
        serialPort.Open();

    }

    private void serialPort_ErrorReceived(object sender, SerialErrorReceivedEventArgs e)
    {
        MessageBox.Show(e.ToString());
    }

    private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
        var serialPort = (SerialPort)sender;
        var test = serialPort.BytesToRead;
        SerialPort sr = (SerialPort)sender;
        rxString = sr.ReadExisting();
        this.BeginInvoke(new EventHandler(displayText));
    }

    private void displayText(object o, EventArgs e)
    {
        txtBHT.AppendText(rxString);
    }
}
}
我已经尝试将
RtsEnable
DtrEnable
设置为
true
,但没有任何区别

更新-我现在已更改设备上的协议设置,但我现在只接收管道和返回符号,例如:
|||||我经常使用SerialPort类,出于我的目的,我创建了自己的类

公共类SerialPortDataSource:SerialPort

其中SerialPort.DataReceived处理程序调用此方法:

private void SerialPortDataSource_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        try
        {
            if (BytesToRead > 0)
            {
                var buffor = new byte[BytesToRead];
                Read(buffor, 0, buffor.Length);
                _receivedBytes = buffor;
                //wConsole.WriteLine(ArrayExtension.ToString(buffor));
                var dataLogger = DataLogger;
                if (dataLogger != null)
                {
                    dataLogger.WriteLine("- DR - {0}", true, BitConverterExtension.ToHexString(buffor));
                }

                if (OnDataReceived != null)
                {
                    OnDataReceived(this, buffor);
                }
            }
        }
        catch (InvalidOperationException)
        {
            // sometimes DataReceived event is invoked after port is closed which causes InvalidOperationException
        }
    }

此方法适用于具有各种串行端口设置的许多应用程序。

您应该调用BeginInvoke,不要在每个按钮上分配事件。但是这里有太多的细节(设置)我们无法看到。@HenkHolterman感谢您的帮助。我目前只点击这个按钮一次,因为它只是一个小的测试应用程序,在我将代码移动到我的其他应用程序之前,我已经让它工作。是否有其他设置可以帮助您解决此问题?谢谢用代码创建端口,只设置您确定的属性。一次尝试1个。同时处理ErrorReceived事件。只需检查明显的内容。。。您的波特率、奇偶校验、停止位设置正确吗?如果它们是错误的,您经常会看到端口返回已损坏但一致的数据。另外,它可能值得使用一个简单的串行端口控制台进行一些测试(我在过去使用过RealTerm,它有点古怪但免费),它们也是串行端口嗅探器,可以准确地向您显示正在发生的事情,因此您可以看到工作的内容和新代码之间的差异(尽管没有遇到免费的嗅探器)。