Я пытаюсь создать простое приложение для проверки связи RS422 с другим компьютером. Используя интерфейсы RS232, эта программа работает без сбоев, но с RS422 не работает, так как есть один компьютер, который не может отправить. Чтобы немного усложнить сценарий, я могу общаться через RS422 с помощью HyperTerminal.
Вот код:
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();
}
}
Любая помощь или опыт с этой технологией приветствуется. Спасибо!
EDIT
Существует много различий между трассировкой с Portmon Гипертерминала и компонентом .NET. Одна из линий привлекла мое внимание, так как она относится к маске ожидания прерывания порта IOCTL_SERIAL_SET_WAIT_MASK
.
С HyperTerminal:
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
Кто-нибудь знает, как сменить маску с компонента? Это становится глубже ...