C# и модуль Ke-USB24A
Формулировка задачи:
Позвольте продемонстрировать насколько легко и удобно делать приложения для модуля Ke-USB24A в середе Microsoft Visual C# 2010 Express. Я не программист, мне было трудно разобраться в нескольких демонстрационных приложениях от разработчика модуля с открытым кодом на С++ и интегрировать в него свои задачи. Приложения написанные в среде Visual C# гораздо понятнее, компактнее и их написание практически сводится к выбору из всплывающих списков нужных в данном месте выражений.
Каждый раз при запуске демо-приложения от разработчика модуля возникала необходимость указать имя виртуального последовательного порта COM, к которому система подключила модуль. Ниже я предлагаю вариант решения этого неудобства - метод SearchKeUSB, который возвращает true, если модуль найден в системе и правильно отвечает на запрос $KE.
Ниже приведен код, демонстрирующий работу метода SearchKeUSB. Если модуль найден, в label1 отображается имя СОМ порта, а в label2 ответ на запрос "$KE,SER\r\n", т.е. серийный номер и версия прошивки модуля. Так же отображается GroupBox c CheckBox-ами. Если модуль не найден (не подключен) отображается сообщение "Модуль не найден", CheckBox-ы скрыты.
На форму нужно добавить SerialPort, пару Label для отображения результата поиска модуля, Button для корректного выхода из приложения, GroupBox – что бы скрыть элементы управления модулем, если он не будет найден и несколько CheckBox (их следует разместить на groupBox1), что бы посылать модулю какие-нибудь запросы (команды). В свойствах serialPort1 нужно установить значения WriteTimeout = 200 и ReadTimeout = 200 (или на ваше усмотрение, вместо -1), чтобы у модуля было время принять запрос, подумать и ответить. Также не забудьте добавить пространство имен System.IO.Ports;
Листинг программы
- bool SearchKeUSB()
- {
- string[] ports = SerialPort.GetPortNames();
- //получаем список портов существующих в системе
- for (int i = 0; i < ports.Length; i++)
- //последовательно опрашиваем полученный список
- {
- serialPort1.PortName = ports[i];
- //присваеваем текущее имя последовательному порту
- serialPort1.Open();
- //открываем соответствующий COM-порт
- try
- {
- //пытаемся отправить модулю запрос, если ответ #OK - модуль найден, выходим из цикла.
- if (WriteRead("$KE\r\n").Substring(0, 3) == "#OK") break;
- }
- catch { }
- serialPort1.Close();
- //если попали сюда - модуль не найден, закрываем текущий порт.
- }
- return serialPort1.IsOpen;
- //возвращает true если модуль найден, иначе false.
- }
- Здесь WriteRead - метод который принимает строку запроса к модулю Ke-USB24A и возвращает строку – ответ модуля:
- string WriteRead(string requiry)
- {
- serialPort1.Write(requiry);
- return serialPort1.ReadLine();
- }
Листинг программы
- 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;
- namespace KeUSB24A_v1_0
- {
- public partial class Form1 : Form
- {
- public Form1()
- {
- InitializeComponent();
- }
- string WriteRead(string requiry)
- {
- serialPort1.Write(requiry);
- return serialPort1.ReadLine();
- }
- bool SearchKeUSB()
- {
- string[] ports = SerialPort.GetPortNames();
- for (int i = 0; i < ports.Length; i++)
- {
- serialPort1.PortName = ports[i];
- serialPort1.Open();
- try
- {
- if (WriteRead("$KE\r\n").Substring(0, 3) == "#OK") break;
- }
- catch { }
- serialPort1.Close();
- }
- return serialPort1.IsOpen;
- }
- private void Form1_Load(object sender, EventArgs e)
- {
- if (SearchKeUSB())
- {
- label1.Text = serialPort1.PortName;
- label2.Text = WriteRead("$KE,SER\r\n");
- }
- else
- {
- label1.Text = "Модуль не найден.";
- groupBox1.Visible = false;
- }
- }
- private void button1_Click(object sender, EventArgs e)
- {
- WriteRead("$KE,RST\r\n");
- if(serialPort1.IsOpen) serialPort1.Close();
- Close();
- }
- private void checkBox1_CheckedChanged(object sender, EventArgs e)
- {
- if (checkBox1.Checked) WriteRead("$KE,WR,19,1\r\n");
- else WriteRead("$KE,WR,19,0\r\n");
- }
- private void checkBox2_CheckedChanged(object sender, EventArgs e)
- {
- if (checkBox2.Checked) WriteRead("$KE,WR,20,1\r\n");
- else WriteRead("$KE,WR,20,0\r\n");
- }
- private void checkBox3_CheckedChanged(object sender, EventArgs e)
- {
- if (checkBox3.Checked) WriteRead("$KE,WR,21,1\r\n");
- else WriteRead("$KE,WR,21,0\r\n");
- }
- private void checkBox4_CheckedChanged(object sender, EventArgs e)
- {
- if (checkBox4.Checked) WriteRead("$KE,WR,22,1\r\n");
- else WriteRead("$KE,WR,22,0\r\n");
- }
- private void checkBox5_CheckedChanged(object sender, EventArgs e)
- {
- if (checkBox5.Checked) WriteRead("$KE,WR,23,1\r\n");
- else WriteRead("$KE,WR,23,0\r\n");
- }
- private void checkBox6_CheckedChanged(object sender, EventArgs e)
- {
- if (checkBox6.Checked) WriteRead("$KE,WR,24,1\r\n");
- else WriteRead("$KE,WR,24,0\r\n");
- }
- }
- }
Решение задачи: «C# и модуль Ke-USB24A»
textual
Листинг программы
- 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.Speech.Recognition;
- using System.Media;
- using System.IO.Ports;
- using System.Threading;
- using System.Net;
- using System.IO;
- using System.Diagnostics;
- public partial class Form1 : Form
- {
- bool flag = false;
- SpeechRecognitionEngine sr;
- SoundPlayer sp = new SoundPlayer();
- GrammarBuilder gb;
- Choices chs = new Choices("exit", "good night", "set light", "hocheesh wordku", "off aplication",
- "zhoppa", "budim pit vodku", "reset", "tamper", "channel 1", "channel 2",
- "set 1", "set 2", "set 3", "set 4", "set 5", "set 6", "set 7", "set 8",
- "off 1", "off 2", "off 3", "off 4", "off 5", "off 6", "off 7", "off 8");
- private void Form1_Load(object sender, EventArgs e)
- {
- SerchKeUSB();
- comboBox1.SelectedIndex = 1;
- comboBox2.SelectedIndex = 4;
- this.Text = comboBox1.SelectedItem.ToString();
- timer1.Start();//старт таймера с запуском программы
- }
- public Form1()
- {
- InitializeComponent();
- sr = new SpeechRecognitionEngine();
- sr.SetInputToDefaultAudioDevice();
- sr.UnloadAllGrammars();
- gb = new GrammarBuilder();
- gb.Append(chs);
- sr.LoadGrammar(new Grammar(gb));
- sr.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(sr_SpeechRecognized);
- sr.RecognizeAsync(RecognizeMode.Multiple);//начинаем распознование
- }
- private void sr_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
- {
- if(checkBox1.Checked)
- {
- label4.Text = e.Result.Text;
- SystemSounds.Asterisk.Play();
- if (label4.Text == "good night") WriteRead("$KE,WR,20,0\r\n");
- if (label4.Text == "set light") WriteRead("$KE,WR,20,1\r\n");
- if (label4.Text == "hocheesh wordku") hocheshwodcu();
- if (label4.Text == "off aplication" || label4.Text == "exit") offAplication();
- if (label4.Text == "reset") Clear();
- if (label4.Text == "tamper")
- {
- string str = WriteRead("$KE,ADC\r\n").Substring(5, 4);
- int t = Convert.ToInt32(str) / 15 - 20;
- label4.Text = t.ToString() + " \u2103";
- }
- if (label4.Text == "channel 1")
- {
- WriteRead("$KE,IO,SET,1,1\r\n");
- WriteRead("$KE,IO,SET,2,1\r\n");
- WriteRead("$KE,IO,SET,3,0\r\n");
- WriteRead("$KE,IO,SET,4,0\r\n");
- WriteRead("$KE,WR,3,0\r\n");
- WriteRead("$KE,WR,4,1\r\n");
- }
- if (label4.Text == "channel 2")
- {
- WriteRead("$KE,IO,SET,1,0\r\n");
- WriteRead("$KE,IO,SET,2,0\r\n");
- WriteRead("$KE,IO,SET,3,1\r\n");
- WriteRead("$KE,IO,SET,4,1\r\n");
- WriteRead("$KE,WR,1,1\r\n");
- WriteRead("$KE,WR,2,0\r\n");
- }
- if (label4.Text == "set 1") WriteRead("$KE,WR,24,1\r\n");
- if (label4.Text == "off 1") WriteRead("$KE,WR,24,0\r\n");
- if (label4.Text == "set 2") WriteRead("$KE,WR,23,1\r\n");
- if (label4.Text == "off 2") WriteRead("$KE,WR,23,0\r\n");
- ...
- if (label4.Text == "set 8") WriteRead("$KE,WR,17,1\r\n");
- if (label4.Text == "off 8") WriteRead("$KE,WR,17,0\r\n");
- if (label4.Text == "zhoppa")
- {
- flag = !flag;
- if (flag)
- {
- for (int i = 1; i < 25; i++)
- WriteRead("$KE,WR," + i + ",1\r\n");
- }
- else
- {
- for (int i = 1; i < 25; i++)
- WriteRead("$KE,WR," + i + ",0\r\n");
- }
- }
- if (label4.Text == "set all") for (int i = 1; i < 25; i++)
- WriteRead("$KE,WR," + i + ",1\r\n");
- label3.Text = WriteRead("$KE,RD,ALL\r\n");
- }
- else label4.Text = "Mic Off";
- }
- void hocheshwodcu()
- {
- for(int k = 0; k < 3; k++)
- {
- for (int i = 5; i < 25; i++)
- {
- WriteRead("$KE,WR," + i + ",1\r\n");
- Thread.Sleep(100);
- }
- for (int i = 5; i < 25; i++)
- {
- WriteRead("$KE,WR," + i + ",0\r\n");
- Thread.Sleep(100);
- }
- }
- //конец змейки
- for (int k = 0; k < 2; k++)
- {
- for (int i = 5; i < 11; i++)
- {
- WriteRead("$KE,WR," + i + ",1\r\n");
- }
- Thread.Sleep(500);
- for (int i = 5; i < 11; i++)
- {
- WriteRead("$KE,WR," + i + ",0\r\n");
- }
- for (int i = 13; i < 25; i++)
- {
- WriteRead("$KE,WR," + i + ",1\r\n");
- }
- Thread.Sleep(500);
- for (int i = 13; i < 25; i++)
- {
- WriteRead("$KE,WR," + i + ",0\r\n");
- }
- }
- for (int k = 0; k < 5; k++)
- {
- for (int i = 5; i < 11; i++)
- {
- WriteRead("$KE,WR," + i + ",1\r\n");
- }
- Thread.Sleep(200);
- for (int i = 5; i < 11; i++)
- {
- WriteRead("$KE,WR," + i + ",0\r\n");
- }
- for (int i = 13; i < 25; i++)
- {
- WriteRead("$KE,WR," + i + ",1\r\n");
- }
- Thread.Sleep(200);
- for (int i = 13; i < 25; i++)
- {
- WriteRead("$KE,WR," + i + ",0\r\n");
- }
- }
- }
- private void btn1_Close(object sender, EventArgs e)
- {
- Clear();
- Close();
- }
- string WriteRead(string zaprosKe)
- {
- serialPort1.Write(zaprosKe);
- string vol = serialPort1.ReadLine();
- return vol;
- }
- void SerchKeUSB()
- {
- string[] ports = SerialPort.GetPortNames();
- for (int i = 0; i < ports.Length; i++)
- {
- serialPort1.PortName = ports[i];
- serialPort1.Open();
- label1.Text = serialPort1.PortName;
- try
- {
- label2.Text = WriteRead("$KE\r\n");
- }
- catch { }
- if (label2.Text.Substring(0, 3) == "#OK")
- {
- label3.Text = WriteRead("$KE,SER\r\n");
- break;
- }
- serialPort1.Close();
- }
- if (label2.Text.Substring(0, 3) != "#OK")
- {
- label1.Text = "Модуль KeUSB-24A не найден";
- }
- }
- void Clear()
- {
- string stroka;
- for (int i = 0; i < 24; i++)
- {
- stroka = string.Format("$KE,IO,SET,{0},0\r\n", i + 1);
- WriteRead(stroka);
- }
- }
- void offAplication()
- {
- Clear();
- //serialPort1.Close();
- Close();
- }
- //Web request////////////////////////////
- private void web_Click(object sender, EventArgs e)
- {
- label5.Text = httpWebRequest();
- }
- private void Start_Click(object sender, EventArgs e)
- {
- timer1.Start();
- }
- private void timer1_Tick(object sender, EventArgs e)
- {
- label5.Text = httpWebRequest();
- timer1.Interval = 1000 * Convert.ToInt32(comboBox2.SelectedItem.ToString());
- }
- private void Stop_Click(object sender, EventArgs e)
- {
- timer1.Stop();
- }
- private void label5_TextChanged(object sender, EventArgs e)
- {
- SystemSounds.Beep.Play();
- string str = label5.Text;
- string[] v = new string[9];
- for (int i = 1; i < 9; i++)
- {
- v[i] = (str.IndexOf(i.ToString()) < 0) ? "0": "1";
- string s = string.Format("$KE,WR,{0},{1}\r\n",(25 - i), v[i]);
- WriteRead(s);
- }
- }
- string httpWebRequest()
- {
- this.Text = comboBox1.SelectedItem.ToString();
- HttpWebRequest myHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create(comboBox1.SelectedItem.ToString());
- try
- {
- HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
- StreamReader myStreamReader = new StreamReader(myHttpWebResponse.GetResponseStream());
- return myStreamReader.ReadToEnd();
- }
- catch
- {
- MessageBox.Show("Сервер " + comboBox1.SelectedItem.ToString() + " не найден.");
- }
- return "Server error";
- }
- private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
- {
- Process.Start(linkLabel1.Text);
- }
- private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
- {
- linkLabel1.Text = comboBox1.SelectedItem.ToString().Substring(0, comboBox1.SelectedItem.ToString().Length-10) + "keusbweb24а.php";
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д