簡體   English   中英

C# SerialPort 類接收到不正確的數據

[英]C# SerialPort class receives incorrect data

我目前有一個使用 VB6 代碼制作的程序,該程序使用 MSCOMM 控件從串行端口拉回數據。 這設法從我的串行端口成功接收數據,其中連接了 Denso BHT-904B 設備。

我現在正在嘗試將此代碼移至 C#,以便它適合我正在開發的新軟件。 為此,我使用了 SerialPort 類。 但是,問題是當我打開端口時,數據接收事件僅在設備無法通信時觸發(我猜這是由於超時)。 然后在事件中接收到的數據是'↑↑↑↑↑'。

我的 SerialPort 控制設置如下:

  • DtrEnable = 真
  • 端口名稱 = COM3
  • 讀取緩沖區大小 = 1024
  • 寫入緩沖區大小 = 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但這沒有任何區別。

更新 - 我現在已更改為設備上的協議設置,但我現在只接收管道和返回符號,例如: |||||¬

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

這種方法在許多具有各種串行端口設置的應用程序中對我有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM