|
|

|
|
'// Utilizar VStudio 2010 Beta 2, con este código. ' '// El propósito de este código es mostrar el uso '// de los indicadores de enumeraciones utilizando '// conversiones hexadecimales (por ejemplo!). '// '// (c)(r) :-) PepLluis 2009
'// Para entender este ejemplo, imagina que '// necesitas controlar algún dispositivo, ya sea '// a través de Ethernet, USB o Puerto Serie, para '// Supervisar or controlar las operaciones de '// paro o marcha, trabando solo con dos bytes... '// el primero de ellos mapeando los bits de '// salida y el segundo los de entrada, después '// de esto solo necesitaras enviar el byte de '// salida al dispositivo o supervisar la entrada '// cuando se produzca un cambio en su valor.
'// Este ejemplo además muestra el uso de '// la continuación implícita de línea y los '// inicializadores para poder añadir todos los '// Controles necesarios en el form, en un solo '// golpe..
'// Los comentarios y el código están en Ingles '// por tema de difusión, no dudes en pedírmelos '// en Castellano, si lo consideras oportuno
|
'// Test this code with Visual Studio 2010 Beta 2. ' '// the purpose of this code is just show and play '// with flag's enumerations and play using '// hexadecimals conversions. '// '// (C)(R) :-) PepLluis 2009
'// To understand this sample... imagine you need '// control some devices using Ethernet, USB or '// Serial Ports to supervise and set/reset their '// status with start/stop operations, just two '// bytes... the first one to map input bits '// and the second to map output bits, after '// this you only need send output byte to device '// or supervise received byte when value change.
'// this sample also show how use implicit line '// continuation and initializers to add controls '// in one shot in load event (for example).
|
|
|
|

Y aqui el Codigo...
'Define input channel
<FlagsAttribute()> Public Enum InputChannel
PowerAlarm = 1
LowVoltage = 2
HighVoltage = 4
OverCurrent = 8
PowerGood = 16
ShortCircuit = 32
WithoutLoad = 64
OutOfService = 128
End Enum
'' Define output channel
<FlagsAttribute()> Public Enum OutputChannel
Engine_Axis1 = 1
Engine_Axis2 = 2
Engine_Axis3 = 4
Smoke_Vent = 8
Refrigerator = 16
Blast_Furnace = 32
TransPort_Belt = 64
Emergency_Stop = 128
End Enum
'// You can add dynamically items to enum and no changes are needed inside code... just rebuild
'
Public Class FlagsEnumerationSample
Private Sub When_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Title
Me.Text = "Playing with Flag's Enum's"
'Add all labels and textbox in one shot
Me.Controls.AddRange({New Label With {.Name = "lblHexcaptn",
.AutoSize = True,
.Location = New Point(5, 10),
.Text = "Output Value:"},
New Label With {.Name = "lblHexValue",
.AutoSize = True,
.Location = New Point(75, 10),
.Text = "0x00", .Height = 20},
New Label With {.Name = "lblInputVal",
.AutoSize = True,
.Location = New Point(140, 10),
.Text = "Input Value : 0x"},
New TextBox With {.Name = "txtInputVal",
.MaxLength = 2,
.Width = 20,
.Location = New Point(220, 8),
.Text = "00"}
})
'Add one customized button for every item in enumeration
Dim NextPos As Integer = 30 'Point for this button (30=initial top pos)
For Each elem In [Enum].GetValues(GetType(OutputChannel)) 'iterate output enum
Me.Controls.Add(New CustomButton(New Point(20, NextPos), elem)) 'add new button with new point position for elem
AddHandler Me.Controls(elem.ToString).Click, AddressOf OutPutOnOff 'When button is click put output on/off
NextPos += Me.Controls(elem.ToString).Height 'Calculate next point location for next elem
Next
NextPos = 30 'Initial top pos for first element
For Each elem In [Enum].GetValues(GetType(InputChannel)) 'Iterate input enum
Me.Controls.Add(New CustomLabel(New Point(160, NextPos), elem)) 'Add customized label for any bit input in enum
NextPos += Me.Controls(elem.ToString).Height 'Calculate location for next label
Next
'Simulate input value... refresh labels when textbox value change
AddHandler Me.Controls("txtInputVal").TextChanged, AddressOf InputsOnOff
Me.Height = NextPos + 50 'Fix form height, after last control + 50
End Sub
Private Outputs As Byte = 0 'Output channel (Byte)
'
'Change On/Off output bit status of sender
'remark : TAG property of button is used as bit weight
Sub OutPutOnOff(ByVal sender As System.Object, ByVal e As System.EventArgs)
If Outputs And CType(sender, Button).Tag Then 'Flic /Flac output bit
Outputs = Outputs Xor CType(sender, Button).Tag 'Set Off if On
sender.BackColor = Color.GreenYellow 'GreenYellow if Off
Else
Outputs = Outputs Or CType(sender, Button).Tag 'Set On if Off
sender.BackColor = Color.Red 'Reed if On
End If
Me.Controls("lblHexValue").Text = "0x" + Hex(Outputs)
End Sub
Private Inputs As Byte? = 0 'Input channel (Byte)
'Change color of label when bit is On or Off
'remark : TAG property of label is used as bit weight
Sub InputsOnOff()
Try
Inputs = "&h0" + Me.Controls("txtInputVal").Text 'Read & convert text as Hex value
Catch ex As Exception
Me.Controls("txtInputVal").Text = "" 'Wrong format... clear textbox
End Try
For Each Elem In [Enum].GetNames(GetType(InputChannel)) 'for each item in enum
If Inputs And CType(Me.Controls(Elem), Label).Tag Then 'Red Color if bit is On, Green if off
Me.Controls(Elem).BackColor = Color.Red
Else
Me.Controls(Elem).BackColor = Color.GreenYellow
End If
Next
End Sub
End Class
'
' Just My customizes Button to select and display outputs
Class CustomButton
Inherits Button
'
' Create using
' _location inside form
' _elem particular item of enumeration
Sub New(ByVal _location As Point, ByVal _elem As [Enum])
Me.Tag = CType(_elem, OutputChannel) 'My Bit weight
Me.Name = _elem.ToString 'My Name
Me.Text = Me.Name 'Name to Show
Me.Width = 100 'Wide
Me.Location = _location 'Set Position
Me.BackColor = Color.GreenYellow 'Initial Color
End Sub
End Class
'
' Just My customized Label to display Inputs
Class CustomLabel
Inherits Label
'
' Create using
' _location pos inside form
' _elem particular item of enumeration
Sub New(ByVal _location As Point, ByVal _elem As [Enum])
Me.Tag = CType(_elem, InputChannel) 'My Bit weight
Me.Name = _elem.ToString 'My Name
Me.Text = Me.Name 'Name to Show
Me.Width = 100 'Wide
Me.Location = _location 'Position
Me.TextAlign = ContentAlignment.MiddleCenter 'Align
Me.BackColor = Color.GreenYellow 'Initial color
Me.BorderStyle = Windows.Forms.BorderStyle.FixedSingle 'Set Border
End Sub
End Class
Salud,
Pep Lluis,
A la Cargaaaa!!!
o bien pensado..... a la Descargaaaaaa!!! 
http://msdn.microsoft.com/en-us/vstudio/dd582936.aspx
Este video quizas pueda ayudarte si quieres alguna pista, para que la descarga y la instalación sea mas asequible.
http://channel9.msdn.com/shows/10-4/10-4-Episode-33-Downloading-and-Installing-Visual-Studio-2010-Beta-2/
Que lo disfruteis y espero vuestros comentarios.
Pep Lluis,
' A menudo dejamos de utilizar las enumeraciones por falta de comprensión.
'
' Recibo algunas preguntas en tanto a cómo utilizarlas, el presente ejemplo intenta
' clarificar su uso, así como dar algunas perspectivas nuevas, dando a conocer
' algunas características poco conocidas.
' Por definición, una enumeración corresponde a una integral asociada a un contenido como constante
' En la Sub New, destacar...
' .destacar como en 'Nombres' obtenemos el tipo de la enumeración 'Electrodomésticos'
' .el uso de [enum].GetNames en forma de array para añadir todos los ítems sin necesidad de iteraciones
' .Para hacer mas legible el código utilizando una expresión declarativa de la misma
' .Identificar su correspondencia
' Si mañana tengo una escapada hablaremos del atributo para uso como flag : <FlagsAttribute>
'
Class EnumeracionSimple
Inherits Form
Enum Electrodomesticos
Horno
Nevera
Encimera
Campana
Batidora
Plancha
Secadora
Balanza
End Enum
Sub New()
AñadirComboConEnumeracion() 'Un combo con los ítems de la enumeración
CodigoMasLeible(7)
Identificando(2)
End Sub
'Un combo con los ítems de la enumeración
Sub AñadirComboConEnumeracion()
'Al crear la clase
Dim MiCombo As New ComboBox 'Crear ComboBox
Dim Nombres = GetType(Electrodomesticos) 'Obtener el tipo de la enum
'Un combobox con toda la enumeración
MiCombo.Items.AddRange([Enum].GetNames(Nombres).ToArray) 'Añadir todos sus nombres
MiCombo.Dock = DockStyle.Fill 'Dock
Me.Controls.Add(MiCombo) 'Añadir el Combo al Form
End Sub
'Clarificando cada caso en la selección
Sub CodigoMasLeible(ByVal Seleccion As Integer)
Select Case Seleccion
Case Electrodomesticos.Balanza
MsgBox("Hola desde Balanza")
Case Electrodomesticos.Batidora
MsgBox("Hola desde Batidora")
Case Electrodomesticos.Encimera
MsgBox("Hola desde Encimera")
End Select
End Sub
'Identificando la selección
Sub Identificando(ByVal Electodomestico As Integer)
MessageBox.Show("Su nombre es : " + CType(Electodomestico, Electrodomesticos).ToString)
End Sub
End Class
Come learn about what’s coming in the next release of Visual Basic. Code faster with language features like implicit line continuation, auto-implemented properties, statement lambdas, interoperability with dynamic languages, simplified Office application deployment, and more! Understand, navigate, and test code more easily than ever with the latest code-focused tools. Take advantage of multi-monitor support, zoom, and rich extensibility in the newly designed IDE. In this demo-packed session, we’ll show how to use all of these new capabilities to boost your development experience with Visual Studio 2010!
Bio:
Lisa Feigenbaum is a Community Program Manager for Visual Studio Managed Languages. She has been a member of the Visual Basic team since 2004. Before her current role, Lisa was the Program Manager for the Visual Basic Editor and Debugger. You can find Lisa on Channel9 or read her posts on the VB team blog http://blogs.msdn.com/vbteam. Before joining Microsoft, Lisa earned an M.Sc. and B.A. in Applied Mathematics from Harvard University.
NOTA: Para los que no podais asistir al CodeCamp aclarar que esta sesión será un comunicación online con Redmond y se hará en inglés.
Nivel: 200
On : 18th October 2009, 17:15PM (GMT+1)
Toll free: +1 (866) 500-6738
Toll: +1 (203) 480-8000
Participant code: 3116969
Attendee URL: https://www.livemeeting.com/cc/microsoft/join?id=MeetLisa&role=attend&pw=Attend
World Wide Access Telephone Numbers
Spain, Madrid Microsoft IT 91 391 98 00
|
|

|
|
Este verano Octavio Hernández (C# MVP) y Pep Lluis Bano (VB MVP ) tuvimos la suerte de entrevistar a Lisa para un artículo publicado en la revista DotNetMania. El texto en español está disponible como un archivo adjunto al final de este post, así como en el resumen.
|
This past summer I was interviewed by C# MVP Octavio Hernandez and VB MVP Pep Lluis Bano for an article that was published in the Spanish magazine DotNetMania . The Spanish text is available as an attachment at the end of this post, as well as in summary.
|
|
|
|
Click : Interview on Visual Basic and C# in Visual Studio with DotNetMania
Que lo disfruteis!
Pep Lluis,
Muchos de los que nos acostumbramos al uso de ‘Printer.Print’ en visual Basic 6, padecemos de ciertas dificultades para adaptarnos al nuevo uso de ‘PrintDocument’.
Con la intención de responder a numerosas preguntas sobre el tema y facilitar esas transiciones que finalmente nos aportan un montón de beneficios, me complace compartir con vosotros este pequeño ejemplo de cómo generar un listado usando el ‘moderno’ PrintDocument, dandole un estilo muy chapado a la antigua J.
Espero que os sea útil!
©Pep Lluis

‘Este ejemplo se ha compilado con la versión Beta 1 del compilador FW 4.0, aunque no tendréis dificultad alguna en adaptar el concepto a cualquier versión anterior del framework.
Imports System.Drawing.Printing
Public Class Form1
'Crear el PrintDocument
Private ListadoDeArticulos As New PrintDocument
'Simulación tabla de Artículos
Private Articulos As New DataTable("Articulos")
Private Sub Form1_Load() Handles MyBase.Load
'Función de imprimir paginas
AddHandler ListadoDeArticulos.PrintPage, AddressOf Me.ImprimirListado
'
' Simular tabla Artículos
'
Articulos.Columns.Add("Codigo")
Articulos.Columns.Add("Descripcion")
Articulos.Columns.Add("Precio")
Articulos.Rows.Add("001", "Resistencia 100ohms", "0,15")
Articulos.Rows.Add("002", "Transistor 2n2234", "1,00")
Articulos.Rows.Add("003", "Microprocesador Z80", "5,40")
Articulos.Rows.Add("004", "UART 16C450", "3,45")
Articulos.Rows.Add("005", "Resistencia 200ohms", "0,12")
Articulos.Rows.Add("006", "Transistor 2n2222", "1,22")
' Lanzar la ejecución del listado
ListadoDeArticulos.Print()
End Sub
'Seleccionar la fuente para el listado
Dim Fuente_Pagina As New Font("Lucida Console", 10)
'Fijar los márgenes Derecho / Izquierdo
Dim Margen_Izquierdo As Single = 0
Dim Margen_Superior As Single = 0
'Controlar la posición Vertical/NºPagina
Dim PosicionLinea As Single = 0
Dim ContadorLinea As Single = 0
Dim Numero_Pagina As Single = 1
'Memorizar la posición en curso dentro del Dataset
Dim Puntero As Single = 0
'
' Imprimir el Listado de Artículos
'
Sub ImprimirListado(ByVal sender As Object, ByVal Pagina As PrintPageEventArgs)
'Ajustes para el Control de Pagina
Dim Lineas_Pagina As Single = Pagina.MarginBounds.Height / Fuente_Pagina.GetHeight(Pagina.Graphics)
ContadorLinea = 0
Margen_Izquierdo = Pagina.MarginBounds.Left
Margen_Superior = Pagina.MarginBounds.Top
'Cabecera del Listado
ImprimirUnaLinea(Pagina, "Electronica NAVI")
ImprimirUnaLinea(Pagina, "Listado de Artículos sin ningún orden ni concierto")
ImprimirUnaLinea(Pagina, "Vic (Barcelona) a fecha : " + DateTime.Now + " ,Pagina : " + Numero_Pagina.ToString)
ImprimirUnaLinea(Pagina, "")
ImprimirUnaLinea(Pagina, "Código Descripción Precio")
ImprimirUnaLinea(Pagina, "------ --------------------------------------------------------- --------")
Dim Articulo As DataRow
Dim Linea As String = Space(80)
'
'Recorrer la tabla de artículos / imprimir una línea por fila
For Indice As Single = Puntero To Articulos.Rows.Count - 1
Articulo = Articulos.Rows(Indice)
If ContadorLinea < Lineas_Pagina Then
'posicionar la columna según item/articulo
Mid(Linea, 2) = Articulo.Item("Codigo")
Mid(Linea, 8) = Articulo.Item("Descripcion")
Mid(Linea, 66) = Articulo.Item("Precio")
'imprimir la linea
ImprimirUnaLinea(Pagina, Linea)
Else
Exit For
End If
Next
'Memorizar la posicion del primer artículo/siguiente Pagina
Puntero = Articulos.Rows.IndexOf(Articulo)
'
'Comprobar si existen artículos para listar
If Puntero < Articulos.Rows.Count - 1 Then
Numero_Pagina += 1 'Incrementar numero de página
Pagina.HasMorePages = True 'SI tengo más paginas a imprimir
Else
ImprimirUnaLinea(Pagina, "------ --------------------------------------------------------- --------")
Numero_Pagina = 1 'Numero de pagina a 1 (Para el proximo listado)
Pagina.HasMorePages = False 'No Tengo mas paginas para imprimir
End If
End Sub
'
' Imprimir una linea
'
'Lambda para con el cálculo de la posición de la línea
Dim Pos = Function() As Single
Return Margen_Superior + ContadorLinea * Fuente_Pagina.GetHeight(Pagina.Graphics)
End Function
Sub ImprimirUnaLinea(ByVal Pagina As PrintPageEventArgs, ByVal Linea As String)
'Imprimir la línea con la fuente seleccionada y en Negro
Pagina.Graphics.DrawString(Linea, Fuente_Pagina, Brushes.Black, Margen_Izquierdo, Pos())
'Incrementar el contador de líneas
ContadorLinea += 1
End Sub
End Class
PD. Me gustara recibir vuestros comentarios, opiniones y aportaciones.

Me complace compartir con vosotros un gran evento para la comunidad de desarrolladores, se trata de una nueva edición del CodeCamp esta vez en Tarragona. Dos días completos dedicados a reunir al mayor número de profesionales, estudiantes y entusiastas entono charlas, mesas redondas y lo más importante un punto de reunión para contactar de tu a tu, con los profesionales más reconocidos de nuestro sector.
Ahora ya no tienes excusa, sin duda el evento más importante de este año, de la comunidad para la comunidad.
No tardes en registrarte : www.codecamp.es
Nos vemos el 17/18 de octubre en Tarragona.
Pep Lluis,
Para los que tengáis eReader, tiempo que perder y aun no dispongáis del libro “Robot Dispensador para MSDN Video” (año 2005), ahora lo tenéis disponible en formato electrónico. Os lo podéis descargar de :
https://www.luarna.com/Paginas%20comunes/DispFormAutor.aspx?idautor=44
Espero que un recurso más J
Saludos,
Pep Lluis,

Este fue mi primer ordenador con interprete Basic diseñado construido totalmente a Mano por un tal PepLluis. ¡Menudos tiempos!
Es grato reencontrarme con el después de casi 25 años.
El procesador es un INTEL MCS51 con el interprete Basic incrustado en PROM del propio chip.
Como veis no solo Bill tiene juguetitos de museo :-))
Saludos,
|
|

|
|
Para alguno de nosotros, ya seamos de sistemas o desarrolladores, es habitual encontrarnos frente una situación de problemas cuando intentamos instalar determinados dispositivos USB en sistemas de 64 Bits, en esos casos la respuesta suele ser :
‘el fabricante es el responsable de suministrar los adaptadores para su electrónica’
Cierto, es verdad y es la respuesta correcta, pero de hecho el usuario necesita utilizar su dispositivo y es obvio que no puede esperar indefinidamente a que el fabricante decida suministrar o desarrollar un adaptador para 64 bits y para nuestro sistema operativo.
En algunos escenarios esto representa que el usuario no se decida a instalar la nueva versión de Windows y retroceda a las versiones anteriores con soporte a dichos dispositivos, que traducido significa instalar una versión antigua X86 del sistema. No olvidemos que algunos fabricantes importantes de electrónica están suministrando instaladas las versiones X86 en sus equipos nuevos cuya electrónica es X64 y además algunos incluyen los DVD ‘downgrade’ para instalar XP. Es difícil de entender porque, supongo que puede ser por esto.
Para los ingenieros que decididamente quieran aprovechar la arquitectura de X64 sin renunciar a utilizar estos dispositivos y sus ‘drivers’ existe un buen recurso que puede resolver la situación en algunos casos. SI!, ahora podemos utilizar los viejos dispositivos USB y las antiguas aplicaciones que rodaban en XP utilizando el nuevo ‘XPMode’ de WIN7. porque este incluye soporte para compartir o adjuntar dispositivos USB por lo que solo necesitas instalar el complemento Virtual PC & XPMode en tu sistema, entonces podrás instalar y usar el viejo adaptador USB con tu vieja aplicación rodando sin ningún problema (o al menos eso espero. J), ademas podras lanzar todas las aplicaciones instaladas en XPMode directamente desde el menu de inicio sin arrancar el Visual PC…
Por ejemplo, algunos utilizamos conversores USB-Serie o dispositivos USB para su uso con electrónica de entornos integrados de desarrollo que se comunican con emuladores, depuradores o circuitos especificos, una vez instalados en XPMode se comportan como un autentico XP nativo (además en el continuamos disponiendo del aclamado Hyperterminal). Sin duda XPMode es una nueva gran característica para no demorar por más tiempo el uso de Windows 7 en su versión X64 por falta de 'Drivers'.
Espero que esto ayude a sortear (lo sé! No todos!) Pero algunos problemas derivados en la necesidad de utilizar drivers X86 en sistemas X64.
Pep Lluis,
PD. Puedes descargar XPMode para WIN7 siguiendo este link :
http://www.microsoft.com/windows/virtual-pc/download.aspx
|
Many people found problems when try use their USB devices in X64 system. When report this trouble, the normal answer is :
‘It is the responsibility of the manufacture to provide drivers for their hardware’
Yes! This is true and is the correct response, but in fact the user need use this device and is obvious cannot wait indefinitely to manufacturer regarding if decide deliver or not deliver the driver for x64 system.
In some scenarios this represent that the user does not install the new version of Windows and comeback to older versions or finally in the best of cases simple select to run x86 version of O.S., because normally in some cases and old electronics the manufacturer only give support for x86 versions. Don’t forget some important PC manufacturers deliver only windows x86 versions with new X64 PC hardware, and give included XP DVD’s downgrade. Is hard to understand for why (may be for this)
For engineers that clear decide run with X64 versions, have a good resource to solve this problem, when manufacturer only supply X86 or XP driver versions. Yes! Now you can use old USB devices and XP Applications using XPMode, because now include new support to share or attach USB devices. Just need install Virtual PC & XPMode in your Windows 7 X64 and you can install & use the old USB-Serial Adaptor with your old application running with no problems. (I hope )
For example, many people using USB-Serial legacies or USB Devices are for their use with electronics IDE’s. Now with XPMode you can use all old IDE’s and communicate with debuggers, in circuit emulators or electronic devices installed in XPMode (Virtual PC) like be in native XP (yes in XP still running Hyperterminal “claimed for many people”) and missing in Vista). With no doubt this is a great new feature to no delay more using Windows 7 X64 Version.
I hope this help to solve (I know… not all) but some device driver X86 implementation scenario.
Pep Lluis,
PS. You can download XPMode for WIN7 from : http://www.microsoft.com/windows/virtual-pc/download.aspx
|
|
|
|
|
Saber sobre la disponibilidad de nuestros puertos serie antes de su selección en un combobox.
|
How to know about availability of our computer serial ports before select one from a combo box.
|
|
A menudo las aplicaciones que requieren seleccionar un dispositivo antes de efectuar algún tipo de comunicacion, no ofrecen ninguna información adicional sobre el estado del dispositivo. Sobre todo si hablamos del puerto serie, normalmente nos ofrecen una simple enumeración de los COM. Esto último es el causante de que la aplicación nos permita seleccionar un puerto que en ocasiones no existe o está siendo usado por otro programa.
Os propongo una idea con la intención de mejorar y facilitar la selección de este tipo de dispositivos en nuestras aplicaciones.
Básicamente se trata de enumerar en un ‘ComboBox’ personalizado los puertos existentes en nuestro equipo, utilizando el mandato :
My.Computer.Ports.SerialPortNames.ToArray
En el momento de la inicialización del ‘combobox’ asignaremos el evento de ‘DrawItem’ a la función que enriquecerá el aspecto, añadiendo al nombre un rectángulo coloreado y el texto correspondiente a la disponibilidad del puerto.
AddHandler ComboBox1.DrawItem, AddressOf cmbo_SerialPorts_Status
No dudéis en contactar conmigo si necesitáis aclarar o necesitáis entender alguna parte del código.
Para poder darle mayor difusión los comentarios del código están en inglés, aunque si os parece oportuno y necesario puedo posteároslo también en español.
|
Sometimes our communications applications are required to select any type of external device, and normally these applications are not giving any extra information about their availability. This is the case when talk around serial ports, normally when select the port only have a simple enumeration of COM’s, this may be confusing at time leaving at users selecting inexistent ports or ports that simply are already in use.
With this sample, you can improve and make easy these device selections in our applications.
The main think is enumerate serial port inside our customized ‘ComboBox’, using :
My.Computer.Ports.SerialPortNames.ToArray
After when initialize our combo only need assign ‘DrawItem’ event to function with our personalized combo draw,
AddHandler ComboBox1.DrawItem, AddressOf cmbo_SerialPorts_Status
This function are adding red rectangle and “busy” text when no have availability, and green rectangle and “available” text when the port is free.
Please no doubt in contact with me if you need any other explanation or opinion about this.
|
|

|
|
public partial class Form1 : Form
{
//Enumerate Serial Ports on Machine
//Get Serial Port availability
String[] Puertos = System.IO.Ports.SerialPort.GetPortNames();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
this.comboBox1.DrawMode = DrawMode.OwnerDrawVariable; //seleccionar mi propio modo de arrastre
this.comboBox1.DropDownStyle = ComboBoxStyle.DropDownList; //aspecto al men desplegable
this.comboBox1.DataSource = Puertos; //puertos serie disponibles
this.comboBox1.TabIndex = 0; //seleccione en primer lugar tabIndex
}
private void comboBox1_DrawItem_1(object sender, DrawItemEventArgs CmboItem)
{
// Dibuja el fondo del item.
CmboItem.DrawBackground();
// Los valores por defecto si el puerto est disponible.
string status = "Disponible";
SolidBrush brush = new SolidBrush(Color.Green);
System.Drawing.Font font = this.Font;
Brush fontbrush = Brushes.Black;
Rectangle rectangle = new Rectangle(2, CmboItem.Bounds.Top + 2, CmboItem.Bounds.Height - 4, CmboItem.Bounds.Height - 4);
// Comprobar disponibilidad del puerto
try
{
// Si abre y cierra los puertos sin excepcin.
// dibuja el item con la fuente por defecto y rectngulo verde.
System.IO.Ports.SerialPort PortTest = new System.IO.Ports.SerialPort();
PortTest.PortName = Puertos[CmboItem.Index].ToString();
PortTest.Open();
PortTest.Close();
}
catch (Exception ex)
{
// Si el puerto no est disponible
// dibuja el item con la fuente cursiva y tachado y rectngulo rojo
brush = new SolidBrush(Color.Red);
status = "En Uso";
font = new Font(FontFamily.GenericSansSerif, this.Font.Size, FontStyle.Italic ^ FontStyle.Strikeout);
fontbrush = Brushes.DimGray;
}
// llenar item combo con rectangulo.
CmboItem.Graphics.FillRectangle(brush, rectangle);
// escribir el texto con la condicin actual del puerto de este item.
CmboItem.Graphics.DrawString(Puertos[CmboItem.Index].ToString() + " - " + status, font, fontbrush, new RectangleF(CmboItem.Bounds.X + rectangle.Width, CmboItem.Bounds.Y, CmboItem.Bounds.Width, CmboItem.Bounds.Height));
// dibujar foco del rectngulo cuando el ratn est sobre un item.
CmboItem.DrawFocusRectangle();
}
}
Atendiendo a una consulta de los foros de MSDN, me complace compartir con vosotros una solución para asignar los ajustes de apertura del puerto serie al vuelo.

Entendiendo que en algunas situaciones, puede ser ventajoso poder cambiar la velocidad, paridad, bits... etc, ‘On Line’. Aunque para la mayoría de comunicaciones con dispositivos dichos parámetros son ajustados en tiempo de puesta en marcha y no acostumbran a variar en el transcurso del tiempo.
Esperando os sea útil… Saludos,
Pep Lluis,
PD. Si queréis podéis descargaros la solución de ejemplo en ‘attachments’.
using System;
using System.IO.Ports;
using System.Windows.Forms;
namespace SerialPortSettings
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// Asignar las Velocidades seleccionables al Combo
object[] Velocidades = { 19200, 9600, 4800, 2400, 1200 };
this.comboBox_bits_por_segundo.Items.AddRange(Velocidades);
// Asignar Paridades Seleccionables desde la enumeracion
foreach (string s in Enum.GetNames(typeof(Parity)))
{
this.comboBox_paridad.Items.Add(s);
}
// Seleccionar los items por defecto
this.comboBox_bits_por_segundo.SelectedIndex = 0;
this.comboBox_paridad.SelectedIndex = 0;
// Abrir el puerto serie con los items por defecto
SeleccionCambiada(sender,e);
// Asignar la funcion a ejecutar por disparo de evento al cambio de indice en el combobox
this.comboBox_bits_por_segundo.SelectedIndexChanged += new System.EventHandler(this.SeleccionCambiada);
this.comboBox_paridad.SelectedIndexChanged += new System.EventHandler(this.SeleccionCambiada);
}
private void SeleccionCambiada(object sender, EventArgs e)
{
// Deberemos añadir un control de excepciones si queremos capturar posibles errores
// Para reasignar valores... primero cerrar el puerto
this.serialPort1.Close();
// Asignar los nuevos Settings
this.serialPort1.BaudRate = Convert.ToInt16(comboBox_bits_por_segundo.Text);
this.serialPort1.Parity = (Parity)Enum.Parse(typeof(Parity), comboBox_paridad.Text);
this.serialPort1.Open();
// Ver las asignaciones actuales.
this.Velocidad.Text = this.serialPort1.BaudRate.ToString();
this.Paridad.Text = this.serialPort1.Parity.ToString();
}
}
}
Si es vuestro caso os deseo unos felices dias de descanso. En caso contrario paciencia pues finalmente todo llega.
Estare respondiendo a vuestras solucitudes en tanto finalicen los dias donde internet es algo inacesible para los que no disponemos de 3G, el WiFi es inexistente y se desconoce la implementacion de los conectores RJ45 :-)
Cuidaros mucho y hasta la vuelta!
Salud,
Pep Lluis,

|
Una de las novedades más excitantes de Visual Studio 2010 y el Framework, sin duda es la incorporación de las librerías para el uso de la ejecución en paralelo “paralelismo” o TPL (Task Parallel Library), pudiendo por fin sacar provecho a los ya extendidos multiprocesadores y/o múltiples ‘cores’.
Parece sencillo pero… no esta tan claro.
Es evidente que el uso de un simple ‘Parallel.For’ como cualquier otro proceso a través del framework, requiere de un número de recursos para conformar o organizar, planear y finalmente realizar la ejecución, además podemos suponer que este paralelismo se apoya sobre ‘threading’, por lo que debemos entender su aplicación dentro de escenarios donde exista un uso intensivo en la ejecución de tareas especificas y que estas justifiquen el consumo inicial de recursos en términos de rendimiento.
Con dichas conjeturas, está claro que un simple ‘for next’ siempre ganara en velocidad a un ‘parallel.for’, si su ejecución se limita a la iteración sobre una simple estructura o lista y bien entendiendo en funciones cuya ejecución se realiza en una sola pasada.
Sin embargo la situación sufre un cambio radical cuando nuestro bucle itera en llamadas a funciones que realizan tareas con cierta carga de proceso.
Sin ninguna otra pretensión me complace compartir con vosotros un punto de entrada para evaluar la conveniencia o no de usar el paralelismo en determinadas tareas. También es evidente que no se trata de una herramienta formal, simplemente pretende ser un punto de entrada para experimentar de forma sencilla y asequible la implementación de escenarios muy básicos.
Esperando vuestras valoraciones, espero que llame vuestra atención y os complazca.
Cuidaros Mucho! Pep Lluis,
Para probar la aplicación, necesitareis tener instalada la versión beta de Visual Studio 2010 y crear un nuevo proyecto ‘Windows Form Application’ deberemos añadir y distribuir en su form1 las siete etiquetas (del Label1 al Label7) correspondientes a la visualización de los datos del proceso, dos ‘NumericUpDown’ para proporcionarle el numero de bucles e iteraciones, un ‘Progressbar’ para comparar tiempos de ejecución y listo … con copiar y pegar el código adjunto, podréis utilizar este “tester” para vuestra primera aplicación en paralelo J
No dudéis en contactar conmigo si necesitáis cualquier aclaración o si necesitáis que os envíe el prototipo para este proyecto.
|
With no doubt one of the most exciting features in Visual Studio 2010 and Framework 4 is parallel computing or TPL (Task Parallel Library), being able finally to take benefit of multiprocessors and multi core systems.
This seems clear and simple but… may be need consider some aspects before J
It is evident that the use of simple Parallel.For' like any other process through framework, requires a minimum number of resources to conform, to organize, to plan and finally to make the execution, in addition we can suppose that this parallelism leans on `threading', reason why must be applied within scenes where have an intensive use of processes execution or long tasks, at end only this may justify these initial consumption of resources in performance terms.
With these conjectures, it is clear that simple `for next' always won in speed to `parallel.for', if their execution are limited to iterate on a simple structure or list, as well understanding this functions inside single flow process and made one to one.
Nevertheless the situation undergoes a radical change when our iteration calls to functions that make tasks with certain load of process.
Without any other pretension it pleases to me to share with you an entry point to evaluate the convenience of using parallelism in certain tasks. Also it is evident that one is not a formal tool, simply tries to be an entry point to start with a reasonable simple form and the implementation of very basic scenes.
Waiting for your evaluation, I hope this short explanation pleases to you.
Take care! Pep Lluis,
Ps: No doubt in contacting with me if you need any extra explanation or if you need that I sent this prototype to you.
|
Imports System.Threading
' Simple Skeleton to test 'parallel.for'
' Pep Lluis 14.07.2009
'
' Compare/test time execution of single over parallel task's
' To run require Visual Studio 2010 Beta
' To catch Illegal Cross threat's exceptions, correct appropriate code
' or set false, Checking cross thread calls.
Public Class SingleOrParallel
Dim _timer As New System.Timers.Timer
Private Sub SingleOrParallel_Load() Handles MyBase.Load
AddHandler _timer.Elapsed, AddressOf Testing 'Run Test every elapsed time
_timer.Interval = 1000 'elapsed time to 1s
_timer.Enabled = True 'run timer
End Sub
Dim Elapsed1, Elapsed2 As Double 'define elapsed memory’s
Sub Testing()
_timer.Enabled = False 'Stop timer
Me.Label5.Text = "Running Test"
loops = Me.NumericUpDown1.Value 'read number of loops
SequentialFor() 'Call Sequential for
ParallelFor() 'Call Parallel for
'
' Show results
If Elapsed1 > Elapsed2 Then
Label3.ForeColor = Drawing.Color.Red 'Parallel won
Label4.ForeColor = Drawing.Color.Green
'show execution time & differences between parallel & single
Me.ProgressBar1.Value = (Elapsed2 * 100 / Elapsed1)
Label5.Text = "fast " + (100 - Int(Elapsed2 / Elapsed1 * 100)).ToString + "%"
Label6.Text = Elapsed1.ToString 'Single time
Label7.Text = Elapsed2.ToString 'Parallel time
Else
Label3.ForeColor = Drawing.Color.Green 'Single won
Label4.ForeColor = Drawing.Color.Red
Me.ProgressBar1.Value = (Elapsed1 * 100 / Elapsed2)
Label5.Text = "fast " + (100 - Int(Elapsed1 / Elapsed2 * 100)).ToString + "%"
Label6.Text = Elapsed2.ToString 'Parallel time
Label7.Text = Elapsed1.ToString 'Single time
End If
' put result bottom progressbar value
Label7.Left = (Me.ProgressBar1.Left +
((ProgressBar1.Width / ProgressBar1.Maximum) * ProgressBar1.Value)) -
(Label7.Width / 2)
_timer.Enabled = True 'start timer to next test
End Sub
Dim loops As Integer
Dim Chrono As New Stopwatch
Sub SequentialFor()
Chrono.Start() 'Start watch
' Conventional for next
For n = 0 To loops
SomeTask()
Next
' remember Elapsed time
Elapsed1 = Chrono.Elapsed.TotalMilliseconds
Chrono.Stop() 'Watch stop
Chrono.Reset() 'reset!
End Sub
Sub ParallelFor()
Chrono.Start() 'Start wath
' parallel for
Parallel.For(0, loops, Sub(n)
SomeTask()
End Sub)
' remember Elapsed time
Elapsed2 = Chrono.Elapsed.TotalMilliseconds
Chrono.Stop() 'Watch stop
Chrono.Reset() 'reset!
End Sub
'
'Simulated task
Sub SomeTask()
'Your task here
Thread.SpinWait(NumericUpDown2.Value)
End Sub
End Class
In this sample readings do not seem respond to the real milliseconds, I recommend use `ElapsedTicks' instead `Elapsed.TotalMilliseconds”, these correspond directly to ticks of chrono, eliminating any other interpretation.
Regards,
Sin duda un montón de historias reales, con buenas razones y argumentos que te desvelaran “el porqué” millones de desarrolladores utilizan Visual Basic.
Las encontraras haciendo clic en este enlace: I'm a VB!
Que las disfrutes!
Today after more than 15 years, an old customer, comes to me asking support to change the original computer in his factory. These projects are started in 1992 and are controlling four machines in manufacturing process. Of course this is not notice!!, the new is in 2009 the application still running in Windows 3.11 and using DDE to exchange data with PLC (Programmable logic Controller) across serial port. This computer are linked to Novell Lan connecting with Server data bases (to interchange data from/to others department’s) using DB's from computer associates format J and need Jet 1.0 (first version of access) to work in windows… my Got!
When the customer are explaining... “after all this good years, finally the computer are break!”, I’m thinking in how give a fast response to nonstop factory production… may be upgrading from Visual Basic 3.0 to VB 2010?
Noooooooooooo!
Just need find and install from floppy’s Jet DataBase Engine and run setup application (from old Visual Basic 3.0 project), the great news is that all is working with NO PROBLEMS in Vista Business 32 bits.! DDE Included!.
With no doubt this is a strange history. After this I have explain to customer: the gold years of Win311 and Dbase 3 is gone J, and may be a good idea invest thinking in the next 15 years!.
There are some who say “may be in 15 years more” change the old Novell land by Windows & SQL Server, but now in the fact, they have a new computer with Vista, this is a got first step to start the change. Finally I’m sure that the crisis comes with people like us, performing jobs with no caducity time, in the next project I write in splash windows “Best Before 2012” Jajajaja.
Regards,
Pep Lluis,
PS. To unbelievers, I can send screenshots of Vista & VB3 APP running.
Segun rezan estas son las estadisticas de este humilde Blog.
Estadísticas actualizadas 1 Jun 2009@06:55GMT: 63,261 visitas [?]
El conteo es actualizado cada 24 horas, pero las actualizaciones de los mapas son diferentes deliberadamente, como es explicado en las Notas y en FAQ.
Total desde 30 Jun 2008: 63,261. 24horas previas: 187.
Cuando empecé a introducirme en todo esto de los Blogs, me sorprendía mucho cuando alguien hacia volar estadísticas del tipo “1 millón de Visitas”… “30.000 Descargas diarias” sin duda son cifras de vértigo!
A mi manera de entender, me parecía poco menos que exagerado, pensar que tantas personas pudieran interactuar contra la vitrina o expositor que expresaba las opiniones, consejos y en definitiva las explicaciones de la bitácora de vuelo de un navegante más.
“Pensando en los millones de navegantes que hay por ahí, con un montón de cosas para explicar, mucho más interesantes que yo.” Siempre tenía la sensación que esas personas debían estar 24h pendientes de todo el meollo para poder atender ese frenético ritmo de “visitaciones”.
Pues mi sorpresa se hace realidad cuando después de 11 meses de Blog me encuentro con las inevitables estadísticas y hago realidad del hecho de haber recibido más de 63 mil Visitas.
Estoy convencido que un número tan modesto deja indiferente (o provoca una sonrisa insolente en el peor de los casos) a la gran mayoría de analistas en estadísticas web. Sin embargo reflexionando y pensando que quizás probablemente esos 63 mil accesos han sido provocados por las mismas personas (unos pocos miles) buscando una y otra vez algo que no encuentran y pensando que al final lo han encontrado y les ha sido útil; explicare que provocan el despertar de una sensación de satisfacción muy gratificante, de una sensación de agradecimiento, pues intentando servir y con la responsabilidad de sentirme leído, me renueva el compromiso y las ganas de continuar aquí dedicando esas escasas horas de ocio, mejorando desde la trastienda de la tecnología, con mi granito de arena y la única intención de acortar la distancias entre la cabeza de carrera, el pelotón y el furgón de cola (desde donde os escribo) J.
Cuidaros mucho y no olvidéis que estoy aquí por vosotros.
Pep Lluis,
Links muy útiles para todos los que estamos liados estos días probando RC de WIN 7 y Betas del VS2010… una forma de mantener a ralla los mensajes de aviso en tiempo de instalacion y en torno a la compatibilidad de SQL, aunque probablemente lo obtendremos del ‘Update’ creo que no está demás recomendar o asegurarnos de instalar los SP correspondientes.
SQL Express:
SQL Server 2008 Express SP1
SQL Server 2005 Express Edition SP3
SQL Server 2005 Express Advanced Edition SP3
SQL Server 2005 Express Toolkit Edition SP3
Services Packs:
Descargar SQL Server 2005 SP3
Descargar SQL Server 2008 SP1
Saludos,
Pep Lluis,
A partir de hoy, todos los subscriptores de MSDN tienen la posibilidad de descargar y probar la versión Beta 1 de Visual Studio y Framework 4.0
Los que no dispongan de una subscripción deberán esperar a manaña para poder empezar a descargar J
Aquí os dejo los enlaces :
http://msdn.microsoft.com/es-es/subscriptions/downloads/default.aspx?pv=18:370
http://www.microsoft.com/visualstudio/en-us/products/2010/default.mspx
Que lo disfruteis...
En el 2008 en la PDC “Professional Developer Conference”, Paul Vick y Lucian Wischik nos presentaron de forma magistral las futuras direcciones de nuestro querido Visual Basic. Sin duda desde que Visual Basic se despego de sus “runtime “ (hasta la versión 6) y se unió a la plataforma .NET en 2001, se ha recorrido un largo viaje no exento de algún que otro “accidente” pero sin duda un viaje lleno de ilusión y perseverancia para convertirlo en un lenguaje nuevo, capaz de satisfacer por supuesto las exigencias actuales pero con la vista puesta en la proyección del mismo a la evolución de la plataforma.
Creo que un discurso mal entendido entre los programadores de C# y Basic, es intentar buscar esas diferencias que distinguen a los programadores “profesionales” de los “aficionados”. Si bien es cierto que ciertas características de “basic” por su carácter sencillo y plano, permiten a miles de personas iniciarse en estos menesteres de la programación, es necesario puntualizar que la rivalidad (si hablamos de entorno “wINtel”) nace la incesante pugna y comparación con nuestro clásico “C++” claramente orientado al desarrollo de plataforma en relación a los “Basic” orientados en la mayor parte de su historia al desarrollo rápido de aplicaciones y generalmente orientado a escritorio.
Es evidente que sin disponer de más espacio, esta sería una explicación simplista y al alcance de un sector de opiniones, estoy convencido de que no tiene por que coincidir con todas, como también estoy convencido que es bueno que muchos de vosotros discrepéis.view.aspx?tid=1d3d650b a6b3 4c98 9240 571866969b89
La idea es que C# y C++ a pesar de empezar con “C” son filosofías distintas, para liarlo un poquito también podríamos hablar de F#... sin embargo centrándonos en C# y Visual Basic deberíamos empezar a focalizarnos en comprender que a pesar de mantener ciertas peculiaridades y diferenciaciones en tanto a su enfoque, son y serán lenguajes que “co-evolucionan” en un entorno común, compartiendo entre otros, librerías base, tipos, CLR’s…y un largo etc. Etc. Por lo tanto debemos evitar de una vez por todas hablar de ellos tono de hermanos mayores o menores si no en tono de “gemelos” J, con características diferenciadoras y caracteres propios, pero gemelos al fin y al cabo. Como bien apuntan en el equipo de desarrollo: “Al fin y al cabo comparten más coincidencias que divergencias”
Creo no equivocarme si afirmo que es la primera vez que tanto Visual Basic como C# en la versión 2010 se equiparan en cuanto a sus características principales. (Propiedades automáticas, inicializadores de colecciones, expresiones Lambdas, ‘latebinding’, omisión de referencias en llamadas COM, Interop con Lenguajes Dinámicos, Co/contravaciance… entendido esto creo sinceramente que es hora de concentrarnos en aprovechar el gran momento que nos brindan las características de los lenguajes y su evolución, más que continuar discutiéndonos por imponer la convicción de cuál de ellos es el mejor.
Si al empezar hablamos Paul Vick (sin lugar a dudas una de las personas más vinculadas en el desarrollo de Visual Basic) en esta ocasión y recién salido del TechEd norte americano 2009, es para mí un momento muy especial poder compartir con vosotros la visión de un gran maestro; Anders Hejlsberg hablando de los lenguajes, junto con uno de los principales promotores de Visual Basic ; Jonthan Aneja, que muchos tuvimos el placer conocerlo personalmente en el Spanish VS/VB Tour 2008.
More Posts
Next page »