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