Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.10.2012, 08:41   #1
russervik
 
Регистрация: 10.10.2012
Сообщений: 6
По умолчанию Работа с прибором через COM порт

У меня есть прибор http://www.stetho.ru/index/portativnyj_ehkg/0-25, который замеряет ЭКГ,пульс...Прибор китайский,никакого протокола,да и вообще какой либо информации о его взаимодействии с компьютером нигде нет. Подключение между ПК и прибором осуществляется через кабель mini USB, при подключении создается COM порт. В комплекте с приборчиком шла программка-наипростейшая, которая принимает данные с прибора. Используя сниферры и собственные додумки и догадки,я выяснил, какие команды отправляются прибору и какими данными отвечает прибор.Есть программка,которую я писал для диплома, она может принимать данные с прибора и отображать их. Сейчас возникла потребность в доработке дипломного проекта, необходимо отправлять на удаленный сервер данные каждого измерения.И так,что у меня есть-три кнопки "Получить серийный номер","Получить информацию","Получить график". При нажатии любой из этих кнопок, программа отправляет прибору команду,например для получения графика "byte[] bytes = { 85, 170, 5, 198, 203 }", а прибор в свою очередь отправляет обратно 7521 байт данных,где 21 байт служебные и не нужны,поэтому я забираю только 7500,нужные для построения графика ЭКГ и сохраняю их в файл .тхт. Такой же принцип с другими кнопками, меняется только команда и ответ на нее. В идеале мне нужно, при выборе измерения (есть команда запроса количества измерений,всего может быть 200,на основе ответа на команду формируется список в боксе) из бокса-нажать на кнопочку "Сохранить измерение",после чего выходит диалоговое окно,где просит имя файла .тхт и сохраняет данные в выбранную директорию.Образец файла прикреплен-там первые 4 значения серийный номер прибора,следующие 6-день месяц год часы минуты пульс,остальные 7500 значения для построения графика ЭКГ.В данный момент 3 куска данного файла я получаю соответственно 3мя кнопками. Подскажите, пожалуйста, как мне объединить эти кнопки в одну?что использовать?
Вложения
Тип файла: txt Образец 1.txt (10.2 Кб, 130 просмотров)

Последний раз редактировалось russervik; 10.10.2012 в 08:45.
russervik вне форума Ответить с цитированием
Старый 13.10.2012, 19:01   #2
Dan_banan
Пользователь
 
Регистрация: 19.11.2011
Сообщений: 23
По умолчанию

Написать свой контрол или использовать стандартный, который будет подписан на метод, а метод будет реализовывать всю твою логику трех кнопок. Т.е придется перепилить кое что, что бы вся логика сохранения файлов по нажатию каждой кнопки происходила за кулисами, сохранялась например в массив а потом в конце собиралась в один. или ты хотел что бы тут еще код написали за тебя? )
Dan_banan вне форума Ответить с цитированием
Старый 15.10.2012, 07:21   #3
russervik
 
Регистрация: 10.10.2012
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Dan_banan Посмотреть сообщение
Написать свой контрол или использовать стандартный, который будет подписан на метод, а метод будет реализовывать всю твою логику трех кнопок. Т.е придется перепилить кое что, что бы вся логика сохранения файлов по нажатию каждой кнопки происходила за кулисами, сохранялась например в массив а потом в конце собиралась в один. или ты хотел что бы тут еще код написали за тебя? )
"Подскажите, пожалуйста, как мне объединить эти кнопки в одну?что использовать?" - в этом предложении есть просьба написать мне код???Я жду хоть какой то помощи,и как понимаю на этом форуме ее не дождешься..
russervik вне форума Ответить с цитированием
Старый 15.10.2012, 10:29   #4
Reskov
Форумчанин
 
Аватар для Reskov
 
Регистрация: 17.12.2008
Сообщений: 250
По умолчанию

Цитата:
и как понимаю на этом форуме ее не дождешься..
хм...прежде чем злиться, грамотно задавайте вопрос! мне лично не понятно в чем у Вас проблема, если Вы можете получить данные по отдельности так в чем загвоздка объединить эту три действия последовательно по нажатию на одну кнопку?

Как писать в один файл?
Код:
if (File.Exists(path))  {File.Delete(path);}
    
            using (StreamWriter sw = File.CreateText(path)) 
            {
                sw.WriteLine("Button1");
            }	
      
using (StreamWriter sw = File.AppendText(path)) 
        {
            sw.WriteLine("Button2");
        }
Ps если не этот вопрос Вас мучает, переспросите конкретней
Reskov вне форума Ответить с цитированием
Старый 15.10.2012, 13:37   #5
russervik
 
Регистрация: 10.10.2012
Сообщений: 6
По умолчанию

Вот код моей программы :
Код:
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 rude_cute
{
    public partial class MainForm : Form
    {
        List<int> ResponseList;  
        delegate void writer(int o);     
        delegate void runner(object o);
        runner Run;                      
        int selected_record = -1;
     
        public MainForm()
        {
            InitializeComponent();
            ResponseList = new List<int>();            
        }

        private void button5_Click(object sender, EventArgs e)  
        {
            Close();           
        }       

        void ComPort_DataReceived(object sender, SerialDataReceivedEventArgs e) 
        {                                                     
            byte[] bytes = new byte[ComPort.BytesToRead + 1]; 
            writer wr = new writer(writestring);
            int how=ComPort.Read(bytes, 0, ComPort.BytesToRead);          
            for (int i = 0; i < how; i++)
            {       
                Invoke(wr, (int) bytes[i]);
            }       
            if (how > 2)
                if (bytes[how - 1] == 68 && bytes[how - 2] == 69)
                {
                    Invoke(Run,1);
                }
        }

        void writestring(int item)   
        {
           ResponseList.Add(item);
        }
   
        private void Form1_Load(object sender, EventArgs e) 
        {
            
            ComPort.PortName = rude_cute.Properties.Settings.Default.PortName;
            ComPort.BaudRate = rude_cute.Properties.Settings.Default.BaudRate;
            ComPort.DataBits = rude_cute.Properties.Settings.Default.DataBits;
            ComPort.Parity = Parity.None;
            ComPort.StopBits = StopBits.One;           
            ComPort.DataReceived += new SerialDataReceivedEventHandler(ComPort_DataReceived);
            try
            {
                ComPort.Open();
            }
            catch { MessageBox.Show("Подключите прибор и повторите попытку"); Close(); }
            Run = new runner(SetCombobox);
            ResponseList.Clear();
            byte[] bytes = { 85, 170, 2, 2 };
            ComPort.Write(bytes, 0, bytes.Length);         
            comboBox1.Items.Clear();
        }

        private void SetCombobox(object o)  
        {
            if (ComPort.IsOpen)
            {
                for (int i = 200; i > 200 - ResponseList[3]; i--)
                {
                    comboBox1.Items.Add(string.Format("Измерение №{0}", 201-i));
                }
            }           
        }

        void showgraphic(object o)
        {
        }
        private void get_graf_Click(object sender, EventArgs e)  
        {
            int skeep = 5;
            int j = 0;
            Run = new runner(showgraphic);
            ResponseList.Clear();
            byte[] bytes = { 85, 170, 5, 198, 203 };
            bytes[3] = (byte)selected_record;
            bytes[4] = (byte)(selected_record + 5);
            ComPort.Write(bytes, 0, bytes.Length);
            SaveFileDialog sfd2 = new SaveFileDialog();
            sfd2.Filter = "Текстовые файлы (*.txt)|*.txt";
            if (sfd2.ShowDialog() == DialogResult.OK)
            {
                for (int i = skeep; i < ResponseList.Count - 2; i++)
                {
                    j++;
                    if (j == 501) { ResponseList.RemoveAt(i); j = 1; }      
                    if (ResponseList[i] >= 128) ResponseList[i] = -1 * (ResponseList[i] - 128);
                    if (i != skeep)
                    {
                        int val = ResponseList[i] + ResponseList[i - 1];
                        ResponseList[i] = val;
                    }
                }
                int[] var1 = ResponseList.GetRange(5, 7500).ToArray();
                File.AppendAllText(sfd2.FileName, String.Join("|", ResponseList));
            }
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
        {
            ActionPanel.Enabled = false;
            if (comboBox1.SelectedIndex >= 0)
            {
                selected_record = 200 - comboBox1.SelectedIndex;
                ActionPanel.Enabled = true;
            }
            
        }
russervik вне форума Ответить с цитированием
Старый 15.10.2012, 13:38   #6
russervik
 
Регистрация: 10.10.2012
Сообщений: 6
По умолчанию

И еще кусочек:
Код:
      void infor(object o)
        {     
        }
      private void get_info_Click(object sender, EventArgs e) 
        {
            Run = new runner(infor);
            ResponseList.Clear();
            byte[] bytes = { 85, 170, 4, 200, 204 };
            bytes[3] = (byte)selected_record;
            bytes[4] = (byte)(selected_record + 4);
            ComPort.Write(bytes, 0, bytes.Length);
            SaveFileDialog sfd2 = new SaveFileDialog();
            sfd2.Filter = "Текстовые файлы (*.txt)|*.txt";
            if (sfd2.ShowDialog() == DialogResult.OK)
            {
                int[] var2 = ResponseList.GetRange(4, 6).ToArray(); 
                File.AppendAllText(sfd2.FileName, String.Join("|", var2));
            }
        }

        private void ComPort_ErrorReceived(object sender, SerialErrorReceivedEventArgs e)
        {
            MessageBox.Show("Произошлка ошибка", "Внимание!", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

        private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
        {
            try
            {
                ComPort.Close();
            }
            catch { };
        }

        private void cheker_Tick(object sender, EventArgs e)
        {
            if (comboBox1.Items.Count == 0)
            {
                cheker.Enabled = false;
                MessageBox.Show("Прибор отлючен, включите прибор");
                cheker.Enabled = true;
            }
        }

        void GetSerialCode(object o)
        {
        }
        private void get_serial_Click(object sender, EventArgs e)
        {
            ResponseList.Clear(); 
            byte[] bytes = { 85, 170, 1, 1 }; 
            ComPort.Write(bytes, 0, bytes.Length); 
            Run = new runner(GetSerialCode); 
            SaveFileDialog sfd2 = new SaveFileDialog();
            sfd2.Filter = "Текстовые файлы (*.txt)|*.txt";
            if (sfd2.ShowDialog() == DialogResult.OK)
            {
                int[] var3 = ResponseList.GetRange(17, 4).ToArray();
                File.AppendAllText(sfd2.FileName, String.Join("|", var3));
            }
        }                
    }

}
russervik вне форума Ответить с цитированием
Старый 15.10.2012, 13:44   #7
russervik
 
Регистрация: 10.10.2012
Сообщений: 6
По умолчанию

Я запускаю программу,нажимаю последовательно кнопки "Сохранить серийник"-сохраняет то что надо в отдельный файл,затем нажимаю "Сохранить дату,время пульс"-сохраняет отдельным файлом,то что необходимо,затем нажимаю "Сохранить данные графика"-и тут беда,ругается что у меня Get_Range(5,7500) выходит за пределы,если убирать Get_Range, то оказывается у меня принимается лишь 3069 значений графика,вместо положенных 7522.Но если сначала нажимать "Сохранить данные графика",а потом остальные,то работают все кнопки корректно,но после выбора другого измерения данные графика приходят опять не полностью. Как объединить эти три кнопки,если они не могут работать последовательно?Тут что то связано с потоками данных,как я понимаю,и с использованием Runner? Подскажите кто-нибудь,пожалуйста. Протокол обмена данными ПК и прибора прикрепляю (изучал самостоятельно).
Вложения
Тип файла: doc Протокол.doc (43.0 Кб, 7 просмотров)
russervik вне форума Ответить с цитированием
Старый 17.10.2012, 09:25   #8
russervik
 
Регистрация: 10.10.2012
Сообщений: 6
По умолчанию

Неужели никто не поможет?
russervik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача данных через ИК порт DrCluster Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 29.04.2011 20:10
Открыть порт через 2 аппарата twistms Компьютерное железо 0 29.03.2011 23:30
Программа для раборы с измер. прибором на С++ Enigmos Помощь студентам 1 28.08.2009 22:53
Работа с внешними устройствами через COM порт Georgios Помощь студентам 11 11.02.2009 15:59
Подключиться через опрелённый порт SANYO_K Работа с сетью в Delphi 1 27.02.2008 20:56