Форум программистов, компьютерный форум, киберфорум
АСУ ТП, промэлектроника
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.81/246: Рейтинг темы: голосов - 246, средняя оценка - 4.81
2 / 2 / 0
Регистрация: 01.05.2012
Сообщений: 33

Управление купольной антивандальной камерой по RS-485

01.05.2012, 18:05. Показов 54286. Ответов 111

Студворк — интернет-сервис помощи студентам
Суть проблемы.

Есть антивандальная камера. У нее есть интрефейс управления RS485. Необходимо написать программу управления данной камерой на C#.

Для подключения камеры к ПК используется переходник UCON-485-USB.
Команды камере описаны в протоколе D-protocol.pdf.

Архив с программой С#.rar


Сам код

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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.Threading;
using System.IO;
 
 
 
namespace Terminal
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            string temp;
            serialPort1.PortName = ((string)comboBox1.SelectedItem);          
            serialPort1.Parity = (Parity)Enum.Parse(typeof(Parity),(string)comboBox3.SelectedItem);
            temp = ((string)comboBox2.SelectedItem);
            temp = temp.ToString();
            serialPort1.BaudRate = (int.Parse(temp));        
            serialPort1.StopBits = ((StopBits)Enum.Parse(typeof(StopBits),(string)comboBox4.SelectedItem));
            try
            {
                serialPort1.Open();
                button1.Enabled = false;
                button2.Enabled = true;
                button3.Enabled = true;
            }
            catch (InvalidOperationException)
            {                
            }
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            serialPort1.Close();
            button1.Enabled = true;
            button2.Enabled = false;
            button3.Enabled = false;
        }
 
        public string SetPortName(string defaultPortName)
        {
            string portName="";
            foreach (string portname in SerialPort.GetPortNames())
            {
                comboBox1.Items.Add(portname); //добавить порт в список  
            }
            comboBox1.SelectedIndex = 0;
            if (portName == "")
            {
                portName = defaultPortName;
            }
            return portName; //возвращает порт по умолчанию
        }
 
        public int SetPortBaudRate(int defaultPortBaudRate)
        {
            string baudRate = "";
            if (baudRate == "")
            {
                baudRate = defaultPortBaudRate.ToString();
            }
            return int.Parse(baudRate);
        }
 
        public Parity SetPortParity(Parity defaultPortParity)
        {
            string parity = "";
            foreach (string paritybit in Enum.GetNames(typeof(Parity)))
            {
                parity = paritybit.ToString();
                comboBox3.Items.Add(parity);
            }
            comboBox3.SelectedIndex = 0;
            if (parity == "")
            {
                parity = defaultPortParity.ToString();
            }
            return (Parity)Enum.Parse(typeof(Parity), parity);
        }
 
        public int SetPortDataBits(int defaultPortDataBits)
        {
            string dataBits = "9600";
            if (dataBits == "")
            {
                dataBits = defaultPortDataBits.ToString();
            }
            return int.Parse(dataBits);
        }
 
        public StopBits SetPortStopBits(StopBits defaultPortStopBits)
        {
            string stopBits = "";
            foreach (string stopbits in Enum.GetNames(typeof(StopBits)))
            {
                stopBits = stopbits.ToString();
                comboBox4.Items.Add(stopbits);
            }
            comboBox4.SelectedIndex = 1;
            if (stopBits == "")
            {
                stopBits = defaultPortStopBits.ToString();
            }
            return (StopBits)Enum.Parse(typeof(StopBits), stopBits);
        }
 
        public  Handshake SetPortHandshake(Handshake defaultPortHandshake)
        {
            string handshake = "";
            foreach (string handshakes in Enum.GetNames(typeof(Handshake)))
            {
                handshake = handshakes;
            }
            if (handshake == "")
            {
                handshake = defaultPortHandshake.ToString();
            }
            return (Handshake)Enum.Parse(typeof(Handshake), handshake);
        }
 
        public void BaudRateget()
        {
            string[] listbaudrate = new string[15];
            listbaudrate[0] = "110";
            listbaudrate[1] = "300";
            listbaudrate[2] = "600";
            listbaudrate[3] = "1200";
            listbaudrate[4] = "2400";
            listbaudrate[5] = "4800";
            listbaudrate[6] = "9600";
            listbaudrate[7] = "14400";
            listbaudrate[8] = "19200";
            listbaudrate[9] = "38400";
            listbaudrate[10] = "56000";
            listbaudrate[11] = "57600";
            listbaudrate[12] = "115200";
            listbaudrate[13] = "128000";
            listbaudrate[14] = "256000";
            comboBox2.Items.AddRange(listbaudrate);
            comboBox2.SelectedIndex = 6;
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {           
            serialPort1.PortName = SetPortName(serialPort1.PortName);
            serialPort1.Parity = SetPortParity(serialPort1.Parity);
            serialPort1.BaudRate = SetPortBaudRate(serialPort1.BaudRate);
            serialPort1.StopBits = SetPortStopBits(serialPort1.StopBits);
            serialPort1.Handshake = SetPortHandshake(serialPort1.Handshake);
            BaudRateget();
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
            string writestring;
            writestring = textBox2.Text;
            try
            {
                serialPort1.WriteLine(String.Format("{0}", writestring));
                textBox2.Clear();
            }
            catch (TimeoutException)
            {
            }
        }
 
        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            string readstring;        
            try
            {
                readstring = serialPort1.ReadLine();
                                                                
            }
            catch (TimeoutException)
            {
            }                      
        }
    }    
}

команду записываю в строку и отправляю.
ну устройстве UCON-485 отображается, что передача осуществилась, но активности камеры ноль, как была мертвой так и остается.

Камера рабочая, при включении питания, камера калибруется.

Подскажите в чем может быть проблема.

возможно я не правильно формирую посылку или проблемы в скоростях камеры и устройства передачи, но я пробежал по всей гребенке скоростей устройства UCON-485, изменений не было.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.05.2012, 18:05
Ответы с готовыми решениями:

Управление нагрузкой с компьютера по RS-485
Всем драсьте! Работаю простым электриком и в свободное от работы время занимаюсь саморазвитием и хочу научиться управлять нагрузкой 220\380...

Управление 3D-камерой
Доброго времени суток, уважаемые знатоки. Есть два куска кода, которые должны по идее совершенно одинаково управлять вращением 3D-камеры....

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

111
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
16.05.2012, 16:45
Студворк — интернет-сервис помощи студентам
Отключена?
от питания? просто кнопки как выкл, нет в PTZController.
значит там существенное отличие от протокола. В PelcoD есть пакет включения и отключения камеры по сетевому адресу. А тут видимо просто шлется первичный одинаковый пакет.

да Right, Top, Down тоже отправляются пакетами.
ага, двумя пакетами, тады зафиксируйте какие именно для какой кнопки. Вечером постараюсь приложить тестовую утилиту с учетом новых данных.
1
2 / 2 / 0
Регистрация: 01.05.2012
Сообщений: 33
16.05.2012, 17:15  [ТС]
Цитата Сообщение от raxp Посмотреть сообщение
значит там существенное отличие от протокола. В PelcoD есть пакет включения и отключения камеры по сетевому адресу.
Возможно,но тогда камера не заработала. Я выбирал протокол, он есть в списке данной программы. там и pelco-D, Samsumg итд...

там есть отключение в самой настройке камеры. в ее менюшке.

камеру отключил от питания, и запустил PTZController, посылает туже команду с нулями.

Потыкал на кнопки

последовательность такая :
right
Code
1
FF 01 02 20 00 23
Down
Code
1
FF 01 00 10 00 20 31
Left
Code
1
FF 01 00 04 20 00 25
Up
Code
1
FF 01 00 08 00 20 29
лог С нажатием на кнопки.LOG

и скрин
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
16.05.2012, 20:52
...последний замер для LEFT не совпал с постом #38.

Пробуйте:
Вложения
Тип файла: zip Project3.zip (232.9 Кб, 71 просмотров)
1
2 / 2 / 0
Регистрация: 01.05.2012
Сообщений: 33
17.05.2012, 18:31  [ТС]
нет, не заработала, видимо нужно отправить посылку с нулями в начале.Ваш проект.LOG
0
2 / 2 / 0
Регистрация: 01.05.2012
Сообщений: 33
17.05.2012, 18:51  [ТС]
Великолепно)

у меня она заработала из моей программы.
как сделал.
сначала послал , затем послал команду на поворот, но она поворачивает до своего предела.
команда которая шла
CSS
1
FF 01 00 00 00 00 01
останавливает вращение.
подскажите пожалуйста. как поставить задержку, чтоб при нажатии на кнопку, отправлялось 2 команды, но 2я отправлялась через 2 секунды например.


да и вот, что странно. сейчас запустилась даже без команды с одними нулями.
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
17.05.2012, 19:00
да и вот, что странно. сейчас запустилась даже без команды с одними нулями.
скорее, один раз достаточно инициализировать.

подскажите пожалуйста. как поставить задержку, чтоб при нажатии на кнопку, отправлялось 2 команды, но 2я отправлялась через 2 секунды
sleep(2000) между ними... а вообще, поток а-ля таймер: после посылки пакета запускаем таймер и по срабатыванию - отключаем таймер и шлем пакет остановки.

FF 01 00 00 00 00 01
останавливает вращение.
вот моя наверно и не работала из-за того, что послали пакет поворота и сразу же вырубили.

...ок, добавил задержку в 500 мс в потоке:
Вложения
Тип файла: zip Project4.zip (233.1 Кб, 65 просмотров)
1
2 / 2 / 0
Регистрация: 01.05.2012
Сообщений: 33
17.05.2012, 19:06  [ТС]
Цитата Сообщение от Orgi243 Посмотреть сообщение
нет, не заработала, видимо нужно отправить посылку с нулями в начале.Вложение 152796

Извините, она работает, но т.к у вас 2 команды идут с маленькой разницей во времени, то камера почти без движения.
и это было не заметно визуально.

в вашей последней программе, задержка больше) и она движется)

Спасибо большое)


когда до ума доведу, скину рабочий вариант)
1
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
17.05.2012, 19:11
...вот и хорошо
0
2 / 2 / 0
Регистрация: 01.05.2012
Сообщений: 33
18.05.2012, 17:57  [ТС]
И так)

Вот полностью рабочая программа в исходнике Управление камерой с использованием Мыши.rar


теперь хочу, чтоб она двигалась при нажатии на клавиши "Стрелок".

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

буду благодарен за ссылки на подобный программы.


вот пример

C#
1
2
3
4
5
private void treeView1_KeyDown(object sender, KeyEventArgs e)
       {
            if (e.KeyCode == Keys.Delete)
                this.treeView1.Nodes.Remove(this.treeView1.SelectedNode);
       }

как мне это повесить на Форму кнопки?
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
18.05.2012, 18:31
...ну дык, это не сложно. Раз посылка одиночного "пакета ДЕЙСТВИЕ" запускает в работу камеру до упора пока не будет послан "пакет STOP", общий алгоритм симуляции на одну удерживаемую кнопу (игровой наборчик W-A-S-D ) таков: в потоке с определенным минимальным интервалом считывается состояние кнопы - нажата ли еще (при нажатии послать пакет LEFT, TOP, DOWN. RIGHT), если по истечении 100 мс еще нажата - ничего не делать, если не нажата уже, то послать пакет STOP. Обработку состояний всех клавиш делаем в одном потоке.

Считывание состояния стрелок глобально можно осуществить через GetAsyncKeyState().
0
2 / 2 / 0
Регистрация: 01.05.2012
Сообщений: 33
18.05.2012, 18:35  [ТС]
а есть исходник какой-нибудь?
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
18.05.2012, 18:44
http://msdn.microsoft.com/en-u... s.85).aspx
0
2 / 2 / 0
Регистрация: 01.05.2012
Сообщений: 33
02.06.2012, 14:32  [ТС]
Здравствуйте.

все бьюсь с камерой, чтоб заставить ее двигаться при нажатии на стрелки клавыю.

вот код.
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.Threading;
using System.IO;
 
using System.Diagnostics;
using System.Runtime.InteropServices;
 
 
namespace Terminal
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            _hookID = SetHook(HookCallback);
 
        }
 
        private const int WH_KEYBOARD_LL = 13;
        private const int WM_KEYDOWN = 0x0100;
        private const int WM_KEYUP = 0x0101;
        private IntPtr _hookID = IntPtr.Zero;
 
        private IntPtr SetHook(LowLevelKeyboardProc proc)
        {
            using (Process curProcess = Process.GetCurrentProcess())
            using (ProcessModule curModule = curProcess.MainModule)
            {
                return SetWindowsHookEx(WH_KEYBOARD_LL, proc,
                    GetModuleHandle(curModule.ModuleName), 0);
            }
        }
 
        private delegate IntPtr LowLevelKeyboardProc(
            int nCode, IntPtr wParam, IntPtr lParam);
 
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr SetWindowsHookEx(int idHook,
            LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
 
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool UnhookWindowsHookEx(IntPtr hhk);
 
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode,
            IntPtr wParam, IntPtr lParam);
 
        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr GetModuleHandle(string lpModuleName);
 
        private IntPtr HookCallback(
            int nCode, IntPtr wParam, IntPtr lParam)
        {
            Keys key = (Keys)Marshal.ReadInt32(lParam);
 
            //UP key
            if (key == Keys.Up && wParam == (IntPtr)WM_KEYDOWN)
            {
                Console.WriteLine("Стрелка вверх - зажата");
            }
            if (key == Keys.Up && wParam == (IntPtr)WM_KEYUP)
            {
                Console.WriteLine("Стрелка вверх - отпущена");
            }
 
            //DOWN key
            if (key == Keys.Down && wParam == (IntPtr)WM_KEYDOWN)
            {
                Console.WriteLine("Стрелка вниз - зажата");
            }
            else if (key == Keys.Down && wParam == (IntPtr)WM_KEYUP)
            {
                Console.WriteLine("Стрелка вниз - отпущена");
            }
 
 
            //LEFT key
            if (key == Keys.Left && wParam == (IntPtr)WM_KEYDOWN)
            {
              byte[] command = new byte[7] { 0xFF, 0x01, 0x00, 0x04, 0x30, 0x00, 0x35 };
                serialPort1.Write(command, 0, 7);
                Thread.Sleep(1500);
               Console.WriteLine("Стрелка влево - зажата");
            }
            else if (key == Keys.Left && wParam == (IntPtr)WM_KEYUP)
            {
 
                byte[] commandStop = new byte[7] { 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01 };
                serialPort1.Write(commandStop, 0, 7);
                Console.WriteLine("Стрелка влево - отпущена");
            }
 
 
            //RIGHT key
            if (key == Keys.Right && wParam == (IntPtr)WM_KEYDOWN)
            {
                Console.WriteLine("Стрелка вправо - зажата");
            }
            else if (key == Keys.Right && wParam == (IntPtr)WM_KEYUP)
            {
                Console.WriteLine("Стрелка вправо - отпущена");
            }
 
            return CallNextHookEx(_hookID, nCode, wParam, lParam);
        }
 
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            UnhookWindowsHookEx(_hookID);
        }
 
       
 
 
 
 
 
        private void button1_Click(object sender, EventArgs e)
        {
            string temp;
            serialPort1.PortName = ((string)comboBox1.SelectedItem);          
            serialPort1.Parity = (Parity)Enum.Parse(typeof(Parity),(string)comboBox3.SelectedItem);
            temp = ((string)comboBox2.SelectedItem);
            temp = temp.ToString();
            serialPort1.BaudRate = (int.Parse(temp));        
            serialPort1.StopBits = ((StopBits)Enum.Parse(typeof(StopBits),(string)comboBox4.SelectedItem));
            try
            {
                serialPort1.Open();
                button1.Enabled = false;
                button2.Enabled = true;
                button3.Enabled = true;
                button4.Enabled = true;
                button5.Enabled = true;
                button6.Enabled = true;
                button7.Enabled = true;
                button8.Enabled = true;
                button9.Enabled = true;
                button10.Enabled = true;
                button11.Enabled = true;
                button12.Enabled = true;
            }
            catch (InvalidOperationException)
            {                
            }
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            serialPort1.Close();
            button1.Enabled = true;
            button2.Enabled = false;
            button3.Enabled = true;
            button4.Enabled = true;
            button5.Enabled = true;
            button6.Enabled = true;
            button7.Enabled = true;
            button8.Enabled = true;
            button9.Enabled = true;
            button10.Enabled = true;
            button11.Enabled = true;
            button12.Enabled = true;
 
        }
 
        public string SetPortName(string defaultPortName)
        {
            string portName="";
            foreach (string portname in SerialPort.GetPortNames())
            {
                comboBox1.Items.Add(portname); //добавить порт в список  
            }
            comboBox1.SelectedIndex = 0;
            if (portName == "")
            {
                portName = defaultPortName;
            }
            return portName; //возвращает порт по умолчанию
        }
 
        public int SetPortBaudRate(int defaultPortBaudRate)
        {
            string baudRate = "";
            if (baudRate == "")
            {
                baudRate = defaultPortBaudRate.ToString();
            }
            return int.Parse(baudRate);
        }
 
        public Parity SetPortParity(Parity defaultPortParity)
        {
            string parity = "";
            foreach (string paritybit in Enum.GetNames(typeof(Parity)))
            {
                parity = paritybit.ToString();
                comboBox3.Items.Add(parity);
            }
            comboBox3.SelectedIndex = 0;
            if (parity == "")
            {
                parity = defaultPortParity.ToString();
            }
            return (Parity)Enum.Parse(typeof(Parity), parity);
        }
 
        public int SetPortDataBits(int defaultPortDataBits)
        {
            string dataBits = "9600";
            if (dataBits == "")
            {
                dataBits = defaultPortDataBits.ToString();
            }
            return int.Parse(dataBits);
        }
 
        public StopBits SetPortStopBits(StopBits defaultPortStopBits)
        {
            string stopBits = "";
            foreach (string stopbits in Enum.GetNames(typeof(StopBits)))
            {
                stopBits = stopbits.ToString();
                comboBox4.Items.Add(stopbits);
            }
            comboBox4.SelectedIndex = 1;
            if (stopBits == "")
            {
                stopBits = defaultPortStopBits.ToString();
            }
            return (StopBits)Enum.Parse(typeof(StopBits), stopBits);
        }
 
        public  Handshake SetPortHandshake(Handshake defaultPortHandshake)
        {
            string handshake = "";
            foreach (string handshakes in Enum.GetNames(typeof(Handshake)))
            {
                handshake = handshakes;
            }
            if (handshake == "")
            {
                handshake = defaultPortHandshake.ToString();
            }
            return (Handshake)Enum.Parse(typeof(Handshake), handshake);
        }
 
        public void BaudRateget()
        {
            string[] listbaudrate = new string[15];
            listbaudrate[0] = "110";
            listbaudrate[1] = "300";
            listbaudrate[2] = "600";
            listbaudrate[3] = "1200";
            listbaudrate[4] = "2400";
            listbaudrate[5] = "4800";
            listbaudrate[6] = "9600";
            listbaudrate[7] = "14400";
            listbaudrate[8] = "19200";
            listbaudrate[9] = "38400";
            listbaudrate[10] = "56000";
            listbaudrate[11] = "57600";
            listbaudrate[12] = "115200";
            listbaudrate[13] = "128000";
            listbaudrate[14] = "256000";
            comboBox2.Items.AddRange(listbaudrate);
            comboBox2.SelectedIndex = 4;
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {           
            serialPort1.PortName = SetPortName(serialPort1.PortName);
            serialPort1.Parity = SetPortParity(serialPort1.Parity);
            serialPort1.BaudRate = SetPortBaudRate(serialPort1.BaudRate);
            serialPort1.StopBits = SetPortStopBits(serialPort1.StopBits);
            serialPort1.Handshake = SetPortHandshake(serialPort1.Handshake);
            BaudRateget();
        }
 
       
 
        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            string readstring;        
            try
            {
                readstring = serialPort1.ReadLine();
                                                                
            }
            catch (TimeoutException)
            {
            }                      
        }
 
//------------------------------------------------------------------------------
        //Движенеи Камеры
        private void button3_Click(object sender, EventArgs e)// движ Л
        {
            byte[] command = new byte[7] { 0xFF, 0x01, 0x00, 0x04, 0x30, 0x00, 0x35 };
            serialPort1.Write(command, 0, 7);
            Thread.Sleep(1500);
            byte[] commandStop = new byte[7] { 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01 };
            serialPort1.Write(commandStop, 0, 7);
 
        }
        private void button4_Click(object sender, EventArgs e)// движ П
        {
            byte[] command = new byte[7] { 0xFF, 0x01, 0x00, 0x02, 0x30, 0x00, 0x33 };
            serialPort1.Write(command, 0, 7);
            Thread.Sleep(1500);
            byte[] commandStop = new byte[7] { 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01 };
            serialPort1.Write(commandStop, 0, 7);
            
            
        }
 
        private void button5_Click(object sender, EventArgs e)//движ В
        {
            byte[] command = new byte[7] { 0xFF, 0x01, 0x00, 0x08, 0x00, 0x20, 0x29 };
            serialPort1.Write(command, 0, 7);
            Thread.Sleep(1000);
            byte[] commandStop = new byte[7] { 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01 };
            serialPort1.Write(commandStop, 0, 7);
        }
 
        private void button6_Click(object sender, EventArgs e)// движ Н
        {
            byte[] command = new byte[7] { 0xFF, 0x01, 0x00, 0x10, 0x00, 0x20, 0x31 };
            serialPort1.Write(command, 0, 7);
            Thread.Sleep(1000);
            byte[] commandStop = new byte[7] { 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01 };
            serialPort1.Write(commandStop, 0, 7);
        }
//----------------------------------------------------------------------------------------
        //Управление Зумом, фокусом, Ирисом
 
        private void button7_Click(object sender, EventArgs e)// Focus"+"
        {
            byte[] command = new byte[7] { 0xFF, 0x01, 0x01, 0x00, 0x00, 0x00, 0x02 };
            serialPort1.Write(command, 0, 7);
            Thread.Sleep(500);
            byte[] commandStop = new byte[7] { 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01 };
            serialPort1.Write(commandStop, 0, 7);
        }
 
        private void button8_Click(object sender, EventArgs e)// Focus "-"
        {
            byte[] command = new byte[7] { 0xFF, 0x01, 0x00, 0x80, 0x00, 0x00, 0x81 };
            serialPort1.Write(command, 0, 7);
            Thread.Sleep(500);
            byte[] commandStop = new byte[7] { 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01 };
            serialPort1.Write(commandStop, 0, 7);
        }
 
        private void button9_Click(object sender, EventArgs e)//Zoom "+"
        {
            byte[] command = new byte[7] { 0xFF, 0x01, 0x00, 0x20, 0x00, 0x00, 0x21 };
            serialPort1.Write(command, 0, 7);
            Thread.Sleep(500);
            byte[] commandStop = new byte[7] { 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01 };
            serialPort1.Write(commandStop, 0, 7);
        }
 
        private void button10_Click(object sender, EventArgs e)//Zoom"-"
        {
            byte[] command = new byte[7] { 0xFF, 0x01, 0x01, 0x00, 0x00, 0x00, 0x02 };
            serialPort1.Write(command, 0, 7);
            Thread.Sleep(500);
            byte[] commandStop = new byte[7] { 0xFF, 0x01, 0x00, 0x40, 0x00, 0x00, 0x41 };
            serialPort1.Write(commandStop, 0, 7);
        }
 
        private void button11_Click(object sender, EventArgs e)//Iris"+"
        {
            byte[] command = new byte[7] { 0xFF, 0x01, 0x02, 0x00, 0x00, 0x00, 0x03 };
            serialPort1.Write(command, 0, 7);
            Thread.Sleep(500);
            byte[] commandStop = new byte[7] { 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01 };
            serialPort1.Write(commandStop, 0, 7);
        }
 
        private void button12_Click(object sender, EventArgs e)// Iris "-"
        {
            byte[] command = new byte[7] { 0xFF, 0x01, 0x04, 0x00, 0x00, 0x00, 0x05 };
            serialPort1.Write(command, 0, 7);
            Thread.Sleep(500);
            byte[] commandStop = new byte[7] { 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01 };
            serialPort1.Write(commandStop, 0, 7);
        }
 
       
 
        
    }    
}


сделал только для левой стрелки.

вывод в консоль, чтоб смотреть, нажата или нет.

оправьте пожала, что не так написал.
0
2 / 2 / 0
Регистрация: 01.05.2012
Сообщений: 33
04.06.2012, 15:51  [ТС]
Все) спасибо) вопрос решил)
1
0 / 0 / 0
Регистрация: 09.01.2013
Сообщений: 9
09.01.2013, 23:33
Подскажите пожалуйста как оформить команду Query Pan Pozition и Query Pan Position Response. Есть
задача не просто поворачивать камеру но и после каждого поворота делать запрос на предоставление координаты по панараме и получать ответ, в каком виде приходит ответ и в какую переменную его загонять?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 private void UP_MouseDown(object sender, MouseEventArgs e)
        {
 
            byte[] command = new byte[7] { 0xFF, 0x01, 0x00, 0x08, 0x00, 0x20, 0x29 };
            serialPort1.Write(command, 0, 7);
 
           //Query_Pan_Pozition(); ?
           
        }
 
        private void UP_MouseUp(object sender, MouseEventArgs e)
        {
            byte[] commandStop = new byte[7] { 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01 };
            serialPort1.Write(commandStop, 0, 7);
 
          //Query_Pan_Position_Response(); ?
 
        }
DProtocol_Version_5_Revision_1.pdf
Миниатюры
Управление купольной антивандальной камерой по RS-485   Управление купольной антивандальной камерой по RS-485  
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
10.01.2013, 00:01
...странный вопрос, если вы сами привели скрины со страниц 54-55 формата обмена, где по байтам все расписано. Касательно кода, пролистайте тему сначала и до конца.
0
0 / 0 / 0
Регистрация: 09.01.2013
Сообщений: 9
10.01.2013, 01:12
Я не понимаю как получить ответ я делаю запрос отправляю команду а как получить ответ не понимаю

Добавлено через 42 минуты
C#
1
2
3
4
5
6
7
8
9
10
11
12
 public void Query_Pan_Pozition()
        {
            byte[] command = new byte[7] { 0xFF, 0x01, 0x00, 0x51, 0x00, 0x00, 0x52 };
            serialPort1.Write(command, 0, 7);
        }
 
        public void Query_Pan_Pozition_Response()
        {
            byte[] command = new byte[7] { 0xFF, 0x01, 0x00, 0x59, 0x00, 0x00, 0x60 };
            serialPort1.Read(command, 0, 7);
           textBox1.Text = command.ToString();  
        }
Запрос вроде проходит, по крайней мере на камере мигает лампочка, а при ответе прога зависает!!!!
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
10.01.2013, 08:59
...в теме выше приведен полный рабочий код и записи и чтения.
0
0 / 0 / 0
Регистрация: 09.01.2013
Сообщений: 9
10.01.2013, 11:56
Если вы про это:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            string readstring;        
            try
            {
                readstring = serialPort1.ReadLine();
                textBox1.Text = readstring; 
                                                                
            }
            catch (TimeoutException)
            {
            }
           
        }
так не работает!
Как я понимаю необходимо получить 5 и 6 бит из ответа (responce)?
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
10.01.2013, 12:04
...а так значит работает? Пост #57:
C#
1
2
byte[] command = new byte[7] { 0xFF, 0x01, 0x00, 0x59, 0x00, 0x00, 0x60 };
            serialPort1.Read(command, 0, 7);
Может в справку по методам SerialPort заглянем? Что есть что в параметрах.

Как я понимаю необходимо получить 5 и 6 бит из ответа (responce)?
cначала правильно сформируйте свой запрос по Write() согласно формата пакета из таблицы для Query Pan Pozition.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.01.2013, 12:04

OpenGL Управление камерой
Здравствуйте уважаемые форумчане! Очень нужен ваш совет. Ситуация заключается в следюющем. Я начал изучение opengl, сейчас разбираюсь с...

Управление камерой в opengl
Здравствуйте, я на си пишу программу на opengl, создал простенький 3д мир, состоящий из 4 кубиков. Хочу сделать, чтобы можно было при...

Управление камерой в OpenGl
Не первый день интересуюсь программированием на OpenGL, но до сих пор не смог организовать такую простую вещь как управление камерой, как...

Управление камерой на андроид
Объясните, плиз, как сделать управление FreeLookCamera от третьего лица в андроид перемещая пальцем по экрану:help::help::help: Я...

Управление камерой на OS Android
Ребята всем привет! Хочу разработать похожую инсталляцию: https://vimeo.com/123304375 Программирую давно не с разработкой...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru