Reset the Visual Studio Toolbox

div.codebox {margin: 0px; padding-left: 0.75em; background: #edefff;}
div.codebox pre {padding-top: 0.75em; padding-bottom: 0.75em; font-size: 1em;}

VisualStudioToolboxControls Ever have a problem where controls disappear from the Toolbox?  For example, I just installed a 3rd party WPF control set, used the controls, closed VS, reopened VS, and they were gone from the Toolbox.

How the Toolbox Works

At first initialization Visual Studio queries each package installed to see if it provides toolbox controls.  If it does, VS asks for a set of metadata on each control and caches this data.  Then on subsequent loads it uses the cached data (also checks for new packages w controls).  Sometimes this cached data can get corrupted.

How to Fix It

From the command prompt, run this command.  It deletes the toolbox cache data.  The files are normally hidden.  Then next time VS loads it’ll take awhile to load as it reinitializes the Toolbox by querying packages and repopulating the cache.

For Visual Studio 2008

del "%LocalAppData%\Microsoft\VisualStudio\9.0\*.tbd"

For Visual Studio 2010

del "%LocalAppData%\Microsoft\VisualStudio\10.0\*.tbd"

This may not fix all problems, like if a package actually won’t load for another reason, but it has fixed my issues so maybe it’ll help you too.

Dropbox, Easy File Sharing and More

DropBoxCorpLogoDropbox is a file sync app that installs a lightweight client on your PC, monitors a "My Dropbox" folder on your drive, and automatically syncs files in that folder online and to any other computer you have Dropbox installed on.  It also makes sharing files with family, friends, co-workers, projects, etc super easy.

There are plenty of other similar file sync apps, ones I’ve tried are Microsoft Live Mesh, ZumoDrive, and some of these others.  I’ve found all these either feel ‘heavy weight’, are tricky to use, or have some other annoyance.  Dropbox just beats them all hands down for its pure simplicity.

stock_about   Get Dropbox using this URL and get 500MB additional free drive space (I get 500MB free too). 🙂

The key thing to realize is that you’re working with files in a normal folder like any other on your computer.  I find this is the trickiest thing for people to grasp at first.  You save your files to folders today right?  The only difference is that the little background Dropbox app watches the “My Dropbox” folder and copies new and changed files to the Dropbox cloud and any other computer you have Dropbox installed on.  Just start editing and saving your files in the dropbox folder.  I work out of my Dropbox folder for just about everything these days.

Fun story, just the other day I needed to get a small file from my laptop to a co-worker’s to install a driver.  I started copying the file onto a USB flash drive, then remembered we both had a shared Dropbox folder, so I copied it there too.  By the time I rotated my swivel chair with the USB flash drive in hand, the file was already on the co-worker’s laptop in our shared Dropbox folder.  Faster and easier than using a USB flash drive.  I must say that was cool.

These are the top scenarios that I use Dropbox for:

  1. Keep files in sync between your PCs
    All you PCs that have Dropbox installed with your account will be kept in sync.  Handy for keeping the same set of files on your home, office, and laptop computers. 
     
  2. Access your files from anywhere
    If you’re not at one of your machines, your files can be easily accessed by logging into the Dropbox website.
     
  3. Keep a folder in sync with others
    You can create a folder, right-click and choose Dropbox > Share… to share a folder with someone else or a group of people.  Then the files in that folder will be kept in sync between accounts.  My wife and I use this for our Quicken data and other files and I use this extensively with my business and tech partners.
     
  4. Easily share a file with anyone
    Need to quickly share one file with someone?  Just copy the file into your Dropbox\Public folder, right-click and choose Dropbox > Copy public link.  This puts a URL into your clipboard that you can then paste into an email or elsewhere to quickly share a file with anyone.
     
  5. View files from your iPhone
    Wherever you go you can access your files via your iPhone too.  There are built in viewers for common file types like text files, Excel sheets, Word docs ect.  No editing here, but super handy for viewing.  I hear there is also an Android app too.
     
  6. Backup of files
    Dropbox also keeps a history of each file online, so if you or a friend you’re sharing a folder with accidently delete a file or folder, you can recover them with just a few clicks.  Occasionally a colleague changes a file and I need a previous version, no problem, built in version history w Dropbox.


Some other nice benefits:

  1. 2GB free space to start out with
  2. Simple web-based UI for online access
  3. Windows Explorer add-in to show status of synced files
  4. Create photo albums for easy viewing


How it Works
Here is a little bit on how the Windows Explorer extension works.  Dropbox’s PC UI is nicely integrated with Windows Explorer.  When you install Dropbox and create an account, it puts a "My Dropbox" folder under your "My Documents".  Then when you drop a new file or folder into the "My Dropbox" folder or sub folders, it puts a cute little blue glyph (see the .pdf file below) over the file to show you it is being copied up or down to the Dropbox server.  When it is synchronized, the glyph goes green.

DropBoxExampleWindowsExplorerExtension

Multiple people can have the same file open at the same time.  If a file is saved on more than one computer that would cause a potential conflict, Dropbox automatically renames the files by adding a note in the file name so they you don’t overwrite and loose data.


More Resources

For more information… lifehacker.com is quite fascinated by Dropbox and has info such as "The Cleverest Ways to Use Dropbox That You’re Not Using" and a Dropbox Tag for their many posts about Dropbox.  p.s. That link to download Dropbox and get 250MB additional free storage is here.


Question for You
 
Have you tried Dropbox?  If so, found any new or interesting ways to use it?  It seems all my friends and family that try it love it and find new clever ways of using it.  Let me know by leaving a comment.  thanks

Updated on 2013-04-05: Added reason #6 above, sharing link went from 250MB to 500MB, and added paragraph about how Dropbox is just a folder on your computer.

Helping People Search the Interweb

google-cartoon-01[1] Ever get questions from friends or family that could be easily answered if they just did a Google search (or Bing)?  For example, have you ever received an email forward from someone asking "hey, if I really forward this email will Bill Gates track it and send me $514,000?" or someone asks "how do I use a TypeConverter"?

"Give a man a fish and you feed him for a day, teach him to fish and you feed him for life."  Sure you could be polite and give the answer straight up, but isn’t it the morally responsible thing to help them learn how to find answers for themselves?  Most the time you can type the question verbatim into Google and get an answer as a top result.  So here are some handy tools…

Let Me Google That For You, http://lmgtfy.com
Go there now.  Type a search.  It creates a link that you can then share (email, IM, etc) that animates someone doing a Google search for the phase to show them just how easy it really is.  (thanks for JD Wallace for ‘teaching me to fish’ with this site)

LetMeGoogleThatForYou


Just F** Google It
, http://justfuckinggoogleit.com/
If they’re just not getting the hint, here is a backup plan.


Question for you… 
so do you get people asking questions easily answered with a quick Google Search?  What do you tell them?

Using XAML for Custom Object Graphs

XAML is best known for its use with WPF/Silverlight, but the XAML parser is also a powerful generic serialize/deserialize tool for many .NET object graphs.  For example, XAML is used for Windows Workflow (WF).  This post will show a basic example and some tips to use XAML parsing in your own code.

Button-DownloadCode-Small SampleXamlParser.zip

Tips to Watch Out For

  • If you put a .xaml file in your VS project, be sure to set it’s "Build" property to "None" (from the default of "Page").  If you don’t VS will cause a build error on the XAML line where your assembly is defined.
  • All objects must have a public constructor with no parameters.

Sample XAML
Notice how there are a number of various objects defined here…

<col:ArrayList

  xmlns:x="clr-namespace:SampleXamlParser;assembly=SampleXamlParser"

  xmlns:sys="clr-namespace:System;assembly=mscorlib"

  xmlns:col="clr-namespace:System.Collections;assembly=mscorlib">

  <sys:String>George</sys:String>

  <sys:String>Henry</sys:String>

  <sys:String>Joe</sys:String>

  <x:Person FirstName="Frodo" LastName="Baggins">

    <x:Person.Address>Bag End, Shire</x:Person.Address>

    Carried the One Ring to Khazad Doom.

  </x:Person>

  <sys:Boolean>True</sys:Boolean>

</col:ArrayList>

 

Code to Read/Write
Some sample code that reads the above XAML and shows the objects contained in it.

using System;

using System.IO;

using System.Linq;

using System.Collections;

using System.Windows.Markup;

 

namespace SampleXamlParser

{

  [ContentProperty("Comments")]

  public class Person

  {

    public string FirstName { get; set; }

    public string LastName  { get; set; }

    public string Address   { get; set; }

    public string Comments  { get; set; }

 

    static void Main(string[] args)

    {

      // Write an object to a .xaml file

      DateTime dt = DateTime.Now;

      File.WriteAllText("out.xaml", XamlWriter.Save(dt));

 

      // File containing the XAML object graph to rehydrate

      string file = @"..\..\MyXaml.xaml";

 

      // The magic line of code that rehydrates the object graph

      ArrayList al = XamlReader.Load(File.OpenRead(file)) as ArrayList;

 

      // Show the types of objects retrieved

      foreach (object os in al)

      {

        if (os is string) Console.WriteLine(os);

        else if (os is Person) Console.WriteLine(os.ToString());

        else Console.WriteLine(String.Format("{0}, {1}", os.GetType(), os));

      }

 

      // Pause the console for debugging

      Console.WriteLine("\nPress any key to quit…"); Console.ReadKey();

    }

 

    public override string ToString()

    { return ObjectInfo(this); }

 

    string ObjectInfo(object o)

    {

      // Format a simple object to a string using

      // reflection, just show its name and properties

      return String.Format("[{0} = {1}]", o.GetType().Name,

        String.Join(", ", o.GetType().GetProperties().Select(

        a => String.Format("[{0} = {1}]", a.Name,

          a.GetValue(o, null))).ToArray()));

    }

  }

}

Of course there could be improvements to this little bit of code, like wrapping IDisposable objects such as FileStream in a using statement, improving the LINQ that outputs object type information, and more, but the point is to convey the key concepts.

Type Converter Update: If you have immutable classes (eg: Point, DateTime, Rectangle, etc) or just wish to provide simple conversion from a string to your type (and the reverse), check out the TypeConverter pattern.  The XAML parser will then use the converter.  In the above example, when DateTime gets serialized to XAML a TypeConverter is actually in play.  Here is an update to the code above with a TypeConverter: SampleXamlParser-TypeConverter.

Fun question: What are some of the advantages of using XAML parsing instead of
"plain Jane" XML serialization (using XmlSerializer)? (ex: ability to using binary XAML (BAML))

Resources

Tweet from SlickRun

SlickRunTweet_002 There are many launchers out there, but my favorite by far is SlickRun.  Here’s how to post a twitter status update straight from SlickRun.  This way even without a web browser open or a dashboard app, you can always do a quick little tweet.

  1. Get SlickRun & cURL (a little cmd app to send HTTP requests)
  2. "setup" from SlickRun
  3. Add an entry called "tweet"…

SlickRunTweetSetup

Where

Of course there are some real drawbacks to doing this, such as no notification if the post didn’t go through (too long, no connection, or invalid characters).

Combing with Take Command
For a more robust solution, if you have Take Command (formally 4NT), I’d recommend wrapping the call in a simple Take Command shell script to report success or an error.  Download tweetbtm.zip (which contains tweet.btm), then the SlickRun setup would be:

Filename or URL = %comspec%
Parameters = /c %batch%\tweet.btm `$W$`

Where comspec is an environment variable pointing to tcc.exe (Take Command Console) and batch is an environment variable containing your batch scripts.

References

I’ve Left Microsoft

Seattle Moon Well it’s been five and a half years since I joined Microsoft fresh out of college from Texas A&M University and I’ve just this week given my notice that I’m leaving! (more about it on my ‘old’ msdn blog here)  My wife Dawn and I want to move back to Texas so I’ve taken a new position in a national biomedical health company that is bringing a personal health card that stores credentials, admissions data, insurance information, etc on a smart card you can carry in your wallet.  I’m sure I’ll be blogging more about it as I ramp up and get more involved.  In the mean time, I’m moving my blogging back to my pre-Microsoft blog here at msmvps.com.  Looks like it was four years and just a few days since I moved blogging over to blogs.msdn.com and this blog needs some serious CSS cleanup, have no fear, I’ll get around to it.   Cheers!

SerialPort (RS-232 Serial COM Port) in C# .NET

.NET has a great class called SerialPort (MSDN reference) part of .NET 2.0 and is freely available in C# Express on MSDN. It is easy to use.  Here’s how…

BTW, this article is about communicating through the PC’s Serial COM RS-232 port using Microsoft .NET 2.0 or later by using the System.IO.Ports.SerialPort class. If you’re looking for USB info, see here.

 

Example Application & Sample Code: SerialPort Terminal

Prerequisites: You will need Microsoft .NET 3.5 to run the app.  It is installed as part of the regular Windows Updates (make sure your computer is fully up to date, see Microsoft Updates for more info) or if that doesn’t work for some reason, you can install .NET 3.5 from here.

Button-DownloadCode-Small Button-RunAppNow-Small
SerialPortTerminal.zip via ClickOnce

To start off, here is sample code in a terminal application which you can try out to see how the SerialPort class is used.  This requires Visual Studio 2010 to compile, which can be obtained free via C# Express.  It is just a simple little application with basic support for text or binary (hex) modes to send and receive data.  A nice feature or two is auto-detection of installed COM ports that update at runtime if you plugin or remove USB-to-Serial adapters, also you can change the DTR and RTS levels and monitor the CTS, DSR, and CD lines.

Build Note: You will receive an error that Visual Studio isn’t able to find NoahCode.pfx.  This is expected as it is the click-once certificate for publishing and is NOT NEEDED for normal code use.  Just go to Project Properties > Signing > Click on Create Test Certificate.  that’s it

SerialPort Terminal 01

 

Get Connected
You can obtain USB to Serial adapters and have just about as many ports on your PC as you like. I carry around two adapters with a null modem (wikipedia) between them so I can create a loopback to send & receive through to separate ports on most any computer. I’d recommend doing the same for when writing code for the serial port.

If you’d like to quickly and easily create your own external devices to communicate with the PC, I recommend starting with the Arduino, NetDuino (like an Arduino but programmed in C#), or Parallax BASIC Stamp modules.  All three have many accessories and sensors available (such as LCDs, RF, Sounds, AD & DA, etc).  sparkfun.com is a great place to look. After that you could migrate to an Atmel Microcontroller (recommended) or Microchip PIC.

 

Write Data Out
Here is an example of how easy it is to use the new SerialPort control.  Very simply, here is how you can send a bit of data out the port.

// This is a new namespace in .NET 2.0
// that contains the SerialPort class using System.IO.Ports; private static void SendSampleData() { // Instantiate the communications
// port with some basic settings SerialPort port = new SerialPort(
"COM1", 9600, Parity.None, 8, StopBits.One); // Open the port for communications port.Open(); // Write a string port.Write("Hello World"); // Write a set of bytes port.Write(new byte[] {0x0A, 0xE2, 0xFF}, 0, 3); // Close the port port.Close(); }




Read Data From Port

Now let’s take a look at what it takes to read data in from the communications port. This demonstrates reading text.

  1. Create a new "Console Application" and replace all the default class code with this code
  2. Add a reference to "System.Windows.Forms" to the project
  3. Run w/ F5, to exit the app, press Ctrl-Break.
  4. Get Connected with two USB to Serial adapters and a null modem
  5. Use another app, the code above, or the SerialPortTerminal.zip example to send data and watch it come in with this code

#region Namespace Inclusions using System; using System.IO.Ports; using System.Windows.Forms; #endregion namespace SerialPortExample { class SerialPortProgram { // Create the serial port with basic settings private SerialPort port = new SerialPort("COM1",
9600, Parity.None, 8
, StopBits.One); [STAThread] static void Main(string[] args) { // Instatiate this class new SerialPortProgram(); } private SerialPortProgram() { Console.WriteLine("Incoming Data:"); // Attach a method to be called when there
// is data waiting in the port's buffer port.DataReceived += new
SerialDataReceivedEventHandler(port_DataReceived); // Begin communications port.Open(); // Enter an application loop to keep this thread alive Application.Run(); } private void port_DataReceived(object sender,
SerialDataReceivedEventArgs e) { // Show all the incoming data in the port's buffer Console.WriteLine(port.ReadExisting()); } } }



Listing Available Ports

One of the (several) new methods that is supported, and one I’m very glad is finally here, is the ability to obtain a list of the COM ports installed on the computer (ex: COM1, COM2, COM4). This is definately helpful when you want to present the list of ports avalible for the user to select from (as in the SerialPortTerminal.zip Win App example).

foreach (string s in SerialPort.GetPortNames()) Console.WriteLine(s);



Sending Files

Here are two helpful little methods for sending files through the serial port. Of course, these are the bare essentials and as always, you should check to make sure the port is open first (port.IsOpen) and use try/catch around trying to open a file, but you get the gist with this code. The binary sending routine is limited to about 2GB (the size of an int), but this should be okay for most uses.

using System.IO; private static void SendTextFile(
SerialPort port, string FileName) { port.Write(File.OpenText(FileName).ReadToEnd()); } private static void SendBinaryFile(
SerialPort port, string FileName) { using (FileStream fs = File.OpenRead(FileName)) port.Write((new BinaryReader(fs)).ReadBytes(
(int)fs.Length), 0, (int)fs.Length); }


RS-232 Project Photos

Each of these involve RS-232 serial port communications.

Just what’s needed to get started with microcontrollers,

a Basic Stamp, mini LCD display, power, and RS-232 port.

 

Two USB to Serial adapters with a null modem

to loopback and test your serial software.

 

The brains to a mini automated radio station that let me

control my PC & home using my HAM radio from around town.

 


Port Wiring Notes

DB9 Male (Pin Side)                   DB9 Female (Pin Side)
DB9 Female (Solder Side)              DB9 Male (Solder Side)
    -------------                          -------------
    \ 1 2 3 4 5 /                          \ 5 4 3 2 1 /
     \ 6 7 8 9 /                            \ 9 8 7 6 /
      ---------                              ---------

DB9 Female to DB9 Female Null-Modem Wiring
 2 |  3 |  7 |  8 | 6&1|  5 |  4
---- ---- ---- ---- ---- ---- ---- 
 3 |  2 |  8 |  7 |  4 |  5 | 6&1

9-pin   25-pin  Assignment                 From PC
------  ------  -------------------------  ------------
Shield  1       Case Ground                Gnd
1       8       DCD (Data Carrier Detect)  Input
2       3       RX  (Receive Data)         Input
3       2       TX  (Transmit Data)        Output
4       20      DTR (Data Terminal Ready)  Output
5       7       GND (Signal Ground)        Gnd
6       6       DSR (Data Set Ready)       Input
7       4       RTS (Request To Send)      Output
8       5       CTS (Clear To Send)        Input
9       22      RI  (Ring Indicator)       Input

- RTS & DTR are binary outputs that can be manually set and held
- DCD, DSR, CTS, and RI are binary inputs that can be read
- RX & TX can not be set manually and are controlled by the UART
- maximum voltages are between -15 volts and +15 volts
- binary outputs are between +5 to +15 volts and -5 to -15 volts
- binary inputs are between +3 to +15 volts and -3 to -15 volts
- input voltages between -3 to +3 are undefined while output voltages
  between -5 and +5 are undefined
- positive voltages indicate ON or SPACE, negative voltages indicate
  OFF or MARK



Protocol Development

If you are making your own serial interface/protocol, you really must have a good standard in place. Serial data flows into the com port byte by byte and must be buffered and parsed correctly. Think of it this way, if a terminal sent your computer "Hello World" it may come in as four OnComm triggers: "H", "ello", " Wo", and "rld"

The best protocols are usually a mix of these methods.  Here are three simple protocol techniques:

  1. Beginning and Ending ("Start" & "Stop") Codes

    This is good for sending text as it lets everybody know when text starts and ends. You simply tack on a non-normal byte at the beginning and end of the text. For example, you’d use ‘—‘ to signify the start of the string and ‘===’ to signify the end. So you would use: com.Output = "—Hello World===";

     

  2. Fixed Length Codes

    Used for specific commands. You can create your own codes to send and specify what they mean. Say I want to control the lighting in a house, I’d setup a protocol of commands like this:

    1st byte = House Code, 2nd byte = Light Code, 3rd byte = On or Off (0 for off, 1 for on)

    So to turn on the 11th light in my house (house code #3) I’d use:

    com.Output = new byte[] {3, 11, 0};

  3. Prefixed Data Packet

    This is probably the most common and flexible but requires the most coding. Just prefix your data packet with the length of the data. The prefix must be a fixed size, such as two bytes which would allow a data packet of up to 65,535 bytes. Then the receiver knows how much data is in the packet because it always takes the first two bytes and uses the rest as the data packet.

    Example: com.Output = ((char) 00) + ((char) 11) + "Hello World";


Other Resources

Here are some additional sites, libraries, tutorials, etc. These are links that I just found around the net and am providing for convenience (they are not endorsed).


The Final Say

The new SerialPort class in .NET 2.0+ rocks! It is much easier to use than getting the old MSComm.ocx control going in a .NET app, contains new functionality, is a ‘native’ .NET control, has docs built into the MSDN Library, and is easy to use.

Frequently Asked Questions (FAQ)

I’m adding this section (as of 8/10/06) to address the common questions I get on this post and through e-mail.  Chances are, if you ask a good question in the comments here, I’ll post it here for others to see easily. Some of the most popular topics are usb, device, cable, lines, power, packets, bridge, permissions, help.

  1. Q: When updating a control (like a text box) while in the DataRecieved event, I get an error.

    A: The SerialPort class raises events on a separate thread than the main form was create on.  Windows Forms controls must be modified only on their original thread.  Thankfully there is an easy way to do this.  Each Windows control has a "Invoke" method which will run code on the control’s original thread.  So to put the recently received data into a text box (txtLog), this would do it:   txtLog.Invoke(new EventHandler(delegate { txtLog.Text += comport.ReadExisting(); });   You can see this more in action in the "Log" event of "Terminal.cs" my sample code project, SerialPortTerminal.zip.

     

  2. Q: I can’t find the System.IO.Ports namespace.

    A: Using Visual Studio 2003?  The new namespace, and SerialPort class, is part of .NET 2.0 and Visual Studio 2005.  It is not included in .NET 1.x (and Visual Studio 2003).  Even if you have .NET 2.0 or Visual Studio 2005 installed, you can not access the class from within Visual Studio 2003.

     

  3. Q: I only have .NET 1.1, what can I do?

    A: Upgrade to .NET 2.0.  Seriously, it’s free.  In fact, you can get the great C# and VB Visual Studio Interactive Development Environment (IDE) editors for FREE now with C# Express and VB Express.  The .NET Framework Software Development Kit (SDK) for command-line development is also free.  If you really must stay in .NET 1.1, you can use a 3rd party library.

     

  4. Q: I’m sending data to my device, but it is not responding.

    A: First make sure the device will respond using a standard app like Hyperterminal.  Check the settings (baud rate, data bits, stop bits, etc) and make sure they match with your code.  Try sending binary data via binary arrays.  Many devices expect a carriage return at the end of a command, so be sure to send 0x0D or \n.  String data can be easily converted to a binary array using:

    byte[] data = System.Text.ASCIIEncoding.Default.GetBytes("Hello World\n");

    com.Write(data, 0, data.Length);

    Many devices require several carriage returns first to sync baud rates, so send several, like: com.Output("".PadLeft(9, ‘\n’));  It you’re communicating with a modem, make sure Echo Back is turned on.  Send "ATE1\n".  Other than this, just keep trying and playing around with it.  It can be hard because you don’t see the response from the device as easily as you would with a terminal app.

     

  5. Q: When I put received data to a text box or rich text box, I get a strange symbols.

    A: The default font of text boxes is designed only to show standard characters.  Try using "CharMap" (a free tool in WinXP, click "Start", "Run", type "CharMap", enter).  "Terminal" is a font designed to show classic ASCII characters and is what most terminal apps (like my sample code and Hyperterminal) use.  There are also many ASCII codes that won’t display correctly.  This is why I choose to show the hex data instead of an ASCII string a lot of the time.  System.Convert.ToString(mybyte, 16) will convert a byte to a string hex code, for example: byte b = 13; string s = Convert.ToStrong(b, 16).PadLeft(2, ‘0’), then s will contain "0D".  See the "ByteArrayToHexString" and "HexStringToByteArray" methods in my sample app, SerialPortTerminal.zip.

     

  6. Q: What about USB communications?  How can I do USB?

    This blog post isn’t about USB.  Believe me, I wish the .NET framework supported USB natively, and I’m doing what I can here at Microsoft to see USB get into the framework in the future.  For now, you can use a USB to Serial adapter.  I use a lot of these.  They plug into the USB port, then appear just as a SerialPort to the PC. 

    For native USB devices, microcontroller vendors such as Microchip, Atmel, and TI make chips that do this for projects as well as have chips that support USB natively (I’m using the PIC18F14K50).  There is a lot of info and USB C# libraries readily available online with a quick search, try USB C#, which turns up resources like this great article or this USB HID C# open source project

    For simple USB-to-Serial bridges that allow your device to communicate via RS-232 but connect via USB to the PC, check out the section below on USB-to-Serial Bridge Chipsets

     

  7. Q: Can I use the sample code here in my own projects (commercial or not)?

    Yes!  All sample code on my blog is free public domain material.  I’m not a legal guy so I don’t know the exact words to use, but I’ll try…  I’m not responsible for any problems!  Use at your own rick etc.  However, have at it, if it helps you out, fantastic, that’s what it’s here for.

     

  8. Q: When using SerialPort.Open() (or SerialPort.PortOpen = true) I get the exception "UnauthorizedAccessException" or the error "An unhandled exception of type ‘System.Runtime.InteropServices.COMException’ occurred in axinterop.mscommlib.dll"

    It may be one of a few factors:

    • It may require Administrative privileges to use the port.
    • The port may already be open by another program, only one app can use a port at a time.
    • The port may not exist on the computer (this happens a lot).  Verify the port you’re trying to open is listed in the Device Manager (FAQ #9).
    • The name being provided is not exactly correct.

      Use the full name of the port when opening, like "COM1" (not "1")

       

  9. Q: How do I know what COM ports are on my PC?

    Use the Device Manager ("Start", "Run", "devmgmt.msc") and look for the "Ports" node (see below).  If you don’t see a Ports node, it’s because there are no Serial or Parallel ports installed in the PC.  You can also use System.IO.Ports.SerialPort.GetPortNames() to return the list of available ports.  Many laptops these day’s don’t have a serial port.  You can get more serial ports very easily today with USB to Serial adapters.

     

  10. Q: How do I communicate with my specific device?  Modem, Mobile Phone, LED/LCD Display, Scanner, GPS, GSM/GPRS, CDMA, test equipment, etc

    This post is specific to device independent serial port communications.  RS-232 is a hardware standard and there are hundreds (if not thousands) of software protocols that are created for communicating over RS-232.  An analogy would be that physical telephone hardware is used around the globe (like the RS-232 hardware standard), but there are hundreds of languages people can speak through the phone to each other to communicate (the software protocol).  You will need to find information about the protocol used for your specific device elsewhere.  I’d recommend looking on the manufacture’s website, writing/calling the manufacture, or searching online for your specific device.  Sometimes you can find fans or hackers of a device that congregate on a forum.  Some protocols can be found through wikipedia, like the GPS NMEA 0183 serial protocol that GPS units use to send their data via a serial connection.  Honestly the RS-232 communications is the easy part, I personally find the more interesting challenge is writing software for the particular protocol in use.  Best of luck in finding specifications on the protocol you’re device uses!

     

  11. Q: What control lines can I manually manipulate?

    Control lines on an RS-232 serial port were introduced to provide flow control of serial data.  Even though a modem or PC may be rated for a particular baud rate, it doesn’t always mean that the device can process the data that fast.  For example, bits may flow in through a modem at 2400 bps (bits per second) but in the early days a PC couldn’t process the data fast enough, so it would toggle control lines to tell the modem that it was read for more data or to ‘pause’ send it data.  Now since PCs are quite fast these lines are mostly ignored.  They can be used as a simple way to toggle an LED or send or receive high or low states. RTS/CTS control flow is one such technique which is supported natively by the control via the Handshake property.

    Lines marked ‘Output’ in the table can be set by the serial port to a high or low state (True or False) and the ‘Input’ lines can be read as high or low.  You can use the PinChanged event to be notified when one of the input pins changes.  The Handshake property can be set to use RTS/CTS (uses hardware control lines) or XON/XOFF (uses software) or both.

    Control Line Name DB9 Pin SerialPort Property I/O
    DTR Data Terminal Ready 4 DtrEnable Output
    RTS Request to Send 7 RtsEnable Output
    CTS Clear to Send 8 CtsHolding Input
    DSR Data Set Ready 6 DsrHolding Input
    CD (or DCD) Data Carrier Detect 1 CDHolding Input

    For detecting a Ring Indication, see the next question.

     

  12. Q: How do you detect the Ring Indicator line?

    There isn’t a property off of the SerialPort class to test the current state of the Ring Indicator (DB9 pin 9), but there is an event that gets triggered, PinChanged.   You can attach an event listener to PinChanged and when the event is called, SerialPinChangedEventArgs is passed with a EventType property of type SerialPinChange which will indicate if a ring indication was detected.  Here is an example:

    comport.PinChanged += new SerialPinChangedEventHandler(comport_PinChanged);

     

    void comport_PinChanged(object sender, SerialPinChangedEventArgs e)

    {

      if (e.EventType == SerialPinChange.Ring) RingDetected();

    }

     

  13. Q: What pins can I use for powering devices, a high signal, or for boolean input & output?

    The TX & RX pins carry the standard serial signal, but the other pins can be used as high/low input/output pins.  The output pins (4 DTR or 8 CTS), supply 5 to 15 volts (15v is proper RS-232 standard, 5v is what you’ll usually get) when high and low is 0 to -15 volts.  They only supply flea current (very little current) so they’re not meant to be used for powering any devices (like USB is designed for).  However, they can be used as a reference voltage or for switching to one of the input pins for a high or low signal.  The input pins (1 DCD, 6 DSR, 8 CTS, and 9 RI) can be used to detect a high or low signal.  Proper RS-232 signal levels are -15v for a low and +15v for a high (compared to ground, pin 5).  A MAX232 or similar chip takes a TTL 0-5v input and produces the -15v to +15v levels.  However, most PC RS-232 COM ports will accept a 0v for low and 5v for high, but it is not guaranteed and alters from PC to PC.  If you want a simple "toggle high", just hold pin 4 DTR high, and switch it to pin 1 DCD.  The .NET SerialPort class has easy to use properties for switching the output pins high or low and for detecting the current level of the input pins.  I have been able to use pin 4 DTR for a very low current (20ma max) PIC processors, but not reliably.  I prefer to always supply external power and use pin 4 as a signal to turn on or off my device.  I’ll attach pin 4 to a transistor that switches my power source to my PIC to turn it on or off.

     

  14. Q: What about ‘packets’?  Does RS-232 support any commands or data segregation?  OR  Data comes in at seemingly random times?

    Serial data flow through RS-232 has nothing to do with ‘packets’.  It’s just a stream of bytes in and out.  There is no guarantee that data arrives together.

    Packet Protocols

    Any notion of data compartmentalization (packets) would have to be coded by you for your unique use.  Much of my time working with serial has been spent on defining useful packet like protocols, that usually include some type of header, command structure, and CRC check.  For example, the first two bytes are the packet length, the next two bytes is the command, next two bytes are parameters, and the last byte is a CRC.  Then my apps would buffer incoming data and look in the buffer for valid packets.  Of course it differs depending on the device you’re working with and your specific needs.  USB does have specific communications protocol defined, one of them being command based, like the little packet just mentioned.  But with USB, you’re able to get the whole command and parameter together at once, with serial you have to create the protocol yourself, buffer, and parse the data.

    Buffering Incoming Data

    Since bytes may come in at any time, buffering incoming data is critical.  For example, you may send a command out to your device, and the response back to the PC could trigger a single DataReceived event with all the 30 bytes of response data in the receive buffer.  Or more likely, it could be any number of separate triggers of the DataReceived (up to the number of bytes received), like 4 triggers, first with 2 bytes, then 15 bytes, then 1 byte, then 12 bytes.  Don’t look for a complete response in a single DataReceived call, instead:

    1. buffer the incoming data

    2. then scan your buffer to find complete data

    3. remove the used data from the buffer

    To buffer incoming data, use a coding pattern like this:

    (download the code SerialComBuffering.zip)

    using System;

    using System.IO.Ports;

    using System.Collections.Generic;

     

    namespace SerialComBuffering

    {

      class Program

      {

        SerialPort com = new SerialPort(SerialPort.GetPortNames()[0],

          9600, Parity.None, 8, StopBits.One);

        List<byte> bBuffer = new List<byte>();

        string sBuffer = String.Empty;

     

        static void Main(string[] args)

        { new Program(); }

     

        Program()

        {

          com.DataReceived +=

            new SerialDataReceivedEventHandler(com_DataReceived);

          com.Open();

     

          Console.WriteLine("Waiting for incoming data…");

          Console.ReadKey();

        }

     

        void com_DataReceived(object sender,

          SerialDataReceivedEventArgs e)

        {

          // Use either the binary OR the string technique (but not both)

     

          // Buffer and process binary data

          while (com.BytesToRead > 0)

            bBuffer.Add((byte)com.ReadByte());

          ProcessBuffer(bBuffer);

     

          // Buffer string data

          sBuffer += com.ReadExisting();

          ProcessBuffer(sBuffer);

        }

     

        private void ProcessBuffer(string sBuffer)

        {

          // Look in the string for useful information

          // then remove the useful data from the buffer

        }

     

        private void ProcessBuffer(List<byte> bBuffer)

        {

          // Look in the byte array for useful information

          // then remove the useful data from the buffer

        }

      }

    }

                                                   
     

  15. Q: How do you detect when a device is connected or disconnected?

    Simply put, the device usually starts or stops sending data.  There are no built in events when a device connects or disconnects.  But there are a few tricks you can do, if you’re creating the serial device yourself, then you have more options.  I’ve had my devices (and PC apps) send a constant “are you there” set of bytes, like 00 00 11 11 00 00 hex (I’d use a ‘are you there’ custom ‘packet’ as in Q13 above) till a device on the other end responds.  You could also use hardware, that’s what some of the other signals lines are for (CDC, DSR, RTS, CTS, RI), you can tie one of these high and then catch an event when the line goes high so you know there’s a device there, when it goes low the device is gone.

     

  16. Q: How do I transfer files?

    If you’re interested in sending entire files between computers or to a device, you have two primary choices.  First choice is to write your own protocol for breaking a file into manageable packets, detecting errors, sending/receiving, etc.  Second choice is to use a protocol already created, like XModem, YModem, ZModem, etc.  These protocols were created long ago specifically to send files over a serial connection with features like error correction, being able to resume transfers, compression, etc.  I’m only aware of commercial implementations for .NET right now, like Sax Software’s CommStudio.  If anyone find an open source implementation, please let me know!

     

  17. Q: Where can I get USB-to-Serial cables?

    41PqGXytfvL._AA300_[1]USB-to-Serial adapter cables allow you to get a standard RS-232 DB9 cable by plugging in the adapter to your USB port.  You can use several of these to get multiple DB9 ports.  Many laptops, even desktops, don’t have serial ports these days which makes these particularly handy.

     
    Every so often I source a good cable for a decent price, typically around $12.  Here is the deal I’m currently using.  http://amzn.to/JnZ7ag

     
    Be forewarned, not all cables are created equally!  There are two issues to contend with…

    1. There are a number of companies that create USB chipsets that emulates an RS-232 port.  Some are much more compatible with PCs and Macs than others.  For example, the Prolific and FTDI chipset are used in the most compatible adapters (unlike Ark Micro, or others).  Those companies produce WHQL (Windows Hardware Quality Labs) certified drivers and the drivers are built into most Windows and Mac systems already.  So when shopping for a cable, be sure to check the chipset manufacture.  Here are some handy links to drivers in case you need them.
      1. Prolific Chipset Drivers
      2. FTDI Chipset Drivers
    2. Standard RS-232 signals range from 3 to 15 volts (plus or minus), 0 is not a valid signal.  The USB-to-Serial interface chips used in these cables produce 0 to 5 volts, standard TTL level logic.  While this works for some PCs, and certainly most microcontrollers, it is not 100% compatible.  The ‘correct’ USB-to-Serial cables incorporate an additional line level driver, like the MAX232, that take the 0 to 5 volts and convert it to an appropriate +/- 12 volts for RS-232.  The problem is that many low-quality cables exist out there without this line level driver chip.

       
  18. Q: How can I best interface with my microcontroller?  USB-to-Serial Bridge Chipsets

    FTDI FT232R 01 If you are building your own devices, usually with some type of microcontroller, and want to interface with the PC, you can certainly use RS-232 either plugged straight into your PC or via a USB-to-Serial adapter cable, but another option is to use an USB-to-Serial bridge chipset directly in your project (what is inside of the USB-to-Serial adapter cables).  This allows your device to use RS-232 internally, but connect to a computer via USB and you as a project designer never need worry about the USB interface or drivers (your device and PC software just see serial RS-232).  You could use a native USB microcontroller (without an RS-232 bridge), such as the PIC18F14K50, but that requires writing your own USB drivers and a much deeper understanding of the USB infrastructure (both in hardware and software).  That particular PIC also comes with a Serial emulator and drivers like below.  This article is focused on serial RS-232, so I’m covering the USB-to-Serial bridges here.

     
    These modern ICs don’t require external crystals, can power your device from USB Power, provide clock sources for your micro if you like, and come with Windows Certified (WHQL) drivers that are actually included in Windows Vista and beyond (also built in Mac drivers).  Here are a few…

    1. FTDI FT232RL

      The FTDI chips are most popular in electronics projects and used by companies like Parallax and the Arduino Duemilanove.  They also have the best support in terms of evaluation modules, well written datasheet, and product availability. product info, evaluation modules, buy from Mouser, drivers

       

    2. Prolific PL-2303HX

      These are the chips used in the most popular USB-to-Serial cables.  They are slightly less costly than the FTDI chips in bulk, but are not quite as well supported in the US market.  product info 
       
    3. TI TUSB3410

      Another option from Texas Instruments.  I haven’t used this chip.  Product Info

       

    p.s. For trying it out and prototyping, I personally recommend this particular FTDI evaluation board, the UM232R since it plugs into typical solderless protoytpe breadboards and has most of the pins easily accessible.  Last priced it was $20 from Mouser.

    FTDI FT232R 02 UM232R

     

  19. Q: How do I automatically detect the baud rate of a device?

    The PC doesn’t have built-in automatic baud detection, but there is an easy trick to implement basic baud detection for many devices.  If there is a known call & response to the device you can set the baud rate of the port to one setting, open the port, send the call, see if you get the expected response, and if not close the port, set a different baud rate, and repeat.  For my own devices I’ve had some of them send a known character string (could be anything, like 000ABCD) after they receive a high on the DTR line.  This way my serial code can set DTR high, see if it gets the ABCD at one baud rate and if not, close the port, set another baud rate, open the port, turn DTR high, and try again.  If the baud rates match the characters will be read correctly, if not then the characters will be jumbled.  This can be done with many other devices as well if there’s a known call and response, like sending a modem an AT command with an expected response code.

     

  20. Q: May I have permissions to use your code?

    Yes!  The code and samples here are released under the MIT License
     

  21. Q: How can I get more support?  What are my support options?

Ballmer Dancing Developers Conference Video

At one of the developer conferences (late 90s, early 2000s?), Steve Ballmer, CEO of Microsoft, came out on stage saying ‘Developers’ over 15 times before his voice went out. Being a developer myself, I think this is cool. At the Microsoft company meeting that followed, I remember talk among us employees whether he was going to come out on stage saying another word repeatedly (he didn’t that time). Here they are…

<!–

–>

Ballmer Sells Windows v1.0 TV Video Ad

Steve Ballmer, CEO of Microsoft, can be seen here in an early days of Microsoft in this TV ad selling Windows v1.0. It is a facinating, and entertaining, video.

Get a load of the 286 computer w/ IBM EGA monitor! Wow, that brings back memories… The ‘card filer’ could use some sample data, it isn’t clear what it does here. Looks like the control panel was a bit small in those days. Hehe, I actually remember trying out Reversi. 🙂