SerialPort в C#
Формулировка задачи:
Ребята помогите с несколькими примерами обработки входящих данных на COM port. просмотрел кучу разных примеров в гугле и так не понял не чего. Меня интересует как можно обработать массив данных поступающих на порт используя WinForm b serialport.read(byte), serialport.read(char), На порт приходят данные в таком формате с0 23 45 65 78 23 56 с1
Решение задачи: «SerialPort в C#»
textual
Листинг программы
// При подключении к порту соединится с загрусчиком, считать сигнатуру и заполнить поля.
private void Boot_Init()
{
// Буфер данных
char[] Byte_Data = new char[16];
// Команда для подключения к загрузчику
char[] Com_S = new char[] { 'S' };
// Команда получить сигнатуру МК
char[] Com_s = new char[] { 's' };
// Если выбран программный переход к загрузчику.
if (Prog_Boot.Checked == true)
{
// Конвертация приклодной команды в char массив для вывода
for (int i = 0; i < Comanda.Text.Length; i++)
{
Byte_Data[i] = Convert.ToChar(Comanda.Text[i]);
}
// Передача приклодной команды основной программе
serialPort1.Write(Byte_Data, 0, Comanda.Text.Length);
// Индикация состояния работы программы
Info.Text = "Команда";
// Установка времени ожидания перехода МК от основной программы к загрузчику
serialPort1.ReadTimeout = (Convert.ToInt32(Seconds.Text, 16) * 1000);
try
{
// Чтение ответа от загрузчика
serialPort1.Read(Byte_Data, 0, Byte_Data.Length);
// Если переход к загрузчику удачный, проверяем на правильный ответ
if (Byte_Data[0] != 0xAA)
{
// Если ответ не верный (Скорее всего неправильный битрейт)
// Вывод состояния работы программы, закрыть порт и выйти из функции
Info.Text = "Нет ответа";
ErrorCOM();
return;
}
}
catch
{
// Выход по таймауту
// Вывод состояния работы программы, закрыть порт и выйти из функции
Info.Text = "Нет ответа";
ErrorCOM();
return;
}
}
// Подключение к загрузчику
// таймаут пол секунды
serialPort1.ReadTimeout = 500;
// Передать команду подключения к загрузчику
serialPort1.Write(Com_S, 0, 1);
try
{
// Получить ответ (Без разницы какой)
serialPort1.Read(Byte_Data, 0, Byte_Data.Length);
}
catch
{
// Выход по таймауту
// Вывод состояния работы программы, закрыть порт и выйти из функции
Info.Text = "Нет ответа";
ErrorCOM();
return;
}
// таймаут пол секунды
serialPort1.ReadTimeout = 500;
// Команда на получение сигнатуры
serialPort1.Write(Com_s, 0, 1);
// Чтение из порта
serialPort1.Read(Byte_Data, 0, Byte_Data.Length);
try
{
// Если сигнатура от Mega8 вывести значения
if ((Byte_Data[0] == 0x07) & (Byte_Data[1] == 0x93))
{
Chip_Signatura.Text = "1E 93 07";
Chip_type.Text = "ATMega8";
Chip_flash.Text = "8";
}
else
{
// Выход по таймауту
// Вывод состояния работы программы, закрыть порт и выйти из функции
Info.Text = "Нет ответа";
ErrorCOM();
return;
}
}
catch
{
// Выход по таймауту
// Вывод состояния работы программы, закрыть порт и выйти из функции
Info.Text = "Нет ответа";
ErrorCOM();
return;
}
// Если все команды отработали нормально
Info.Text = "Подключен";
}