【问题标题】:C# SerialPort class receives incorrect dataC# SerialPort 类接收到不正确的数据
【发布时间】:2016-03-11 10:08:41
【问题描述】:

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

我现在正在尝试将此代码移至 C#,以便它适合我正在开发的新软件。为此,我正在使用 SerialPort 类。但是,问题是当我打开端口时,接收到的数据事件仅在设备无法通信时触发(我猜这是由于超时)。然后在事件中收到的数据是'↑↑↑↑↑'。

我的 SerialPort 控制设置如下:

  • DtrEnable = 真
  • 端口名称 = 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);
    }
}
}

我已经尝试将RtsEnableDtrEnable 都设置为true,但这没有任何区别。

更新 - 我现在更改了设备上的协议设置,但我现在只接收管道,然后是返回符号,例如: |||||¬

【问题讨论】:

  • 您应该调用 BeginInvoke ,并且不要在每次按钮点击时分配事件。但是这里有太多细节(设置)我们看不到。
  • @HenkHolterman 感谢您的帮助。我目前只单击此按钮一次,因为它只是一个小测试应用程序,我在将代码移动到我的其他应用程序之前让它工作。我可以为您提供任何其他设置来帮助解决问题吗?谢谢
  • 在代码中创建端口并只设置您确定的属性。一次试验 1 个。
  • 同时处理 ErrorReceived 事件。
  • 只是检查明显的东西......你已经得到了波特率,奇偶校验,停止位设置对吗?如果它们是错误的,您经常会看到从端口返回的数据已损坏但一致。此外,它可能值得用一个简单的串口控制台进行一些测试(我过去使用过 RealTerm,它有点古怪但免费),它们也是串口嗅探器,可以准确地告诉你发生了什么,所以你可以看到什么工作和你的新代码之间的区别(虽然没有遇到免费的嗅探器)。

标签: c# serial-port


【解决方案1】:

我经常使用 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
        }
    }

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

【讨论】:

    猜你喜欢
    • 2020-09-13
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多