Comunicação Serial
Dia desses, por demanda de um projeto, resolvi criar um programa do tipo linha de comando, para enviar dados através da porta serial. Agora publico o dito, incluindo, como é de lei nesse blog, os fontes.
Para usar o programa, basta fazer o download e copiá-lo para alguma pasta (ia escrevendo "diretório", estou ficando velho...) e usar.
serialcomm -pCOM4 -b9600 -ddadosaenviar -w
Nesse caso o sistema enviará pela porta (-p) COM4, a uma taxa de (-b) 9600 bauds a sequencia de caracteres dadosaenviar (-d). Em seguida esperará (-w) que algum dado seja enviado de volta pela porta, encerrando com CRLF (char(13),char(10)). A sequência enviada sera escrita na tela e então o programa terminará. O parâmetro -w é, obviamente, opcional.
Pode-se também optar por enviar um arquivo em disco inteiro pela porta, para tanto:
serialcomm -pCOM4 -b9600 -farquivo.txt
sendo arquivo.txt o arquivo cujo conteúdo deverá ser enviado pela porta.
É isso. Abaixo, o fonte. Observem que eu usei uma lib chamada CommandLine para implementar o tratamento dos comandos enviados pelo usuário pela linha de comando. Eu acho esse lib sensacional, então aí vai para quem tiver interesse o link para a dita: http://commandline.codeplex.com/
Para usar o programa, basta fazer o download e copiá-lo para alguma pasta (ia escrevendo "diretório", estou ficando velho...) e usar.
serialcomm -pCOM4 -b9600 -ddadosaenviar -w
Nesse caso o sistema enviará pela porta (-p) COM4, a uma taxa de (-b) 9600 bauds a sequencia de caracteres dadosaenviar (-d). Em seguida esperará (-w) que algum dado seja enviado de volta pela porta, encerrando com CRLF (char(13),char(10)). A sequência enviada sera escrita na tela e então o programa terminará. O parâmetro -w é, obviamente, opcional.
Pode-se também optar por enviar um arquivo em disco inteiro pela porta, para tanto:
serialcomm -pCOM4 -b9600 -farquivo.txt
sendo arquivo.txt o arquivo cujo conteúdo deverá ser enviado pela porta.
É isso. Abaixo, o fonte. Observem que eu usei uma lib chamada CommandLine para implementar o tratamento dos comandos enviados pelo usuário pela linha de comando. Eu acho esse lib sensacional, então aí vai para quem tiver interesse o link para a dita: http://commandline.codeplex.com/
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO.Ports; using CommandLine; using CommandLine.Text; namespace SerialComm { sealed class Program { private static readonly HeadingInfo _headingInfo = new HeadingInfo("SerialComm", "0.9"); private sealed class Options : CommandLineOptionsBase { [Option("p", "serialport", DefaultValue = "COM4", HelpText = "Serial port to be used (default=COM4).")] public string SerialPort { get; set; } [Option("b", "baudrate", DefaultValue = "9600", HelpText = "Speed to be used (bauds, default=9600).")] public string BaudRate { get; set; } [Option("d", "data", Required = true, HelpText = "Data to be sent.")] public string Data { get; set; } [Option("f", "filename", Required = false, HelpText = "Name of the file containing data to be sent.")] public string FileName { get; set; } [Option("w", "wait", HelpText = @"I will wait for data sending back. Sent data will be shown after end of transmition (/r/n ($D$A).")] public bool Wait { get; set; } [HelpOption] public string GetUsage() { var help = new HelpText { Heading = _headingInfo, Copyright = new CopyrightInfo("Mauro Assis (assismauro@hotmail.com)", 2012), AdditionalNewLineAfterOption = true, AddDashesToOption = true }; help.AddOptions(this); return help; } } static SerialPort serial = null; static Options options = new Options(); static void SendData() { try { serial.Write(options.Data); } catch (Exception ex) { Console.WriteLine(string.Format("Error sending data to {0}: {1}", options.SerialPort, ex.Message)); } } static void SendFile() { try { byte[] binaryData = System.IO.File.ReadAllBytes(options.FileName); serial.Write(binaryData, 0, binaryData.Length); } catch (Exception ex) { Console.WriteLine(string.Format("Error sending file {0} to {1}: {2}",options.FileName, options.SerialPort, ex.Message)); } } static void WaitForReply() { string receivedData=serial.ReadLine(); Console.WriteLine("Answer:"); Console.WriteLine(receivedData); } static bool CreateSerialObject() { try { serial = new SerialPort(options.SerialPort, Convert.ToInt32(options.BaudRate)); serial.Open(); } catch (Exception ex) { Console.WriteLine(string.Format("Error acessing {0}: {1}", options.SerialPort, ex.Message)); return false; } return true; } static void Main(string[] args) { options = new Options(); var parser = new CommandLineParser(new CommandLineParserSettings(Console.Error)); if (!parser.ParseArguments(args, options)) Environment.Exit(1); if (CreateSerialObject()) if (options.Data != string.Empty) { SendData(); if (options.Wait) WaitForReply(); serial.Close(); } else SendFile(); } } }
Comentários
Postar um comentário