Member 13924847 Ответов: 3

Последовательный порт Ascii C#


Я разрабатываю инструмент настройки на языке C#. Я новичок в C#.Я использую winforms для своего приложения.
У меня есть последовательно подключенное устройство, которое отправляет ответ на определенную команду ascii. До сих пор я могу создавать и открывать порт, способный получить ответ по умолчанию в списке. Но я не могу писать в последовательном устройстве в ascii. Я попробовал посмотреть на пост "как я могу написать ascii в последовательном порту", но еще больше запутался.
Может ли кто-нибудь помочь в облегчении синтаксиса или процесса.

Пример: одна из команд - "SMS0", это 4-байтовая команда с 0 в конце.

Любая помощь будет оценена по достоинству.

Что я уже пробовал:

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

namespace SerialGW
{
    public partial class Form1 : Form
    {
 
        //string command;
        public Form1()
        {
            InitializeComponent();
            getAvailablrPorts();
            

        }
        
        void getAvailablrPorts()
        {

            String[] ports = SerialPort.GetPortNames();
            comboBox1.Items.AddRange(ports);

        }
        private void label1_Click(object sender, EventArgs e)
        {
            
        }

        private void progressBar1_Click(object sender, EventArgs e)
        {

        }

        private void button3_Click(object sender, EventArgs e)
        {
            try
            {
                if (comboBox1.Text == "" || comboBox2.Text == "")
                {
                    textBox2.Text = "Please select port settings";
                }
                else
                {
                   
                    serialPort1.PortName = comboBox1.Text;
                    serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text);

                    serialPort1.Open();

                    progressBar1.Value = 100;
                    button1.Enabled = true;
                    button2.Enabled = true;
                    textBox1.Enabled = true;
                    button3.Enabled = false;
                    button4.Enabled = true;

                }
            }

            catch(UnauthorizedAccessException)
            {
                textBox2.Text = "Unauthorised access";
            }

        }

        private void button4_Click(object sender, EventArgs e)
        {

            serialPort1.Close();
            progressBar1.Value = 0;

            button1.Enabled = false;
            button2.Enabled = false;
            button4.Enabled = false;
            button3.Enabled = true;
            textBox1.Enabled = false;
        }

        private void button1_Click(object sender, EventArgs e)
        {

            serialPort1.WriteLine(textBox1.Text);
        
        }

        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
               
                //textBox2.Text = serialPort1.ReadExisting();
                listBox1.Items.Add(serialPort1.ReadExisting());
                //textBox2.Text = serialPort1.ReadLine();     It hangs when we use ReadLines()


            }
            catch (TimeoutException)
            {
                textBox2.Text = "Timeout Exception";
            }
        }

3 Ответов

Рейтинг:
2

Richard MacCutchan

Используйте класс Encoding для преобразования строки в ASCII байты: Кодирование.Метод GetBytes (String) (System.Text)[^].


Рейтинг:
1

James_Parsons

Я бы проконсультировался с документацией для любого устройства, которое у вас есть, и убедился, что команда отправлена правильно. Даже если SerialPort если вы пишете в ASCII по умолчанию, вам нужно убедиться, что все необходимые управляющие символы и окончания строк отправлены правильно. Как отмечалось в предыдущем решении, вы можете использовать Encoding класс, чтобы убедиться, что ваша кодировка правильна.


Рейтинг:
1

Anthony Carson

using System.IO.Ports;

namespace ArduinoWireless
{
    
    public partial class Form1 : Form
    {
        string dataIN;
        string dataIN2;
        public Form1()
        {
            InitializeComponent();
        }
       private void Form1_Load(object sender, EventArgs e)
        {
            timer1.Start();
            string[] ports = SerialPort.GetPortNames();
            cbCom1.Items.AddRange(ports);
        }
        private void btnWrite2Port_Click(object sender, EventArgs e)
        {
            try
            {
                if (serialPort1.IsOpen)
                {
                    serialPort1.WriteLine(tbDataOut1.Text + Environment.NewLine);
                    tbReceiveData1.Clear();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Message", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
      private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
                dataIN1 = serialPort1.ReadExisting();
                this.Invoke(new EventHandler(ShowData));
        }
        private void ShowData(object sender, EventArgs e)
        {
            int dataINLength = dataIN1.Length;
            lblDataInLength.Text = string.Format("{0:00}", dataINLength);
            if (cbAlwaysUpdate.Checked)
            {
                tbReceiveData1.Text = "";
                tbReceiveData1.Text = dataIN1;
                string s = serialPort1.ReadExisting();
                if  (s.Contains("1234"))
                {
                    tbReceiveData1.Text = s.ToString();
                }
                if (s.Contains("4321"))
                {
                    tbReceiveData1.Text = s.ToString();
                }
                else
                {

                }
            }
          
        }
        private void tbReceiveData1_TextChanged(object sender, EventArgs e)
        {
            if (tbReceiveData1.Text == "1234\r\n") // incoming data event
            {
                MessageBox.Show("1234 entered port");// replace with what you want your incoming data to do.
            }
            if (tbReceiveData1.Text == "4321\r\n")
            {
                MessageBox.Show("4321 entered port"); // replace with what you want your incoming data to do.
            }

        }
    }
}