Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[34.201.19.151] |
|
Сообщ.
#1
,
|
|
|
Добрый день! Мне нужно запрограммировать считыватель никогда этого не делал и толком не знаю с чего начать.
using System; using System.IO.Ports; using System.Threading; namespace ComPortExample { class Program { static bool _continue; static SerialPort _serialPort; static void Main(string[] args) { string name; string message; StringComparer stringComparer = StringComparer.OrdinalIgnoreCase; Thread readThread = new Thread(Read); // Create a new SerialPort object with default settings. _serialPort = new SerialPort(); // Allow the user to set the appropriate properties. _serialPort.PortName = "COM4"; _serialPort.BaudRate = 9600; _serialPort.Parity = Parity.Even; _serialPort.DataBits = 8; _serialPort.StopBits = StopBits.One; _serialPort.Handshake = Handshake.None; // Set the read/write timeouts _serialPort.ReadTimeout = 500; _serialPort.WriteTimeout = 500; _serialPort.Open(); _continue = true; readThread.Start(); Console.Write("Name: "); name = Console.ReadLine(); Console.WriteLine("Type QUIT to exit"); while (_continue) { message = Console.ReadLine(); if (stringComparer.Equals("quit", message)) { _continue = false; } else { _serialPort.WriteLine( String.Format("<{0}>: {1}", name, message)); } } readThread.Join(); _serialPort.Close(); } public static void Read() { while (_continue) { try { string message = _serialPort.ReadLine(); Console.WriteLine(message); } catch (TimeoutException) { } } } // Display Port values and prompt user to enter a port. public static string SetPortName(string defaultPortName) { string portName; Console.WriteLine("Available Ports:"); foreach (string s in SerialPort.GetPortNames()) { Console.WriteLine(" {0}", s); } Console.Write("Enter COM port value (Default: {0}): ", defaultPortName); portName = Console.ReadLine(); if (portName == "" || !(portName.ToLower()).StartsWith("com")) { portName = defaultPortName; } return portName; } } } Выдает исключение: Время ожидания операции истекло. catch (TimeoutException) Добавлено Считыватель UART подключается при помощи usb. |
Сообщ.
#2
,
|
|
|
Здравствуйте!
А где можно почитать вопрос? Ну, или хотябы что Вам надо получить, и что Вы ожидаете от этого кода? |
Сообщ.
#3
,
|
|
|
Мне просто выдает ошибку, когда я пытаюсь считать данные с ком порта: "Время ожидания операции истекло.". Поэтому и спрашиваю что я делаю не так.
Добавлено Я ж порт открываю с настройками и должен его прослушать. |
Сообщ.
#4
,
|
|
|
1. Убедитесь что устройство именно на 4 порту (например, на моём usb порте дефолтным был 232)
2. Пробовали увеличивать время таймаута? Добавлено + я бы рекомендовал Вам переписать страшную часть с потоком, на адекватный евент, который за вас уже продумали авторы System.IO.Ports)) port = new SerialPort("COM" + portNumber.ToString(), 9600, Parity.None, 8, StopBits.One); port.DataReceived += new SerialDataReceivedEventHandler(DataReceived); ... public void DataReceived(object sender, SerialDataReceivedEventArgs e) { Console.WriteLn(port.ReadLine()); } хотя, я подозреваю, что именно эта часть у Вас реализована очень странно. Добавлено Чтобы было понятно, прежде чем считывать пришедшие данные, необходимо дождаться сообщения о том что пришёл стоповый бит. Как я понимаю, вы на это внимания не обращаете, и пытаетесь считать данные которые ещё не пришли, либо которых попросту нет, за время таймаута они так и не приходят, собственно, оттуда и ошибка. |
Сообщ.
#5
,
|
|
|
Теперь мое приложение выглядит вот так:
using System; using System.IO.Ports; using System.Threading; namespace ComPortExample { class Program { static bool _continue; static SerialPort _serialPort; static void Main(string[] args) { //StringComparer stringComparer = StringComparer.OrdinalIgnoreCase; //Thread readThread = new Thread(Read); // Create a new SerialPort object with default settings. _serialPort = new SerialPort(); _serialPort = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One); // Set the read/write timeouts _serialPort.ReadTimeout = 2000; _serialPort.WriteTimeout = 2000; _serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceived); _serialPort.Open(); while(true) {} _serialPort.Close(); } public static void DataReceived(object sender, SerialDataReceivedEventArgs e) { Console.WriteLine(_serialPort.ReadLine()); } } } Добавлено На консоль ничего не вывело. Добавлено Я в дипетчере устройств вижу USB serial port(COM4) |
Сообщ.
#6
,
|
|
|
while(true) {} Не делайте так. Вы посылаете все ресурсы на этот цикл, а ваш компонент порта не успевает ничего обработать... using System; using System.IO.Ports; using System.Threading; namespace ComPortExample { class Program { private static bool _continue; private static SerialPort _serialPort; public static void Main(string[] args) { _serialPort = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One); _serialPort.ReadTimeout = 1000; _serialPort.WriteTimeout = 1000; _serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceived); _serialPort.Open(); for(;;) { Thread.Sleep(200); // даём остальным потокам 200 миллисекунд на работу } _serialPort.Close(); // недостижимый код, но, для теста сойдёт } private static void DataReceived(object sender, SerialDataReceivedEventArgs e) { Console.WriteLine(_serialPort.ReadLine()); } } } Я вам рекомендую данную тему продолжать в разделе .NET/C# так как, это вопрос чисто программирования) |
Сообщ.
#7
,
|
|
|
Цитата Dmitriy78781 @ Мне нужно запрограммировать считыватель никогда этого не делал и толком не знаю с чего начать. Для начала неплохо считать что нить через Putty - чисто убедиться, что железяка рабочая. Добавлено Цитата VisualProg @ так как, это вопрос чисто программирования) это точно! |
Сообщ.
#8
,
|
|
|
Что такое Putty.
|
Сообщ.
#9
,
|
|
|
Цитата Dmitriy78781 @ Что такое Putty. Консоль, можно использовать для работы с ком-портом. Вот подробней: https://ru.wikipedia.org/wiki/PuTTY Удобно что бы убедиться в правильности обращения с железякой. |
Сообщ.
#10
,
|
|
|
А если я в PuTTY установил нужные настройки и ничего не произошло? Что это значит?
|
Сообщ.
#11
,
|
|
|
Цитата Dmitriy78781 @ А если я в PuTTY установил нужные настройки и ничего не произошло? Что это значит? C Putty и бесплатного терминала и надо начинать. Выяснить работает ли железка, попробовать другую при возможности. |
Сообщ.
#12
,
|
|
|
Родная программа есть?
|
Сообщ.
#13
,
|
|
|
Цитата А если я в PuTTY установил нужные настройки и ничего не произошло? Что это значит? Если настройки действительно верные (образец, который нашёл поиском) - значит устройство с которым вы соединяетесь - молчит. Тут несколько вариантов почему это происходит: 1. Изучите протокол этого устройства. Есть вероятность, что оно ждёт вашей команды, для начала протокола. 2. Убедитесь что устройству вообще положено отсылать какие либо данные (ну, например, в случаях когда устройство может только читать и выполнять ваши команды) 3. Убедитесь что устройство работает. 4. Убедитесь что устройство исправно. Добавлено + Вы до сих пор не объяснили что за устройство (Ваша фраза "у меня есть считыватель" даёт мне столько же информации сколько Вам моя фраза "у меня есть волшебная программа"). + Я как программист, никогда бы не начинал программу не зная протокола. В вашем случае - что вы ожидаете от устройства? Оно пингует то к чему подсоединено через COM порт? или же вы проводите манипуляции со считывателем и ожидаете данные? В обоих вариантах, надо знать протокол. Если вы потрудитесь его здесь описать, вашу проблему можно решить за 10 минут. |
Сообщ.
#14
,
|
|
|
Цитата Dmitriy78781 @ А если я в PuTTY установил нужные настройки и ничего не произошло? Что это значит? Не затруднит показать модель устройства? Желательно и фотографию(что бы видно было как вы провода подкинули), в т.ч. переходника usb2com. |
Сообщ.
#15
,
|
|
|