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

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

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

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

Есть антивандальная камера. У нее есть интрефейс управления 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.05.2012, 18:05
Ответы с готовыми решениями:

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

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

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

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

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

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

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

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

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

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

и скрин
Управление купольной антивандальной камерой по RS-485
0
10231 / 6609 / 498
Регистрация: 28.12.2010
Сообщений: 21,156
Записей в блоге: 1
16.05.2012, 20:52 43
...последний замер для LEFT не совпал с постом #38.

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

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


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

подскажите пожалуйста. как поставить задержку, чтоб при нажатии на кнопку, отправлялось 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  [ТС] 47
Цитата Сообщение от Orgi243 Посмотреть сообщение
нет, не заработала, видимо нужно отправить посылку с нулями в начале.Вложение 152796

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

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

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


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

Вот полностью рабочая программа в исходнике Управление камерой с использованием Мыши.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
10231 / 6609 / 498
Регистрация: 28.12.2010
Сообщений: 21,156
Записей в блоге: 1
18.05.2012, 18:31 50
...ну дык, это не сложно. Раз посылка одиночного "пакета ДЕЙСТВИЕ" запускает в работу камеру до упора пока не будет послан "пакет 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  [ТС] 51
а есть исходник какой-нибудь?
0
10231 / 6609 / 498
Регистрация: 28.12.2010
Сообщений: 21,156
Записей в блоге: 1
18.05.2012, 18:44 52
http://msdn.microsoft.com/en-u... s.85).aspx
0
2 / 2 / 0
Регистрация: 01.05.2012
Сообщений: 33
02.06.2012, 14:32  [ТС] 53
Здравствуйте.

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

вот код.
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  [ТС] 54
Все) спасибо) вопрос решил)
1
0 / 0 / 0
Регистрация: 09.01.2013
Сообщений: 9
09.01.2013, 23:33 55
Подскажите пожалуйста как оформить команду 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
10231 / 6609 / 498
Регистрация: 28.12.2010
Сообщений: 21,156
Записей в блоге: 1
10.01.2013, 00:01 56
...странный вопрос, если вы сами привели скрины со страниц 54-55 формата обмена, где по байтам все расписано. Касательно кода, пролистайте тему сначала и до конца.
0
0 / 0 / 0
Регистрация: 09.01.2013
Сообщений: 9
10.01.2013, 01:12 57
Я не понимаю как получить ответ я делаю запрос отправляю команду а как получить ответ не понимаю

Добавлено через 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
10231 / 6609 / 498
Регистрация: 28.12.2010
Сообщений: 21,156
Записей в блоге: 1
10.01.2013, 08:59 58
...в теме выше приведен полный рабочий код и записи и чтения.
0
0 / 0 / 0
Регистрация: 09.01.2013
Сообщений: 9
10.01.2013, 11:56 59
Если вы про это:
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
10231 / 6609 / 498
Регистрация: 28.12.2010
Сообщений: 21,156
Записей в блоге: 1
10.01.2013, 12:04 60
...а так значит работает? Пост #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
10.01.2013, 12:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.01.2013, 12:04
Помогаю со студенческими работами здесь

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

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

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

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

Управление камерой через USB
Существует ли библиотека для управления камерой через USB ? (камера Panasonic DVD-юшная)

Управление камерой Sample Scenes
В юнити есть сцена Roller Ball из Sample Scenes, на которой есть два тачпада, один управляет...

Подключение и управление usb-камерой
Здравствуйте. Если вопрос поднимался, киньте ссылкой Где можно посмотреть про подключение и...


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

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