Member 11426986 Ответов: 1

Последовательный порт связи с#


Привет ребята,
Я разрабатываю форму Windows с коммуникацией со шкалой. Я не могу получить сообщение от масштаба. COM - порт идентифицирован, но полученный метод не подвергается преследованию. Ниже приведен код.

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

<pre lang="c#">
if (cbParametro.Text != "" && cbAplicacao.Text != "")
            {
                txtP1.BackColor = Color.LightCoral;
                txtP2.BackColor = Color.LightCoral;
                string[] versaoRSplit = Variaveis.configuracao_bal.Split(';');
                
                //Porta: COM1; Velocidade: 9600; DataBit: 8
                string porta = versaoRSplit[0].Trim();
                string porta_conf = porta.Replace("Porta: ", "");
                string veloc = versaoRSplit[1].Trim();
                string veloc_conf = veloc.Replace("Velocidade: ", "");
                string databit = versaoRSplit[2].Trim();
                string databit_conf = databit.Replace("DataBit: ", "");

                try
                {
                    serialP.Close();
                }
                catch
                {

                }

                try
                {
                    int velocidade = Convert.ToInt32(veloc_conf);
                    int databit_int = Convert.ToInt32(databit_conf);
                    serialP.PortName = porta_conf;
                    serialP.BaudRate = velocidade;
                    serialP.Parity = Parity.None;
                    serialP.DataBits = databit_int;
                    serialP.StopBits = StopBits.One;
                    serialP.Handshake = Handshake.None;
                    serialP.RtsEnable = true;
                    serialP.DtrEnable = true;
                    serialP.DataReceived += new SerialDataReceivedEventHandler(serialP_DataReceived);
                    serialP.ReadTimeout = 500;
                    serialP.WriteTimeout = 500;
                    serialP.Open();
                    MessageBox.Show("Configuração realizada com sucesso.");

                    txtP1.BackColor = Color.LightGreen;
                    txtP1.Focus();
                    txtP2.BackColor = Color.LightCoral;
                }
                catch (Exception m)
                {
                    MessageBox.Show("Houve um erro ao testar as configurações informadas." + Environment.NewLine + "Detalhe: " + m.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }


private void serialP_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            MessageBox.Show("Mensagem Recebida.");
            if (txtP1.Focused)
            {
                string indata = serialP.ReadExisting();
                txtP1.Text = indata;
                txtP2.BackColor = Color.LightGreen;
                txtP2.Focus();
            }
            else if (txtP2.Focused)
            {
                string indata = serialP.ReadExisting();
                txtP2.Text = indata;
                MessageBox.Show("Pesagem foi realizada com sucesos.");
            }
            else
            {
                string indata = serialP.ReadExisting();
                txtP1.Text = indata;
                MessageBox.Show("Data Received:" + indata, "Aviso");
                txtP2.BackColor = Color.LightGreen;
                txtP2.Focus();
            }
        }

1 Ответов

Рейтинг:
2

OriginalGriff

Начните с общения в обоих направлениях с помощью Hyperterminal или аналогичного: установите, что coms возможен и какие именно параметры необходимы. Затем жестко подключите эти параметры и выполните базовый тест без использования событий, чтобы убедиться, что ваш код в основном подключен. Разверните его, чтобы использовать информацию о конфигурации. и проверьте это. Наконец, добавьте обработку событий.

Но... также ознакомьтесь с документацией: Последовательный порт.Событие DataReceived (Системы.ИО.Порта) | Майкрософт Документы[^]

Цитата:
Событие DataReceived вызывается во вторичном потоке при получении данных из объекта SerialPort. Поскольку это событие возникает во вторичном потоке, а не в основном потоке, попытка изменить некоторые элементы в основном потоке, такие как элементы пользовательского интерфейса, может вызвать исключение потока. Если необходимо изменить элементы в основной форме или элементе управления, отправьте запросы на изменение обратно с помощью Invoke, который выполнит работу над соответствующим потоком.
Таким образом, вы не можете получить доступ к элементам пользовательского интерфейса в обработчике событий DataReceived, иначе он вызовет исключение перекрестной потоковой передачи, что, вероятно, и происходит с вашим кодом.


CPallini

5.