gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:47:24 25 4
gpt4 key购买 nike

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

我现在正尝试将此代码移至 C#,以便它适合我正在开发的新软件。为此,我正在使用 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 但这没有任何区别。

更新 - 我现在已经更改了设备上的协议(protocol)设置,但我现在只接收管道和返回符号,例如:|||||¬

最佳答案

我经常使用 SerialPort 类,为了我的目的,我创建了自己的类

公共(public)类 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
}
}

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

关于C# SerialPort 类接收到不正确的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35937313/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com