Всем котанам привет!Прошу о помощи!У меня есть прибор http://www.stetho.ru/index/portativnyj_ehkg/0-25, который замеряет ЭКГ,пульс...Прибор китайский,никакого протокола,да и вообще какой либо информации о его взаимодействии с компьютером нигде нет. Подключение между ПК и прибором осуществляется через кабель mini USB, при подключении создается COM порт. В комплекте с приборчиком шла программка-наипростейшая, которая принимает данные с прибора. Используя сниферры и собственные додумки и догадки,я выяснил, какие команды отправляются прибору и какими данными отвечает прибор.Есть программка,которую я писал для диплома, она может принимать данные с прибора и отображать их. Сейчас возникла потребность в доработке дипломного проекта, необходимо отправлять на удаленный сервер данные каждого измерения.И так,что у меня есть-три кнопки "Получить серийный номер","Получить информацию","Получить график". При нажатии любой из этих кнопок, программа отправляет прибору команду,например для получения графика "byte[] bytes = { 85, 170, 5, 198, 203 }", а прибор в свою очередь отправляет обратно 7522 байт данных,где 22 байта служебные и не нужны,поэтому я забираю только 7500,нужные для построения графика ЭКГ и сохраняю их в файл .тхт. Такой же принцип с другими кнопками, меняется только команда и ответ на нее. В идеале мне нужно, при выборе измерения (есть команда запроса количества измерений,всего может быть 200,на основе ответа на команду формируется список в боксе) из бокса-нажать на кнопочку "Сохранить измерение",после чего выходит диалоговое окно,где просит имя файла .тхт и сохраняет данные в выбранную директорию.Образец файла прикреплен-там первые 4 значения серийный номер прибора,следующие 6-день месяц год часы минуты пульс,остальные 7500 значения для построения графика ЭКГ.В данный момент 3 куска данного файла я получаю соответственно 3мя кнопками. Подскажите, пожалуйста, как мне объединить эти кнопки в одну?что использовать?Я запускаю программу,нажимаю последовательно кнопки "Сохранить серийник"-сохраняет то что надо в отдельный файл,затем нажимаю "Сохранить дату,время пульс"-сохраняет отдельным файлом,то что необходимо,затем нажимаю "Сохранить данные графика"-и тут беда,ругается что у меня Get_Range(5,7500) выходит за пределы,если убирать Get_Range, то оказывается у меня принимается лишь 3069 значений графика,вместо положенных 7522.Но если сначала нажимать "Сохранить данные графика",а потом остальные,то работают все кнопки корректно,но после выбора другого измерения данные графика приходят опять не полностью. Как объединить эти три кнопки,если они не могут работать последовательно?Протокол обмена данными ПК и прибора прикрепляю (изучал самостоятельно).
Вот и весь код программы:
Вот и весь код программы:
Код: Выделить всё
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;
}
}
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));
}
}
}
}- Вложения
-
- Образец.txt
- (21.46 КБ) 213 скачиваний
-
- Протокол.doc
- (43 КБ) 364 скачивания