Последовательный порт RS232 c # win7 .net framework 3.5 sp1 - PullRequest
6 голосов
/ 24 февраля 2011

HI Я новый в C # последовательный порт. я пишу на C # работает программа winXP и win7, чтобы сохранить полученные данные от последовательного порта, когда машине были отправлены данные.

using System.IO;
using System.IO.Ports;
using System.Threading;


namespace RS232RVR
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        SettingRS232();
    }

    public void SettingRS232 ()
    {
        try
        {
            SerialPort mySerialPort = new SerialPort("COM6");

            mySerialPort.BaudRate = 9600;
            mySerialPort.Parity = Parity.None;
            mySerialPort.StopBits = StopBits.One;
            mySerialPort.DataBits = 8;
            mySerialPort.Handshake = Handshake.None; //send to hardware flow control.

            mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceviedHandler);

            mySerialPort.Open();


            richTextBox1.Text = "on";

            mySerialPort.Close();
        }
        catch (Exception ex)
        {
            richTextBox1.Text = ex.Message;    
        }

    }

    private void DataReceviedHandler(
                    object sender,
                    SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;
        string indata = sp.ReadExisting();
        richTextBox1.Text = indata;

    }

}

}

COM6 активен на моем компьютере. но моя проблема заключалась в том, что событие, полученное от данных, не запускается, когда данные поступают из последовательного порта. (Я проверил спорт с помощью некоторых бесплатных приложений)

кто-нибудь может помочь?

спасибо

Ответы [ 3 ]

5 голосов
/ 24 февраля 2011
        mySerialPort.Open();
        richTextBox1.Text = "on";
        mySerialPort.Close();

Это не сработает, вы закроете последовательный порт через пару микросекунд после открытия. Да, обработчик событий DataReceived вряд ли сработает. Закрывайте порт только при завершении работы вашей программы.

        mySerialPort.Handshake = Handshake.None

Это тоже проблема, теперь вам нужно самим контролировать сигналы рукопожатия. Подавляющее большинство устройств с последовательным портом ничего не отправит, пока не увидит, что машина включена и готова к приему. Установите для свойств DtrEnabled и RtsEnabled значение true.

1 голос
/ 24 февраля 2011

Проблема была решена, и я хотел бы поделиться ею.У меня был хороший напоминание, как показано ниже:

namespace RS232RVR
{
    public partial class Form1 : Form
    {
        private delegate void SetTextDeleg(string data);

        public Form1()
        {
            InitializeComponent();
            SettingRS232();
        }

        public void SettingRS232 ()
        {
            try
            {
                SerialPort mySerialPort = new SerialPort("COM6");

                mySerialPort.BaudRate = 9600;
                mySerialPort.Parity = Parity.None;
                mySerialPort.StopBits = StopBits.One;
                mySerialPort.DataBits = 8;
                mySerialPort.Handshake = Handshake.None;
                mySerialPort.ReadTimeout = 2000;
                mySerialPort.WriteTimeout = 500;

                mySerialPort.DtrEnable = true;
                mySerialPort.RtsEnable = true;

                mySerialPort.Open();
                //mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
                mySerialPort.DataReceived += DataReceivedHandler;

                textBox1.Text = "Serial Port is Ready.";

            }
            catch (Exception ex)
            {
                textBox1.Text = ex.Message;    
            }

        }

        public void DataReceivedHandler(object sender,SerialDataReceivedEventArgs e)
        {
            SerialPort sp = (SerialPort)sender;
            System.Threading.Thread.Sleep(500);
            string indata = sp.ReadExisting();
            this.BeginInvoke(new SetTextDeleg(DisplayToUI), new object[] { indata });
            //textBox1.Text += indata;

        }

        private void DisplayToUI(string displayData)
        {
            textBox1.Text += displayData.Trim();
           // textBox1.Text += displayData;

        }

    }
}

Если у кого-то есть комментарии по поводу кода, пожалуйста, рад и хочу лучше его кодировать.

1 голос
/ 24 февраля 2011

Вы скопировали этот код из своего приложения? Возможно, это просто случай, когда имя обработчика события написано с ошибкой? Например. На самом деле DataReceviedHandler должен быть записан как DataReceivedHandler.

...