{flv}canscaner100{/flv}

Скачать проект в VS2010

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ScanerCANbus
{
    public partial class Form1 : Form
    {
        //Импорт DLL файлов для консоли
        [DllImport("kernel32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool AllocConsole();
        [DllImport("kernel32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool FreeConsole();

        //Флаг для работы с процессом принятия байтов в консоль
        public bool testConsole = false;

        byte[] bw = new byte[1];

        public Form1()
        {
            InitializeComponent();
            //Обнуляем значение байта для передачи в COMport
            bw[0] = 0;
            //Кнопки не активны при запуске формы
            buttonSendByte.Enabled = false;
            buttonFreeConsole.Enabled = false;
        }

        private void buttonOpenConsole_Click(object sender, EventArgs e)
        {
            //Перемещаем окно программы,чтобы не мешала консоли
            this.Location = new Point(805, 0);
            //Открываем COM port
            if (!serialPort1.IsOpen)
            {
                try
                {
                    serialPort1.Open();

                }
                catch
                {
                    //Если COMport не открылся
                    MessageBox.Show(serialPort1.PortName);
                    return;
                }
            }
            testConsole = true;
            // Запускаем поток с консолью.
            Task.Factory.StartNew(Console);
            //Кнопки активные
            buttonSendByte.Enabled = true;
            buttonFreeConsole.Enabled = true;
            //Кнопка Закрыть не активна
            buttonClose.Enabled = false;
            //Убираем кнопку закрытия программы
            this.ControlBox = false;
        }

        private void buttonFreeConsole_Click(object sender, EventArgs e)
        {
            //Закрываем консоль
            testConsole = false;
            //Делаем кнопки не активными
            buttonSendByte.Enabled = false;
            buttonFreeConsole.Enabled = false;
            //Кнопка Закрыть активна
            buttonClose.Enabled = true;
            //Восстанавливаем кнопки контрола
            this.ControlBox = true;
        }

        private void Console()
        {
            //Временная переменная для записи принятых байт в TextBox
            string result = string.Empty;
            //Новая строка
            result += Environment.NewLine;
            // Запускаем консоль.
            if (AllocConsole())
            {
                //Счетчик
                int count = 0;
                while (testConsole)
                {
                    if (serialPort1.BytesToRead != 0) //Если буфер приема байт не пуст
                    {
                        byte b = (byte)serialPort1.ReadByte(); //Принимаем 1 байт
                        if (b < 0x10) //Добавим 0,т.к. ToString("X") не ставит 0 перед: от 0 до 0х0F
                            result += "0";
                        result += b.ToString("X"); //Преобразуем в HEX
                        result += " ";
                        if (b < 0x10)
                            System.Console.Write("0");
                        System.Console.Write(b.ToString("X"));
                        System.Console.Write(" ");
                        count++;
                        if (count == 2) //Расставим пробелы, чтобы сообщение имело вид CAN
                        {
                            System.Console.Write(" ");
                            result += " ";
                        }
                        if (count == 4)
                        {
                            System.Console.Write(" ");
                            result += " ";
                        }
                        if (count == 5)
                        {
                            System.Console.Write(" ");
                            result += " ";
                        }
                        if (count == 13)
                        {
                            System.Console.Write(Environment.NewLine);
                            result += Environment.NewLine;
                            count = 0;
                        }
                    }
                }
                //Закроем консоль
                FreeConsole();
                // Выводим данные в textBox
                Action action = () => textBox1.Text += result;
                if (InvokeRequired)
                    Invoke(action);
                else
                    action();
            }
        }
        private void buttonSendByte_Click(object sender, EventArgs e)
        {
            //Для теста отправим байт в COMport-такой же байт должен вернуть контроллер
            serialPort1.Write(bw, 0, 1);
            //Увеличим на 1 байт,чтобы при нажатии кнопки второй раз,отправить другой байт
            bw[0]++;
        }

              private void textBox1_KeyDown(object sender, KeyEventArgs e)
        {
            //Если вводить символы с клавиатуры в TextBox, то они будут отправляться в COMport и обратно в консоль
            bw[0] = (byte)e.KeyCode;
            serialPort1.Write(bw, 0, bw.Length);
        }

        private void buttonClose_Click(object sender, EventArgs e)
        {
            //если COMport открыт - закрываем его.
            if (serialPort1.IsOpen)
            {
                serialPort1.Close();
            }
            //Закрываем Форму
            this.Close();
        }
    }
}