Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
36 / 34 / 20
Регистрация: 17.03.2015
Сообщений: 175
.NET 4.x

Обмен данными с устройством через com-порт

09.12.2016, 10:32. Показов 2801. Ответов 19

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Я работаю с Акип'ом и мне нужно считывать с него измерения.
Проблема в том, что я не могу получить от него банальное имя, или статус.
Реализовал управление, то есть отправку команд, а прием не выходит.

Делал чтение таким способом:
C#
1
2
3
4
5
6
7
8
private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            byte[] b = new byte[128];
            target_port.Read(b, 0, b.Length);
            string s = Encoding.ASCII.GetString(b);
 
            richTextBox1.AppendText(s);
        }
И само собой событие:
C#
1
this.target_port.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(serialPort_DataReceived);
Помогите пожалуйста.

Вот пример команды на проверку статуса кнопки Load : LOAD ;
В документации: [STATe:] LOAD ?{;⏐NL}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.12.2016, 10:32
Ответы с готовыми решениями:

Обмен данными через COM порт
Нашел исходник программы для работы с com портом. Какие есть стандартные команды, чтобы получить хоть какой то ответ? А то что бы не...

Обмен сообщениями между приложением и устройством
Приветствую! Обмен сообщениями будет между приложением и устройством(имеет заводской ip). Где нужно использовать ip моего ПК и ip...

Обмен данными
Друзья, помогите осуществить задумку. Нужно считывать таблицу с данными из клиентского приложения, выводя эти данные в такую же таблицу на...

19
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
09.12.2016, 10:43
Dragon7788, а что именно не получается?
0
36 / 34 / 20
Регистрация: 17.03.2015
Сообщений: 175
09.12.2016, 10:48  [ТС]
aquaMakc,
Например, когда я отправляю: target_port.Write("load on ;"), кнопка load активируется на оборудовании
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private void Start_work_Click(object sender, EventArgs e)
        {
            if (target_port.IsOpen)
            {
                target_port.Write("load on ;");
 
                int index = 0;
                process_work(index);
                control_tab.SelectedIndex = 0;
            }
            else
            {
                control_tab.SelectedIndex = 2;
                qDebug.Items.Add(DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToLongTimeString() +
                        " >> " + "Устройство не доступно! Проверьте подкючение..." + "\n");
            }
То есть передача данных идет.

Но мне нужно, например, получить от устройства статус того же load'a, активен он или нет.
Я отправляю запрос командой:
C#
1
2
3
4
 private void button1_Click(object sender, EventArgs e)
        {
            target_port.Write("load ;");
        }
Но ответа не приходит.

Добавлено через 1 минуту
aquaMakc, А выше я показал свой код, где пытаюсь получить ответку
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
09.12.2016, 10:51
Dragon7788, у акипа должен быть родной софт для работы через интерфейс. Предлагаю попробовать получить данные через него через прослушку порта и посмотреть как оно работает.
0
36 / 34 / 20
Регистрация: 17.03.2015
Сообщений: 175
09.12.2016, 10:53  [ТС]
aquaMakc, В том то и проблема, что у акипа нет софта. Мне вот на практике учебной дали задание сделать его.
Ты имеешь ввиду что-то типа Serial Port Monitor?
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
09.12.2016, 10:56
Цитата Сообщение от Dragon7788 Посмотреть сообщение
у акипа нет софта
сомневаюсь. запроси на сайте производителя.

У тебя событие DataReceived вообще не срабатывает, или ты не можешь данные получить в методе serialPort_DataReceived?
0
36 / 34 / 20
Регистрация: 17.03.2015
Сообщений: 175
09.12.2016, 11:03  [ТС]
aquaMakc,
Цитата Сообщение от aquaMakc Посмотреть сообщение
сомневаюсь. запроси на сайте производителя.
Это задание мне дали на работе, сомневаюсь что если бы оно было, то попросили бы сделать самому.

А как можно проверить срабатывает событие или нет? По сути, я сделал как в примере на msdn.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
09.12.2016, 11:04
Цитата Сообщение от Dragon7788 Посмотреть сообщение
В документации: [STATe:] LOAD ?{;⏐NL}
Дайте ссылку на документацию.
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
09.12.2016, 11:04
Цитата Сообщение от Dragon7788 Посмотреть сообщение
Это задание мне дали на работе, сомневаюсь что если бы оно было, то попросили бы сделать самому.
С тебя убудет запросить стандартный софт?
Цитата Сообщение от Dragon7788 Посмотреть сообщение
А как можно проверить срабатывает событие или нет?
Поставить точку останова внутри метода вызываемого по событию.
0
36 / 34 / 20
Регистрация: 17.03.2015
Сообщений: 175
09.12.2016, 11:07  [ТС]
Цитата Сообщение от aquaMakc Посмотреть сообщение
С тебя убудет запросить стандартный софт?
Чего с меня?
Цитата Сообщение от aquaMakc Посмотреть сообщение
Поставить точку останова внутри метода вызываемого по событию.
Наверное все же событие, потому что я запихнул туда this.close(), но ничего не произошло.
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
09.12.2016, 11:08
Цитата Сообщение от Dragon7788 Посмотреть сообщение
Чего с меня?
выражение такое есть

Цитата Сообщение от Dragon7788 Посмотреть сообщение
Наверное все же событие, потому что я запихнул туда this.close(), но ничего не произошло.
Не гадай - поставь точку останова и запусти.
0
36 / 34 / 20
Регистрация: 17.03.2015
Сообщений: 175
09.12.2016, 11:11  [ТС]
Цитата Сообщение от aquaMakc Посмотреть сообщение
Не гадай - поставь точку останова и запусти.
Кажется само событие не срабатывает...
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
09.12.2016, 11:13

Не по теме:

Цитата Сообщение от Dragon7788 Посмотреть сообщение
Кажется само событие не срабатывает
Слово "кажется" не должно звучать при разработке ПО.



Добавлено через 1 минуту
Цитата Сообщение от Dragon7788 Посмотреть сообщение
Кажется само событие не срабатывает...
Ну значит - прибор считает, что запрос сформирован неверно. Либо кури мануалы, либо запроси софт у разработчиков и посмотри какие запросы делает он.
0
36 / 34 / 20
Регистрация: 17.03.2015
Сообщений: 175
09.12.2016, 11:18  [ТС]
Цитата Сообщение от aquaMakc Посмотреть сообщение
Ну значит - прибор считает, что запрос сформирован неверно. Либо кури мануалы, либо запроси софт у разработчиков и посмотри какие запросы делает он.
Запрос есть в документации, но он написан для старой ISA-карты.
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
/* Link this program with appropriate *cib*.obj. */  
/* This application program is written in TURBO C 2.0 for the IBM PC-AT compatible. The National Instruments Cooperation (NIC) Model PC-2A board provides the interface between the PC-AT and a PRODIGIT MPAL ELECTRONIC LOAD. The appropriate *cib*.obj file is required in each program to properly link the NIC board to C LANGUAGE. and include the <decl.h.> HEADER FILE to C LANGUAGE. */  
#include <stdio.h> 
#include <dos.h> 
#include <math.h> 
#include "decl.h" /* NI GPIB CARD HEADER FILE */  
main() 
{    char ouster[20],rdbuf[15],spec[10];    
int i,ch,load;
 /* Assign unique identifier to the device "dev5" and store in variable load. check for error. ibfind error = negative value returned. */   
 if((load = ibfind("dev5")) < 0) /*  Device variable name is load  */      
{    /*  GPIB address is  5  */        
printf("\r*** INTERFACE ERROR ! ***\a\n");        
printf("\r\nError routine to notify that ibfind failed.\n");        
printf("\r\nCheck software configuration.\n");        
exit(1);      
} 
/*  Clear the device  */   
 if((ibclr(load)) & ERR);     
 {        
printf("INTERFACE ERROR ! \a");        
exit(1);     
 }    
clrscr();
 /* Clear load error register */   
 for(i=1,ch=0;i<=4;i++,ch++)    
 {      
outstr=chan[ch];     
 ibwrt(load,outstr,6);     
 ibwrt(load,"CLER",4);     
 }
  ibwrt( load,"NAME?",5);  /*  Get the 3310 series module load specification  */    
strset(rdbuf,'\0');   /*  Clear rdbuf string buffer  */    
strset(spec,'\0');   /*  Clear spec string buffer  */    
ibrd(load,spec,20);   
 if (spec[3] == '9')      
 printf("\n 3300F series specification error !");
 /*  Set the channel 1, preset off, current sink 1.0 amps and load on commands to the load. */   
 ibwrt( load,"chan 1;pres off;curr:low 0.0;curr high 1.0;load on ",51);  
  ibwrt( load,"meas:curr ?",11); 
/*  Get the load actially sink current from the load  */ 
  ibrd( load,rdbuf,20);
 /*  go to local.  */    
ibloc(load); 
}
32 строка.
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
09.12.2016, 11:29
Dragon7788, и как этот код связан с тем, что ты пишешь?
В 32 строке на в девайс с ud=5 посылается команда "NAME?" и указывается длинна - 5 байт.
Ты в COM-порт шлёшь "Load ;"
Опять-же. В приведённом коде используется сишный Char - 1 байт, у тебя шарповый - 2 байта.
0
36 / 34 / 20
Регистрация: 17.03.2015
Сообщений: 175
09.12.2016, 11:34  [ТС]
Цитата Сообщение от aquaMakc Посмотреть сообщение
и как этот код связан с тем, что ты пишешь?
Я же написал, это пример из документации.
Цитата Сообщение от aquaMakc Посмотреть сообщение
Ты в COM-порт шлёшь "Load ;"
Что "load ;", что "name?" запросы, не столь важно.
Цитата Сообщение от aquaMakc Посмотреть сообщение
Опять-же. В приведённом коде используется сишный Char - 1 байт, у тебя шарповый - 2 байта.
А это может как то влиять?
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
09.12.2016, 11:35
Цитата Сообщение от Dragon7788 Посмотреть сообщение
А это может как то влиять?
Железо ждёт 5 байт, ему приходит 10...разницу чувствуешь?
0
36 / 34 / 20
Регистрация: 17.03.2015
Сообщений: 175
09.12.2016, 11:37  [ТС]
Цитата Сообщение от aquaMakc Посмотреть сообщение
Железо ждёт 5 байт, ему приходит 10...разницу чувствуешь?
Хм... Да, разница есть. Глупый вопрос, прошу прощение.
То есть проблема может быть в этом?
Можно как-нибудь отправить нужное количество байт в шарпе?
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
09.12.2016, 11:45
Лучший ответ Сообщение было отмечено Dragon7788 как решение

Решение

Dragon7788, тебе надо из строки получить массив байт и отправить его. Например:
C#
1
2
3
string str ="NAME?";
byte[] outBytes = Encoding.UTF8.GetBytes(str);
target_port.Write(outBytes, 0, outBytes.Length);
Добавлено через 1 минуту
Dragon7788, хотя, если ты пишешь:
Реализовал управление, то есть отправку команд
, то дело не в этом. Скорее всего просто ты неправильно формируешь запросы.
1
36 / 34 / 20
Регистрация: 17.03.2015
Сообщений: 175
09.12.2016, 12:33  [ТС]
aquaMakc,
Цитата Сообщение от aquaMakc Посмотреть сообщение
тебе надо из строки получить массив байт и отправить его
Я сделал как ты написал
C#
1
2
3
4
5
6
private void button1_Click(object sender, EventArgs e)
        {
            string stat_load = "MODE?;";
            byte[] outButes = Encoding.UTF8.GetBytes(stat_load);
            target_port.Write(outButes, 0, outButes.Length);
        }
А чтение из порта я сделал с помощью делегата:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 private delegate void setTextDelegate(string text);
        // получение ответов от порта;
        private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            byte[] b = new byte[128];
            target_port.Read(b, 0, b.Length);
            string s = Encoding.ASCII.GetString(b);
 
            this.BeginInvoke(new setTextDelegate(data_received), new object[] { s });
        }
        private void data_received(string data)
        {
            richTextBox1.AppendText(data);
        }
И все заработало.
Спасибо большое за помощь!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.12.2016, 12:33
Помогаю со студенческими работами здесь

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

Обмен данными между С++ и С#
Имеются две независимые программы, одна из них написана на С++, другая на С#. Как от одной передать в другую просто число? Ведь С#, как...

Обмен данными между процессами
Доброго времени суток. Проблема такая: есть два процесса, один как бы главный, а второй дочерний, нужно каким-то образом отловить данные из...

Обмен данными между устройствами
Всем привет. Требуется совет по поводу реализации обмена данными, между несколькими устройствами. Первое устройство ПК, только у которого...

Обмен данными между потоками
Здравствуйте. Есть класс, в нем создается поток, который создается TCP сокет и слушает определенный порт, если есть какое-то сообщение на...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru