C# и модуль Ke-USB24A

Узнай цену своей работы

Формулировка задачи:

Позвольте продемонстрировать насколько легко и удобно делать приложения для модуля Ke-USB24A в середе Microsoft Visual C# 2010 Express. Я не программист, мне было трудно разобраться в нескольких демонстрационных приложениях от разработчика модуля с открытым кодом на С++ и интегрировать в него свои задачи. Приложения написанные в среде Visual C# гораздо понятнее, компактнее и их написание практически сводится к выбору из всплывающих списков нужных в данном месте выражений. Каждый раз при запуске демо-приложения от разработчика модуля возникала необходимость указать имя виртуального последовательного порта COM, к которому система подключила модуль. Ниже я предлагаю вариант решения этого неудобства - метод SearchKeUSB, который возвращает true, если модуль найден в системе и правильно отвечает на запрос $KE.
        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();
        }
Ниже приведен код, демонстрирующий работу метода 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;
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";
 }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.1 из 5
Похожие ответы