gpt4 book ai didi

c# - 在 .NET 中使用 RS422 传输数据

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

我正在尝试制作一个简单的应用程序来测试与另一台计算机的 RS422 通信。使用RS232接口(interface)这个程序运行顺利,但是用RS422就不行了,因为有一台电脑不能发送。为了使场景更复杂一点,我可以使用 super 终端通过 RS422 进行通信。

代码如下:

public partial class MainForm : Form
{
private SerialPort m_port;

public MainForm()
{
InitializeComponent();
m_list.Items.AddRange(SerialPort.GetPortNames());

m_port = new SerialPort();
m_port.BaudRate = 9600;
m_port.DataBits = 8;
m_port.Parity = Parity.None;
m_port.StopBits = StopBits.One;
m_port.Handshake = Handshake.None;
m_port.Encoding = new ASCIIEncoding();

m_port.ReceivedBytesThreshold = 1;
m_port.DataReceived += DataReceivedEvent;
}

~MainForm()
{
if (m_port != null)
m_port.Close();
}

private void openClick(object sender, EventArgs e)
{
m_port.Close();
m_port.PortName = (string)m_list.SelectedItem;

try
{
m_port.Open();
m_buttonSend.Enabled = true;
}
catch (UnauthorizedAccessException ex)
{
MessageBox.Show(ex.Message);
}
}

private void ButtonSendClick(object sender, EventArgs e)
{
m_port.WriteLine(m_testBox.Text);
}

private void DataReceivedEvent(object sender, SerialDataReceivedEventArgs args)
{
Invoke(new EventHandler(DoUpdate));
}

private void DoUpdate(object s, EventArgs e)
{
m_receivedText.Text += m_port.ReadLine();
}
}

感谢任何有关此技术的帮助或经验。谢谢!

编辑

跟踪与Portmon之间有很多差异 super 终端和 .NET 组件。其中一行引起了我的注意,因为它涉及端口中断的等待掩码 IOCTL_SERIAL_SET_WAIT_MASK

使用 super 终端:

IOCTL_SERIAL_SET_WAIT_MASK  Serial0  SUCCESS  Mask: RLSD ERR

使用 .NET SerialPort 组件

IOCTL_SERIAL_SET_WAIT_MASK  Serial0  SUCCESS  Mask: RXCHAR RXFLAG CTS DSR RLSD BRK ERR RING     

有人知道如何从组件更改掩码吗?这越来越深了......

最佳答案

最后在初始化中出现了一个问题,另一个是阻塞 ReadLine 调用。必须启用 RTS 和 DTS。

这是代码

using System;
using System.IO.Ports;
using System.Text;
using System.Windows.Forms;

namespace ComPlay
{
public partial class MainForm : Form
{
private SerialPort m_port;
private byte [] m_buffer = new byte[10];

public MainForm()
{
InitializeComponent();
m_list.Items.AddRange(SerialPort.GetPortNames());
m_list.SelectedIndex = 0;

m_port = new SerialPort(SerialPort.GetPortNames()[0],9600,Parity.None,8,StopBits.One);
m_port.Handshake = Handshake.None;
m_port.RtsEnable = true;
m_port.DtrEnable = true;

m_port.DataReceived += DataReceivedEvent;
m_port.PinChanged += PinChangedEvent;
}

~MainForm()
{
if (m_port != null)
m_port.Close();
}

private void openClick(object sender, EventArgs e)
{
if (m_port.IsOpen)
m_port.Close();

m_port.PortName = (string)m_list.SelectedItem;

try
{
m_port.Open();
m_buttonSend.Enabled = true;
}
catch (UnauthorizedAccessException ex)
{
MessageBox.Show(ex.Message);
}
}

private void ButtonSendClick(object sender, EventArgs e)
{
byte [] r_bytes = Encoding.ASCII.GetBytes(m_testBox.Text);
m_port.Write(r_bytes,0,r_bytes.Length);
}

private void DataReceivedEvent(object sender, SerialDataReceivedEventArgs args)
{
Invoke(new EventHandler(DoUpdate));
}

private void DoUpdate(object s, EventArgs e)
{
m_port.Read(m_buffer, 0, m_buffer.Length);
m_receivedText.Text += Encoding.ASCII.GetString(m_buffer);
}

private void PinChangedEvent(object sender, SerialPinChangedEventArgs args)
{

}
}
}

开始传播最重要的是改变这个

IOCTL_SERIAL_SET_HANDFLOW Serial1 成功 Shake:80000000 Replace:80000040 XonLimit:1024 XoffLimit:1024

对此

IOCTL_SERIAL_SET_HANDFLOW Serial1 SUCCESS Shake:80000001 Replace:80000040 XonLimit:1024 XoffLimit:1024

激活 RTS 和 DTR。

关于c# - 在 .NET 中使用 RS422 传输数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2147670/

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