На работе возникла задача программирования судового GPS приемника. Необходимо посылать в com-порт последовательность байт в hex, но нет приложения для работы с com-портом. Я решил написать его на c# и написал. Теперь делюсь кодом и приложением.
Код:
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.IO;
namespace ERNC_COMPort
{
public partial class Form1 : Form
{
string str;
delegate void SetTextCallback(string text);
public Form1()
{
InitializeComponent();
}
//**** **** **** **** **** **** **** **** **** ****
private void SetText(string text)
{
if (this.textBox1.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else
{
textBox1.Text += text + @"\r\n";
}
}
//**** **** **** **** **** **** **** **** **** ****
private void Form1_Load(object sender, EventArgs e)
{
try
{
string[] availablePorts = SerialPort.GetPortNames();
foreach (string port in availablePorts)
{
comboBox5.Items.Add(port);
}
comboBox5.Text = comboBox5.Items[0].ToString();
comboBox4.Text = "1";
serialPort1.StopBits = StopBits.One;
serialPort1.DataBits = 8;
serialPort1.BaudRate = 9600;
serialPort1.PortName = comboBox5.Text;
serialPort1.Parity = Parity.None;
serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
groupBox2.Visible = false;
groupBox5.Visible = false;
}
catch (Exception e9)
{
MessageBox.Show(e9.Message);
}
}
//**** **** **** **** **** **** **** **** **** ****
void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
byte[] b = new byte[128];
serialPort1.Read(b, 0, b.Length);
SetText(Encoding.ASCII.GetString(b));
}
catch (Exception e3)
{
MessageBox.Show(e3.Message);
}
}
//**** **** **** **** **** **** **** **** **** ****
private void button1_Click(object sender, EventArgs e)
{
try
{
serialPort1.Open();
if (serialPort1.IsOpen)
{
groupBox2.Visible = true;
groupBox5.Visible = true;
button1.Enabled = false;
button5.Enabled = true;
}
}
catch (Exception e1)
{
MessageBox.Show(e1.Message);
}
}
//**** **** **** **** **** **** **** **** **** ****
private void comboBox5_SelectedIndexChanged(object sender, EventArgs e)
{
comboBox5.Text = comboBox5.SelectedItem.ToString();
serialPort1.PortName = comboBox5.Text;
}
//**** **** **** **** **** **** **** **** **** ****
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
comboBox1.Text = comboBox1.SelectedItem.ToString();
serialPort1.BaudRate = Int32.Parse(comboBox1.Text);
}
//**** **** **** **** **** **** **** **** **** ****
private void button2_Click(object sender, EventArgs e)
{
try
{
string[] tmp = textBox3.Text.Split(new char[] { ' ' });
byte[] a = new byte[tmp.Length];
for (int i = 1; i < tmp.Length; i++)
{
a[i] = Convert.ToByte(tmp[i], 16);
}
serialPort1.Write(a, 0, a.Length);
textBox2.Text += " " + textBox3.Text;
}
catch (Exception e7)
{
MessageBox.Show(e7.Message);
}
}
//**** **** **** **** **** **** **** **** **** ****
private void button5_Click(object sender, EventArgs e)
{
try
{
serialPort1.Close();
if (!serialPort1.IsOpen)
{
button1.Enabled = true;
button5.Enabled = false;
groupBox2.Visible = false;
groupBox5.Visible = false;
textBox1.Text = "";
textBox2.Text = "";
textBox3.Text = "";
}
}
catch (Exception e2)
{
MessageBox.Show(e2.Message);
}
}
//**** **** **** **** **** **** **** **** **** ****
private void button3_Click(object sender, EventArgs e)
{
BinaryWriter bw = null;
FileStream fs = null;
try
{
string tmp = DateTime.Now.ToString().Replace(":", "_");
tmp = tmp.Replace(".", "_");
tmp = tmp.Replace(" ", "_");
fs = File.Open(@"r_" + tmp + ".txt", FileMode.CreateNew, FileAccess.Write);
bw = new BinaryWriter(fs);
bw.Write(textBox1.Text);
MessageBox.Show("Успешно!");
}
catch (Exception e4)
{
MessageBox.Show(e4.Message);
}
finally
{
bw.Close();
fs.Close();
}
}
//**** **** **** **** **** **** **** **** **** ****
private void button4_Click(object sender, EventArgs e)
{
BinaryWriter bw = null;
FileStream fs = null;
try
{
string tmp = DateTime.Now.ToString().Replace(":", "_");
tmp = tmp.Replace(".", "_");
tmp = tmp.Replace(" ", "_");
fs = File.Open(@"t_" + tmp+ ".txt", FileMode.CreateNew, FileAccess.Write);
bw = new BinaryWriter(fs);
bw.Write(textBox2.Text);
MessageBox.Show("Успешно!");
}
catch (Exception e5)
{
MessageBox.Show(e5.Message);
}
finally
{
bw.Close();
fs.Close();
}
}
//**** **** **** **** **** **** **** **** **** ****
private void button6_Click(object sender, EventArgs e)
{
string tmp = comboBox6.Text + comboBox7.Text;
textBox3.Text += " " + tmp;
}
//**** **** **** **** **** **** **** **** **** ****
private void comboBox3_SelectedIndexChanged(object sender, EventArgs e)
{
try
{
if (comboBox3.Text == "нет - 00")
{
serialPort1.Parity = Parity.None;
}
else if (comboBox3.Text == "четный")
{
serialPort1.Parity = Parity.Even;
}
else if (comboBox3.Text == "нечетный")
{
serialPort1.Parity = Parity.Odd;
}
else serialPort1.Parity = Parity.None;
}
catch (Exception e6)
{
MessageBox.Show(e6.Message);
}
}
//**** **** **** **** **** **** **** **** **** ****
private void comboBox4_SelectedIndexChanged(object sender, EventArgs e)
{
try
{
if (comboBox4.Text == "1")
{
serialPort1.StopBits = StopBits.One;
}
else if (comboBox4.Text == "1.5")
{
serialPort1.StopBits = StopBits.OnePointFive;
}
else if (comboBox4.Text == "2")
{
serialPort1.StopBits = StopBits.Two;
}
}
catch (Exception e8)
{
MessageBox.Show(e8.Message);
}
}
//**** **** **** **** **** **** **** **** **** ****
}
}
Приложение
В архиве лежат эмулятор COM порта и эмулятор COM устройства. Очень хорошие.
Исходники проекта
Если есть вопросы или предложения пишите в коментах.
Комментарии (15)
RSS свернуть / развернутьПодскажите. Как отправить на модем команду. Например. ATDT +79XXXXXXXX
И как увидеть полученный ответ?
kain
admin
admin
kain
Необходимо реализовать:
1.Программа свернута в трее, при нажатии на нее открывается меню настроек сканера (номер порта, скорость, размер байта ...)
2.При сканировании информация (в моем случае серийный номер) должен попадать в место где установлен курсор при печати (будь то ячейка в excel или поле формы на сайте)
Подскажите пожалуйста в какую сторону копать.
Pandemonium
1. Посмотрите вот это, подробно описано сворачивание в трей, про иконку и меню. Меню создадите свое. Или вот этот ресурс.
2. Думаю подойдет это. Вам надо будет получать значение активной ячейки (ActiveCell) и потом смещаться после вставки на новую.
Вообще много информации в интернете по Вашим вопросам. Что касается COM порта, то того, что я описал выше в данном блоге будет достаточно.
Будут трудности обращайтесь.
P.S. Если это возможно, после того как справитесь с проектом, не могли бы Вы опубликовать статью на эту тему на данном сайте. Буду очень признателен.
admin
admin
Pandemonium
1. Получить активное окно (смотреть в сторону GetGUIThreadInfo() или GetForegroundWindow())
2. У активного окна получить поле ввода с фокусом или переместиться в него (может быть вот это)
3. Вставить значение.
mastersoftna
1. Программа работает в фоновом режиме
2. Пришел серийный номер по COM
3. Эмулируя клавиатуру пишем то что получили
4. Ожидаем следующего серийника в фоновом режиме
Эмулировать нажатие вроде может SendKeys.Send. Но какие могут быть минусы в таком подходе?
Pandemonium
mastersoftna
mastersoftna
Пример 2: Поиск процесса
mastersoftna
Pandemonium
mahnati89
mahnati89
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.