SerialPort output problem
-
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(); }
-
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(); }
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
-
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
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?
-
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?
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
-
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?
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.
-
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.
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