Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
0 / 0 / 0
Регистрация: 24.01.2017
Сообщений: 14
1

COM- порт

06.02.2017, 22:35. Показов 2757. Ответов 2

Author24 — интернет-сервис помощи студентам
Пытаюсь разобраться в работе с портом и пока все очень туго получается. Для начала решил сделать что- то вроде com port toolkit'a. Есть устройство, которое ничего не делает, кроме как дает знать, что отправленное пришло верно (Моргает по команде) и отвечает. Команды такого вида: A2 03, где A2- это моргаем, а 03- это 3 раза. Это шестнадцатеричные числа. Принимаем мы в этом случае то же самое (A2 03). Теперь сама проблема:

1) У меня так и не получилось преобразовать ответ в виде (A2 03), я вывожу на экран 162 3 (но это ладно)

2) Сначала выводит только одно число, т.е. если моргаем (A2 03), то это (162 0), а не (162 3), если я повторяю команду выведет (0 3), и только на третий раз получается (162 3)

3) Ещё интересно, как сделать ожидание ответа. Т.е. сейчас устройство отвечает сразу и данные приходят, но хотелось бы, чтобы была возможность постоянного ожидания ( как это реализовать я так и не понял, зависает).

Вот код кнопки отправки, если это полная дичь и вы напишите, что это полная дичь- я пойму)))

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
private void button1_Click(object sender, EventArgs e)
        {
            textBox2.Text = "";
            if (serialPort1.IsOpen)
                {
                byte[] data = textBox1.Text.Split().Select(s => Convert.ToByte(s, 16)).ToArray();
                serialPort1.Write(data, 0, data.Length);
                
                try
                {
                    byte[] read = new byte[9];
                    serialPort1.Read(read, 0, read.Length);
                    textBox2.Text = (read[0].ToString() + " " + read[1].ToString());
                    textBox1.Text = "";
 
                    //    textBox2.Text = Encoding.ASCII.GetString(read);
 
 
                }
                catch (TimeoutException) { }
                Thread.Sleep(250);                          
 
 
            }
                else
                {
                    textBox1.Text = "Закрыт";
                }
           
        }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.02.2017, 22:35
Ответы с готовыми решениями:

Открыть порт 4444 в брэндмауэре. Антивируса нет. провайдером порт открыт
Подскажите как открыть данный порт,все делал как тут...

В конфигурационном файле прописан порт, но пишет ошибку порт 80 занят другим приложением
Здравствуйте. Пишу решение с 2 проектами - сервер и клиент с дуплексным контрактом. Служба...

В порт в среднем приходит 3 корабля в день. Какова вероятность того, что в порт в день придет 2 корабля; 4 корабля?
помогите решить пожалуйста В порт в среднем приходит 3 корабля в день. Какова вероятность...

Async Free (СОМ-порт)-Async Pro (СОМ-порт)?
Здравствуйте! Скажите пожалуйста есть пример где используют Async Free (СОМ-порт) или Async Pro...

2
Эксперт .NET
5545 / 4308 / 1218
Регистрация: 12.10.2013
Сообщений: 12,356
Записей в блоге: 2
07.02.2017, 09:58 2
za4tooo, вот простой тест. В данном случае для проверки выводы RxD, TxD замкнуты, т.е. что отправляем, то и получаем.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using System.IO.Ports;
 
namespace COMPortSample {
    class Program {
        SerialPort port = new SerialPort("COM1", 9600);
        AutoResetEvent readFlag = new AutoResetEvent(false);
        AutoResetEvent writeFlag = new AutoResetEvent(false);
        static void Main(string[] args) {
            new Program().Run();
            Console.ReadLine();
 
        }
        void Run() {
            port.Open();
            Task.Factory.StartNew(()=>StartListen());
            while (true) {
                writeFlag.WaitOne();
                string request;
                Console.Write("Enter request to COM port: ");
                request = Console.ReadLine();
                if (request.ToUpper() == "EXIT")
                    return;
                byte[] data = Encoding.ASCII.GetBytes(request);
                port.Write(data, 0, data.Length);
                Thread.Sleep(200);
                readFlag.Set();
            }
        }
        void StartListen() {
            writeFlag.Set();
            while (true) {
                readFlag.WaitOne();
                if (port.BytesToRead != 0) {
                    byte[] data = new byte[port.BytesToRead];
                    port.Read(data, 0, data.Length);
                    string response = Encoding.ASCII.GetString(data);
                    Console.WriteLine("Response from COM port: {0}", response);
                }
                writeFlag.Set();
            }
        }
    }
}
0
0 / 0 / 0
Регистрация: 24.01.2017
Сообщений: 14
07.02.2017, 21:36  [ТС] 3
Оу, ничего себе. Я слабовато все понял. Мне бы узнать, что может быть не так в моем коде. Почему он все таки принимает эти два значения, но только с третьего раза выводит верные значения. Или там вообще полный бред написан и придется писать все по другому.

Добавлено через 57 минут
Если очищать буфер (serialPort1.DiscardInBuffer)- выводится будет только первый элемент.
0
07.02.2017, 21:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.02.2017, 21:36
Помогаю со студенческими работами здесь

Game порт. или не Game порт
Добрый день! Конструирую свой игровой девайс (корабельный штурвал). Суть - вращаемый вал,...

Порт
Как открыть порт на модеме huawei hg8245 + windows7?

Com порт
Объясните пожалуйста почему программа не получает символ '~' отправленный другой программой через...

COM порт
считываю показания лабораторных весов через ком порт. результат считывания записывается в массив...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru