Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C#
  4. SerialPort output problem

SerialPort output problem

Scheduled Pinned Locked Moved C#
questionsharepointcomhelp
6 Posts 3 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • A Offline
    A Offline
    Admin887
    wrote on last edited by
    #1

    hi, i connected 2 computers with COM cable (RS232). i created 2 application for sending and receiving information. i tried to send information from the first computer and to see it at Listen32 program on the other computer. I get the information correctly with [CR] and [SP] -(that what i wants) . But In my receiving application i get information without these ( [SP] [CR]). how can i change the Encode and to get information with [SP] and [CR]? My Sending Application

    namespace WindowsFormsApplication14
    {
    public partial class Form1 : Form
    {
    SerialPort port;
    public Form1()
    {
    InitializeComponent();
    port = new SerialPort("COM1", 2400, Parity.None, 8, StopBits.One);
    port.Open();
    }

        private void button1\_Click(object sender, EventArgs e)
        {
            port.Write(textBox1.Text);
        }
    
        private void button2\_Click(object sender, EventArgs e)
        {
            port.Close();
        }
    }
    

    }

    my receiving application

    namespace WindowsFormsApplication3
    {
    public partial class Form1 : Form
    {
    private SerialPort p = new SerialPort("COM1", 2400, Parity.None, 8, StopBits.One);

        public Form1()
        {
            InitializeComponent();
    
            CheckForIllegalCrossThreadCalls = false;
           
            Thread t = new Thread(new ThreadStart(SerialPortProgram));
           
            t.Start(); 
        }
    
    
        public void SerialPortProgram()
        {
                p.DataReceived += new SerialDataReceivedEventHandler(port\_DataReceived);
                p.Open();
               Application.Run();
    
            }
    
        private void port\_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
    
    
            textBox1.Text += p.ReadExisting();
         
        }
    
    L 1 Reply Last reply
    0
    • A Admin887

      hi, i connected 2 computers with COM cable (RS232). i created 2 application for sending and receiving information. i tried to send information from the first computer and to see it at Listen32 program on the other computer. I get the information correctly with [CR] and [SP] -(that what i wants) . But In my receiving application i get information without these ( [SP] [CR]). how can i change the Encode and to get information with [SP] and [CR]? My Sending Application

      namespace WindowsFormsApplication14
      {
      public partial class Form1 : Form
      {
      SerialPort port;
      public Form1()
      {
      InitializeComponent();
      port = new SerialPort("COM1", 2400, Parity.None, 8, StopBits.One);
      port.Open();
      }

          private void button1\_Click(object sender, EventArgs e)
          {
              port.Write(textBox1.Text);
          }
      
          private void button2\_Click(object sender, EventArgs e)
          {
              port.Close();
          }
      }
      

      }

      my receiving application

      namespace WindowsFormsApplication3
      {
      public partial class Form1 : Form
      {
      private SerialPort p = new SerialPort("COM1", 2400, Parity.None, 8, StopBits.One);

          public Form1()
          {
              InitializeComponent();
      
              CheckForIllegalCrossThreadCalls = false;
             
              Thread t = new Thread(new ThreadStart(SerialPortProgram));
             
              t.Start(); 
          }
      
      
          public void SerialPortProgram()
          {
                  p.DataReceived += new SerialDataReceivedEventHandler(port\_DataReceived);
                  p.Open();
                 Application.Run();
      
              }
      
          private void port\_DataReceived(object sender, SerialDataReceivedEventArgs e)
          {
      
      
              textBox1.Text += p.ReadExisting();
           
          }
      
      L Offline
      L Offline
      Luc Pattyn
      wrote on last edited by
      #2

      Hi, what is the problem? what are those [SP] [CR] you speak about?

      Admin887 wrote:

      CheckForIllegalCrossThreadCalls = false;

      don't ever do this, it means you want to ignore a fundamental flaw in your code and hope it will work. Well, it will not. The right thing to do is make sure you touch controls only from inside the main thread; all other threads need to use the Control.InvokeRequired/Control.Invoke pattern. Look it up, it isn't hard to do it right.

      Admin887 wrote:

      Application.Run();

      What is this statement doing there? throw it out!

      Admin887 wrote:

      Thread t = new Thread(

      Why do you start another thread, all it does is open the serial port, you could have done that in the form's constructor (or in its Load handler). DataReceived will be called on yet another thread anyway, one you do not control at all (like most asynchronous operations in .NET). In summary: clean up the code, and research Control.InvokeRequired. :)

      Luc Pattyn [Forum Guidelines] [My Articles]


      - before you ask a question here, search CodeProject, then Google - the quality and detail of your question reflects on the effectiveness of the help you are likely to get - use the code block button (PRE tags) to preserve formatting when showing multi-line code snippets


      A 1 Reply Last reply
      0
      • L Luc Pattyn

        Hi, what is the problem? what are those [SP] [CR] you speak about?

        Admin887 wrote:

        CheckForIllegalCrossThreadCalls = false;

        don't ever do this, it means you want to ignore a fundamental flaw in your code and hope it will work. Well, it will not. The right thing to do is make sure you touch controls only from inside the main thread; all other threads need to use the Control.InvokeRequired/Control.Invoke pattern. Look it up, it isn't hard to do it right.

        Admin887 wrote:

        Application.Run();

        What is this statement doing there? throw it out!

        Admin887 wrote:

        Thread t = new Thread(

        Why do you start another thread, all it does is open the serial port, you could have done that in the form's constructor (or in its Load handler). DataReceived will be called on yet another thread anyway, one you do not control at all (like most asynchronous operations in .NET). In summary: clean up the code, and research Control.InvokeRequired. :)

        Luc Pattyn [Forum Guidelines] [My Articles]


        - before you ask a question here, search CodeProject, then Google - the quality and detail of your question reflects on the effectiveness of the help you are likely to get - use the code block button (PRE tags) to preserve formatting when showing multi-line code snippets


        A Offline
        A Offline
        Admin887
        wrote on last edited by
        #3

        first of all, thank you for your attention. [SP] (space in ASCII)= means that there is space in line [CR] (New row in ASCII)= means that there is a new row for example this line: I am going to show you something i want to get: I[SP]am[SP]going[SP]to[SP]show[SP]you[SP]something[CR] while reading from the port,i get the information in one row. i want to separate and to know when a row is ends- [CR]. i know that there is method port.readline() but the application stucks on this line. maybe there is another solution to know where the line is ends. (i means, when i send two lines to the port from the first computer - on the second computer, i get 1 long row). there is another way to solve it?

        L A 2 Replies Last reply
        0
        • A Admin887

          first of all, thank you for your attention. [SP] (space in ASCII)= means that there is space in line [CR] (New row in ASCII)= means that there is a new row for example this line: I am going to show you something i want to get: I[SP]am[SP]going[SP]to[SP]show[SP]you[SP]something[CR] while reading from the port,i get the information in one row. i want to separate and to know when a row is ends- [CR]. i know that there is method port.readline() but the application stucks on this line. maybe there is another solution to know where the line is ends. (i means, when i send two lines to the port from the first computer - on the second computer, i get 1 long row). there is another way to solve it?

          L Offline
          L Offline
          Luc Pattyn
          wrote on last edited by
          #4

          Hi,

          Admin887 wrote:

          [SP] (space in ASCII)= means that there is space in line [CR] (New row in ASCII)= means that there is a new row

          That's what I assumed, but I needed to be sure. If you are saying text is coming through correctly except for those two characters, then I admit I know of no reason why spaces would not work as intended. There are a few things you should be aware of: 1. serial ports transmit bytes, not characters. 2. .NET strings consist of characters, and Unicode characters at that (16-bit wide). 3. The SerialPort class translates characters to/from bytes using an Encoding; it has an Encoding property for that purpose, it is said it defaults to ASCII, but IIRC it works better when you set it explicitly, don't know why that is. And you might want to use code page 1252 so you get 8-bit ANSI characters (including some accented characters, trademark, copyright, euro, etc) rather than just the 7-bit ASCII set 4. SerialPort.ReadLine() waits for an end-of-line, which is defined through the NewLine property. AFAIK that is set to [CR][LF] by default (actually to Environment.NewLine). So as long as that exact sequence of characters isn't seen, there is no new line starting. 5. Your sending program isn't really sending any NewLine sequences, is it? it is rather difficult to enter them manually in a textbox. What you could do is transmit textbox.Text+Environment.NewLine though. :)

          Luc Pattyn [Forum Guidelines] [My Articles]


          - before you ask a question here, search CodeProject, then Google - the quality and detail of your question reflects on the effectiveness of the help you are likely to get - use the code block button (PRE tags) to preserve formatting when showing multi-line code snippets


          modified on Friday, June 10, 2011 11:37 AM

          1 Reply Last reply
          0
          • A Admin887

            first of all, thank you for your attention. [SP] (space in ASCII)= means that there is space in line [CR] (New row in ASCII)= means that there is a new row for example this line: I am going to show you something i want to get: I[SP]am[SP]going[SP]to[SP]show[SP]you[SP]something[CR] while reading from the port,i get the information in one row. i want to separate and to know when a row is ends- [CR]. i know that there is method port.readline() but the application stucks on this line. maybe there is another solution to know where the line is ends. (i means, when i send two lines to the port from the first computer - on the second computer, i get 1 long row). there is another way to solve it?

            A Offline
            A Offline
            Alan N
            wrote on last edited by
            #5

            Hi, I suggest you add some logging to your sending application to determine what you actually writing to the port. You can then view the log file with a hexadecimal editor and assure yourself that you are sending the correct sequence of bytes. If the file is as expected you could do something similar at the receiving end.

            private void button1_Click(object sender, EventArgs e){
            System.IO.File.AppendAllText("log.txt", textBox1.Text, port.Encoding);
            port.Write(textBox1.Text);
            }

            Alan.

            L 1 Reply Last reply
            0
            • A Alan N

              Hi, I suggest you add some logging to your sending application to determine what you actually writing to the port. You can then view the log file with a hexadecimal editor and assure yourself that you are sending the correct sequence of bytes. If the file is as expected you could do something similar at the receiving end.

              private void button1_Click(object sender, EventArgs e){
              System.IO.File.AppendAllText("log.txt", textBox1.Text, port.Encoding);
              port.Write(textBox1.Text);
              }

              Alan.

              L Offline
              L Offline
              Luc Pattyn
              wrote on last edited by
              #6

              Hi, I like that very much. I would even add a label showing the hex values of the bytes that get transmitted at the sender, and received at the receiver PC. Observability is key in debugging. :)

              Luc Pattyn [Forum Guidelines] [My Articles]


              - before you ask a question here, search CodeProject, then Google - the quality and detail of your question reflects on the effectiveness of the help you are likely to get - use the code block button (PRE tags) to preserve formatting when showing multi-line code snippets


              modified on Friday, June 10, 2011 11:37 AM

              1 Reply Last reply
              0
              Reply
              • Reply as topic
              Log in to reply
              • Oldest to Newest
              • Newest to Oldest
              • Most Votes


              • Login

              • Don't have an account? Register

              • Login or register to search.
              • First post
                Last post
              0
              • Categories
              • Recent
              • Tags
              • Popular
              • World
              • Users
              • Groups