Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/43: Рейтинг темы: голосов - 43, средняя оценка - 4.74
3 / 3 / 0
Регистрация: 06.10.2011
Сообщений: 35

Управлять включением и выключением светодиодов по RS-232

03.02.2013, 00:50. Показов 8779. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Итак. Сразу к проблеме.
Есть схема на светодиодах. Задача: при помощи COM порта (rs232) управлять включением и выключением светодиодов.
Проще говоря управлять выходными контактами порта с компьютера.
В нужный момент подавать 0 или 1.
Перерыл пол интернета, испробовал кучу примеров.....но ничего не подошло.
Вот пару примеров из того что уже пробовал:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System.IO.Ports;
 
private static void SendSampleData()
{
  SerialPort port = new SerialPort(
    "COM1", 9600, Parity.None, 8, StopBits.One);
  
  // Open the port for communications
  port.Open();
 
  // Write a set of bytes
  port.Write(new byte[] {0x0A, 0xE2, 0xFF}, 0, 3);
  
  // Close the port
  port.Close();
}
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
51
52
53
54
namespace управление_com_портом
{
    public partial class Form1 : Form
    {
       
        public Form1()
        {
            InitializeComponent();
            if (!serialPort1.IsOpen)
            {
                serialPort1.Open();
                textBox1.Text = "Порт открыт";
            }
            else
                textBox1.Text = "Ошибка порта";
        }
        private string rxString;
        private void button1_Click(object sender, EventArgs e)
        {
            serialPort1.Write(textBox2.Text);
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            textBox2.Clear();
            textBox1.Clear();
        }
 
        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            rxString = serialPort1.ReadExisting();
            this.Invoke(new EventHandler(displayText));
        }
        private void displayText(object o, EventArgs e)
        {
            textBox1.AppendText(rxString);
        }
 
        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            serialPort1.Close();
        }
 
        private void textBox2_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (serialPort1.IsOpen && checkBox1.Checked)
            {
                char[] ch = new char[1];
                ch[0] = e.KeyChar;
                serialPort1.Write(ch,0,1);
            }
        }
    }
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.02.2013, 00:50
Ответы с готовыми решениями:

Как с помощью VBA управлять включением/выключением NumLock?
Уважаемые господа, поскажите, пожалуйста, как с помощью VBA управлять включением/выключением NumLock.

Как управлять Входами RS-232
Я тут сделал чтоб при нажатии на кнопку, включился и выключался вход. На сайте msdn.microsoft.com нашел библиотеку ...

Как в VB управлять включением NumLock'а?
Уважаемые господа, подскажите, плз, как в VB управлять включением NumLock'а.

15
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
03.02.2013, 10:07
Есть схема на светодиодах
показывайте.

управлять выходными контактами порта с компьютера
передачу сигнала по COM вижу в коде, управление пинами порта отсутствует.
0
3 / 3 / 0
Регистрация: 06.10.2011
Сообщений: 35
03.02.2013, 13:35  [ТС]
Цитата Сообщение от raxp Посмотреть сообщение
передачу сигнала по COM вижу в коде, управление пинами порта отсутствует.
как известно у ком порта 3 питающие ножки, всю ночь сидел и 2-мя управлять получилось) питающие ноги 3.4.7)
4 и 7 получается а вот 3-ей нет( в чем беда не пойму....
вот код :
C#
1
2
serialPort1.DtrEnable = true; \\светодиод от 4-го контакта гаснет
serialPort1.RtsEnable = true; \\светодиод от 7-го контакта гаснет
и наоборот))
а вот на 3-й контакт не могу найти управу(((
на счет схемы эт наверное лишнее)))
в данный момент тесты проходят на схеме типа : питающая нога-резистор-светодиод(пробовал без резистора разницы не вижу)
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
03.02.2013, 16:19
Лучший ответ Сообщение было отмечено как решение

Решение

как известно у ком порта 3 питающие ножки, всю ночь сидел и 2-мя управлять получилось) питающие ноги 3.4.7)
4 и 7 получается а вот 3-ей нет( в чем беда не пойму....
пожалуй продублирую то, что когда то расписывал в блоге журнала.

краткий ликбез

Хочу разъяснить некоторые моменты, ибо в последнее время пользователи настолько привыкли к использованию компонентов, что даже не задумываются откуда-что взялось и как работает. Хорошо, если еще в генофонд компонента заглянут. Особенно это характерно для NET-чиков.

Прежде всего рассмотрим, что для чего на разъеме COM (RS-232):
1 DCD <- Carrier Detect
2 RXD <- Receive Data
3 TXD -> Transmit Data
4 DTR -> Data Terminal Ready
5 GND == System Ground
6 DSR <- Data Set Ready
7 RTS -> Request to Send
8 CTS <- Clear to Send
9 RI <- Ring Indicator
DCD (пин 1) - передает сигнал начала передачи данных (чаще нужен в условиях помех).
RXD (пин 2) - прием данных, ReadFile().
TXD (пин 3) - передача данных, WriteFile().
DTR (пин 4), RTS (пин 7) - подтверждение отправки данных.
CTS (пин 8), DSR (пин 6) - подтверждение приема данных.
RI (пин 9) - сигнал начала связи, историческая реликвия.



Как следует из таблицы, выводу RTS соответствует 7 контакт стандартного девятиконтактного COM порта. Он относится к 4 подрегистру и имеет в нем вес = 2. Адрес базового регистра - это адрес порта. Для COM1 он равен $3F8 (для COM2 - $2F8, для LPT1 - $378, LPT2 - $278).

Под DOS

Тут все просто и привычно:
Code
1
2
3
4
5
6
7
8
9
program prim1; 
 
uses crt, dos; 
 
var base: integer;   
begin
 base:=$3F8;  {Присвоение переменной base баз. адреса} 
 port[base+4]:=2;   {Установить RTS} 
end.
Под Windows

Обратимся к WinAPI, то бишь тому самому MSDN и рассмотрим структуру DCB.

Т.о. задача установки бита будет состоять из следующих шагов:

• открыть порт CreateFile и получить хэндл порта
• заполнить структуру DCB (или считать текущие настройки)
• установить бит через EscapeCommFunction

Code
1
EscapeCommFunction(FHandle, Act)
где: Act = 5 (установить), = 6 (сбросить) DTR, к примеру. Вот и все на самом-то деле.

...или:
Code
1
2
 DCB.Flags := 1 or ($3000 and (RTS_CONTROL_ENABLE shl 12));
 DCB.Flags := DCB.Flags or 2;
или:
Code
1
 EscapeCommFunction(FHandle, 3); [b]// 3 - установить RTS, 4 - сбросить RTS[/b]
Порт RTS (7) инициализируется командами:
Delphi
1
2
3
4
var port : hfile; IpEvtMask : dword;
port:=CreateFile('COM1',GENERIC_READ OR GENERIC_WRITE,
0,NIL,OPEN_EXISTING,0,0);
EscapeCommFunction(port, SETRTS);
В С# через класс SerialPort:
C#
1
serialPort1.RtsEnable
но на самом деле - это лишь обертка над WinAPI функцией - EscapeCommFunction().

Перехват события (состояния):
Delphi
1
2
3
4
setCommMask(port,EV_DSR); 
getCommMask(port,IpEvtMask);
WaitCommEvent(port,IpEvtMask,nil); 
ShowMessage('Прошло событие');
Установка события означает что состояние линии изменилось на противоположное, например с 0 в 1. Изменения на DCD (1 вывода Com-порта) отлавливаются при помощи события EV_RLSD. Разумеется после окончания работы порт надо закрыть функцией CloseHandle(port);


Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var h: HWND;
    evtMask: dword;
begin
 h:= CreateFile('COM3',
                 GENERIC_READ OR GENERIC_WRITE,
                 0,
                 NIL,
                 OPEN_EXISTING,
                 0,0);
 //EscapeCommFunction(port,SETRTS);
 setCommMask(h, $20); //  EV_RLSD - DCD
 getCommMask(h, evtMask);
 WaitCommEvent(h, evtMask, nil);
  ShowMessage('Прошло событие');
 CloseHandle(h)
end;


а вот на 3-й контакт не могу найти управу
ибо пин передачи данных, можете передавать просто пакет постоянно.

Тренируйтесь:
Вложения
Тип файла: zip raxp_compinio.zip (192.5 Кб, 235 просмотров)
6
3 / 3 / 0
Регистрация: 06.10.2011
Сообщений: 35
03.02.2013, 16:44  [ТС]
Цитата Сообщение от raxp Посмотреть сообщение
ибо пин передачи данных, можете передавать просто пакет постоянно.
а по подробнее(пример кода) можно про передачу пакетов, просто не очень понимаю(((
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
03.02.2013, 17:06
C#
1
2
byte[] buf = new byte[1] { 0xFF };
            serialPort1.Write(buf, 0, 1);
и в потоке.
1
3 / 3 / 0
Регистрация: 06.10.2011
Сообщений: 35
03.02.2013, 17:32  [ТС]
Цитата Сообщение от raxp Посмотреть сообщение
и в потоке
в каком потоке?) для дураков объясните пожалуйста((( у меня просто все события происходят по нажатию button )
я просто новичок и многое не понимаю)
Заранее спасибо!)

ПС: вставляю ваш код на button светодиод даже не маргает)
а когда допустим пишу вот такое
C#
1
serialPort1.Write("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF");
то тихо маргает)
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
03.02.2013, 17:44
...вы действительно между строк читаете? TX для передачи данных, а не установки бита в единичное состояние. Протокол RS-232.

Простейшм примером потока является таймер. Пробуйте.
0
3 / 3 / 0
Регистрация: 06.10.2011
Сообщений: 35
03.02.2013, 17:47  [ТС]
Цитата Сообщение от raxp Посмотреть сообщение
Простейшм примером потока является таймер. Пробуйте.
ставил код в таймер....все равно светодиод как горел так и горит((
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
03.02.2013, 17:55
мде... вы сюда заходили? Или уже сюда на крайний случай http://ru.wikipedia.org/wiki/RS-232
0
3 / 3 / 0
Регистрация: 06.10.2011
Сообщений: 35
03.02.2013, 18:00  [ТС]
Цитата Сообщение от raxp Посмотреть сообщение
мде... вы сюда заходили? Или уже сюда на крайний случай http://ru.wikipedia.org/wiki/RS-232
заходил( глупый я( не пойму что вы хотите донести до меня(((
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
03.02.2013, 18:41
Давайте так: вы хотите просто зажечь светодиод, подключенный к TX? Не выйдет, только мигание. Выставьте скорость поменьше, 1200 к примеру, и посылайте большие пакеты постоянно, авось "мельтешение" увидите.

И к слову, TX не для этого предназначен.
1
3 / 3 / 0
Регистрация: 06.10.2011
Сообщений: 35
04.02.2013, 01:11  [ТС]
Цитата Сообщение от raxp Посмотреть сообщение
Давайте так: вы хотите просто зажечь светодиод, подключенный к TX? Не выйдет, только мигание. Выставьте скорость поменьше, 1200 к примеру, и посылайте большие пакеты постоянно, авось "мельтешение" увидите.

И к слову, TX не для этого предназначен.
спасибо большое)
просто было дикое желание собрать светофор на ком порте) так как ЛПТ нету) а с USB подавно не дружу)
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
04.02.2013, 08:34
...есть аппаратные преобразователи последовательного кода в параллельный, к примеру EDE701/2.
0
3 / 3 / 0
Регистрация: 06.10.2011
Сообщений: 35
04.02.2013, 21:22  [ТС]
Цитата Сообщение от raxp Посмотреть сообщение
...есть аппаратные преобразователи последовательного кода в параллельный, к примеру ENE701/2.
ладно, чувствую я вам и так уже надоел) Спасибо за помощь) буду пытаться теперь сам крутиться)
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
04.02.2013, 21:30
Контроль напряжения на портах USB (пост #4 про EDE)
https://www.cyberforum.ru/elec... 75578.html (там по ссылкам)

зы: светофор - бу клава, три светодиода.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.02.2013, 21:30
Помогаю со студенческими работами здесь

Программа для "умного" управления ярокстью и включением \ выключением монитора \ экрана ноутбука?
Приветствую форумчан. Есть у меня одна мелкая проблема, но, как водится, &quot;мелкая, а ужасно бесит&quot;. Суть. Есть стационарный ПК, и...

Проблема с выключением пк
Комп стал странно выключаться. При выключении он как бы сначала выкл, резко вкл и в конце уже нормально выключается(да странно звучит). ...

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

Проблема с выключением\перезагрузкой
Пишет вам домохозяйка, которая слышала про гугл, но он ей сильно не помог. По сути. xubuntu 18.04 Переодически при попытке...

Проблема с выключением ноутбука
Добрый день. Примерно полгода назад столкнулся с такой проблемой, а именно, ноутбук после нажатие клавиши &quot;Завершение работы&quot;...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru