SerialPorts: отправлять в байтах или символах?

Я использую приложение последовательного порта, чтобы отправить команду с управляющими символами Unicode, и у меня нет успеха. Когда я отправляю одну и ту же команду в гипертерминале или в Putty, связь работает, поэтому мне любопытно, выдают ли эти две программы массив байтов или символов Unicode или даже строку. Если я имитирую то, что они делают, я могу иметь успех... Также я заметил, что свойство последовательного порта, которое я извлек из панели инструментов в Visual Studio, было указано как использование другого COM-порта, который я пишу в своем коде, поэтому я я не получаю ответа или мой код отменяет это? При проведении тестов с обратной связью я также получаю вывод правильной команды с управляющими символами, поэтому не могу понять, что я делаю неправильно. Это.NET 2.0 Framework FYI

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.Threading;

namespace SimpleSerial
{
    public partial class Form1 : Form
    {
        string RxString;
        public Form1()
        {
            InitializeComponent();
        }
        private void buttonStart_Click(object sender, EventArgs e)
        {
            serialPort1.PortName = "COM3";
            serialPort1.BaudRate = 9600;
            serialPort1.Parity = Parity.None;
            serialPort1.DataBits = 8;
            serialPort1.StopBits = StopBits.One;
            serialPort1.Handshake = Handshake.None;
            serialPort1.ReadTimeout = 500; 
            serialPort1.WriteTimeout = 500;
            serialPort1.Open();
            if (serialPort1.IsOpen)
            {
                buttonStart.Enabled = false;
                buttonStop.Enabled = true;
                textBox1.ReadOnly = false;
            }
        }
        const char STX = '\u0002';
        const char ETX = '\u0003';
        readonly string pull_shelf_104 = string.Format("{0}01P00104##{1}" , STX, ETX);
        private byte[] WrapString(string pull_shelf_104)
        {
            return System.Text.Encoding.ASCII.GetBytes(pull_shelf_104);
        }
        private void linkLabel_HC1_100_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            if (serialPort1.IsOpen)
            {
                byte[] data = WrapString(pull_shelf_104);
                serialPort1.Write(data, 0, data.Length);
            }
        }
        private void buttonStop_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
            {
                serialPort1.Close();
                buttonStart.Enabled = true;
                buttonStop.Enabled = false;
                textBox1.ReadOnly = true;
            }
        }
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (serialPort1.IsOpen) serialPort1.Close();
        }
        private void DisplayText(object sender, EventArgs e)
        {
            textBox1.AppendText(RxString);
        }
        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            RxString = serialPort1.ReadExisting();
            this.Invoke(new EventHandler(DisplayText));
        }
    }
}

1 ответ

Комментарии выше помогли мне решить проблему, спасибо за вашу помощь! Мне нужно было включить и RTS и DTS в моем коде, перечисление COM-портов не было проблемой, хотя я уверен, что это в некоторых случаях. Вот мой код для тех, у кого есть похожие проблемы.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.Threading;

namespace SimpleSerial
{
    public partial class Form1 : Form
    {
        string RxString;
        public Form1()
        {
            InitializeComponent();
        }
        private void buttonStart_Click(object sender, EventArgs e)
        {
            serialPort1.PortName = "COM3";
            serialPort1.BaudRate = 9600;
            serialPort1.Parity = Parity.None;
            serialPort1.DataBits = 8;
            serialPort1.StopBits = StopBits.One;
            serialPort1.Handshake = Handshake.None;
            serialPort1.RtsEnable = true;
            serialPort1.DtrEnable = true;
            serialPort1.ReadTimeout = 2000; 
            serialPort1.WriteTimeout = 2000;
            serialPort1.Open();
            if (serialPort1.IsOpen)
            {
                buttonStart.Enabled = false;
                buttonStop.Enabled = true;
                textBox1.ReadOnly = false;
            }
        }
        const char STX = '\u0002';
        const char ETX = '\u0003';
        readonly string pull_shelf_104 = string.Format("{0}01P00204##{1}" , STX, ETX);
        private byte[] WrapString(string pull_shelf_104)
        {
            return System.Text.Encoding.ASCII.GetBytes(pull_shelf_104);
        }
        private void linkLabel_HC1_100_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            if (serialPort1.IsOpen)
            {
                byte[] data = WrapString(pull_shelf_104);
                serialPort1.Write(data, 0, data.Length);
            }
        }
        private void buttonStop_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
            {
                serialPort1.Close();
                buttonStart.Enabled = true;
                buttonStop.Enabled = false;
                textBox1.ReadOnly = true;
            }
        }
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (serialPort1.IsOpen) serialPort1.Close();
        }
        private void DisplayText(object sender, EventArgs e)
        {
            textBox1.AppendText(RxString);
        }
        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            RxString = serialPort1.ReadExisting();
            this.Invoke(new EventHandler(DisplayText));
        }
    }
}
Другие вопросы по тегам