C# 串口 SerialPort读取串口数据回显到文本框(显示不出来?)

magicring 2014-09-03 05:13:05
求教:
环境VS2010,RS-232,通过SerialPort读取COM1口数据,回显到文本框中,但是无法获取回显数据。
而通过串口调试工具,可以读取到发送到串口的值?

源码:http://yun.baidu.com/xcloud/csdn/pan/share/link?shareid=4153139475&uk=2757066167
...全文
1337 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
熙蚨 2014-09-05
  • 打赏
  • 举报
回复
於黾 2014-09-04
  • 打赏
  • 举报
回复
你发送的字节在发送缓冲区里,接收的字节在接收缓冲区里 如果不用其他软件虚拟,将端口自己连接起来,发送的内容就根本不会进入接收的缓冲区里
Sai950163 2014-09-04
  • 打赏
  • 举报
回复
同16,只有发送,没有接收。要有数据传送到COM1才能读到
於黾 2014-09-04
  • 打赏
  • 举报
回复
你自己发送的数据,同一台电脑,能读出来? 你串口调试助手能读到,是怎么读的
magicring 2014-09-04
  • 打赏
  • 举报
回复
其实我就是想尝试一下,先向串口发送一个数据,然后读出来,回显到文本框中。
引用 14 楼 sucretiger 的回复:
[quote=引用 11 楼 Sai950163 的回复:] [quote=引用 10 楼 sucretiger 的回复:] [quote=引用 8 楼 Z65443344 的回复:] 断点跟serialPort1_DataReceived,看到底有没有收到数据 然后再谈为什么显示不出来的问题
你好! 断点放在serialPort1_DataReceived里,为什么调试的时候进不去呢?[/quote] 这个嘛,可能是卡了哟,你把你这里的代码贴出来看看 [/quote]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;


namespace SimpleSerial
{
    public partial class Form1 : Form
    {
        // Add this variable 
        string RxString;

        public Form1()
        {
            InitializeComponent();
        }

        private void buttonStart_Click(object sender, EventArgs e)
        {
            serialPort1.PortName = "COM1";
            serialPort1.BaudRate = 9600;
            serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(serialPort1_DataReceived);
            serialPort1.Open();
            if (serialPort1.IsOpen)
            {
                buttonStart.Enabled = false;
                buttonStop.Enabled = true;
                textBox1.ReadOnly = false;
            }
        }

        private void buttonStop_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
            {
                serialPort1.Close();
                buttonStart.Enabled = true;
                buttonStop.Enabled = false;
                textBox1.ReadOnly = true;
            }

        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (serialPort1.IsOpen) serialPort1.Close();
        }

        private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            // If the port is closed, don't try to send a character.
            if (!serialPort1.IsOpen) return;

            // If the port is Open, declare a char[] array with one element.
            char[] buff = new char[1];

            // Load element 0 with the key character.
            buff[0] = e.KeyChar;

            // Send the one character buffer.
            serialPort1.Write(buff, 0, 1);

            // Set the KeyPress event as handled so the character won't
            // display locally. If you want it to display, omit the next line.
            e.Handled = true;
        }

        private void DisplayText(object sender, EventArgs e)
        {
            textBox1.AppendText(RxString);
        }

        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            //Thread.Sleep(100);

            //RxString = serialPort1.ReadExisting();
            //this.Invoke(new EventHandler(DisplayText));


            int SDateTemp = this.serialPort1.ReadByte();
            //读取串口中一个字节的数据
            this.textBox1.Invoke(
                //在拥有此控件的基础窗口句柄的线程上执行委托Invoke(Delegate)
                //即在textBox_ReceiveDate控件的父窗口form中执行委托.
             new MethodInvoker(
                /*表示一个委托,该委托可执行托管代码中声明为 void 且不接受任何参数的任何方法。 在对控件的 Invoke 	方法进行调用时或需要一个简单委托又不想自己定义时可以使用该委托。*/
             delegate
             {
                 /*匿名方法,C#2.0的新功能,这是一种允许程序员将一段完整代码区块当成参数传递的程序代码编写技术,通过此种方法可 	以直接使用委托来设计事件响应程序以下就是你要在主线程上实现的功能但是有一点要注意,这里不适宜处理过多的方法,因为C#消息机制是消息流水线响应机制,如果这里在主线程上处理语句的时间过长会导致主UI线程阻塞,停止响应或响应不顺畅,这时你的主form界面会延迟或卡死      */
                 this.textBox1.AppendText(SDateTemp.ToString());//输出到主窗口文本控件
                 this.textBox1.Text += " ";
             }
             )
             );
        }


    }
}
[/quote]
magicring 2014-09-04
  • 打赏
  • 举报
回复
引用 11 楼 Sai950163 的回复:
[quote=引用 10 楼 sucretiger 的回复:] [quote=引用 8 楼 Z65443344 的回复:] 断点跟serialPort1_DataReceived,看到底有没有收到数据 然后再谈为什么显示不出来的问题
你好! 断点放在serialPort1_DataReceived里,为什么调试的时候进不去呢?[/quote] 这个嘛,可能是卡了哟,你把你这里的代码贴出来看看 [/quote]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;


namespace SimpleSerial
{
    public partial class Form1 : Form
    {
        // Add this variable 
        string RxString;

        public Form1()
        {
            InitializeComponent();
        }

        private void buttonStart_Click(object sender, EventArgs e)
        {
            serialPort1.PortName = "COM1";
            serialPort1.BaudRate = 9600;
            serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(serialPort1_DataReceived);
            serialPort1.Open();
            if (serialPort1.IsOpen)
            {
                buttonStart.Enabled = false;
                buttonStop.Enabled = true;
                textBox1.ReadOnly = false;
            }
        }

        private void buttonStop_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
            {
                serialPort1.Close();
                buttonStart.Enabled = true;
                buttonStop.Enabled = false;
                textBox1.ReadOnly = true;
            }

        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (serialPort1.IsOpen) serialPort1.Close();
        }

        private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            // If the port is closed, don't try to send a character.
            if (!serialPort1.IsOpen) return;

            // If the port is Open, declare a char[] array with one element.
            char[] buff = new char[1];

            // Load element 0 with the key character.
            buff[0] = e.KeyChar;

            // Send the one character buffer.
            serialPort1.Write(buff, 0, 1);

            // Set the KeyPress event as handled so the character won't
            // display locally. If you want it to display, omit the next line.
            e.Handled = true;
        }

        private void DisplayText(object sender, EventArgs e)
        {
            textBox1.AppendText(RxString);
        }

        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            //Thread.Sleep(100);

            //RxString = serialPort1.ReadExisting();
            //this.Invoke(new EventHandler(DisplayText));


            int SDateTemp = this.serialPort1.ReadByte();
            //读取串口中一个字节的数据
            this.textBox1.Invoke(
                //在拥有此控件的基础窗口句柄的线程上执行委托Invoke(Delegate)
                //即在textBox_ReceiveDate控件的父窗口form中执行委托.
             new MethodInvoker(
                /*表示一个委托,该委托可执行托管代码中声明为 void 且不接受任何参数的任何方法。 在对控件的 Invoke 	方法进行调用时或需要一个简单委托又不想自己定义时可以使用该委托。*/
             delegate
             {
                 /*匿名方法,C#2.0的新功能,这是一种允许程序员将一段完整代码区块当成参数传递的程序代码编写技术,通过此种方法可 	以直接使用委托来设计事件响应程序以下就是你要在主线程上实现的功能但是有一点要注意,这里不适宜处理过多的方法,因为C#消息机制是消息流水线响应机制,如果这里在主线程上处理语句的时间过长会导致主UI线程阻塞,停止响应或响应不顺畅,这时你的主form界面会延迟或卡死      */
                 this.textBox1.AppendText(SDateTemp.ToString());//输出到主窗口文本控件
                 this.textBox1.Text += " ";
             }
             )
             );
        }


    }
}
於黾 2014-09-04
  • 打赏
  • 举报
回复
就是根本没有接到数据,所以回调事件没有执行呗.
Sai950163 2014-09-04
  • 打赏
  • 举报
回复
另外COM1一般是系统自身占用的,你确定你用sscom可以打开COM1?
Sai950163 2014-09-04
  • 打赏
  • 举报
回复
引用 10 楼 sucretiger 的回复:
[quote=引用 8 楼 Z65443344 的回复:] 断点跟serialPort1_DataReceived,看到底有没有收到数据 然后再谈为什么显示不出来的问题
你好! 断点放在serialPort1_DataReceived里,为什么调试的时候进不去呢?[/quote] 这个嘛,可能是卡了哟,你把你这里的代码贴出来看看
magicring 2014-09-04
  • 打赏
  • 举报
回复
引用 8 楼 Z65443344 的回复:
断点跟serialPort1_DataReceived,看到底有没有收到数据 然后再谈为什么显示不出来的问题
你好! 断点放在serialPort1_DataReceived里,为什么调试的时候进不去呢?
於黾 2014-09-04
  • 打赏
  • 举报
回复
还有,仔细看串口调试助手是如何操作的 应该是在一个文本框中输入要发送的内容,点按钮,一次性发送出去 而不是输入一个字母,就发送一个字母 你这个设备,如果是两个人用串口聊天还可以 如果是发送到某个自动化的设备,人家可不认识你这样一会一个的字母到底什么意思
於黾 2014-09-04
  • 打赏
  • 举报
回复
断点跟serialPort1_DataReceived,看到底有没有收到数据 然后再谈为什么显示不出来的问题
於黾 2014-09-04
  • 打赏
  • 举报
回复
取回显示的数据,从什么设备取回? 不是应该用串口调试助手从串口线的另一端,向你的串口发指令,你才能取回么
asia217 2014-09-04
  • 打赏
  • 举报
回复
代码贴出来看看,显示数据那段
magicring 2014-09-04
  • 打赏
  • 举报
回复
引用 楼主 sucretiger 的回复:
求教: 环境VS2010,RS-232,通过SerialPort读取COM1口数据,回显到文本框中,但是无法获取回显数据。 而通过串口调试工具,可以读取到发送到串口的值? 源码:http://yun.baidu.com/xcloud/csdn/pan/share/link?shareid=4153139475&uk=2757066167
引用 1 楼 Z65443344 的回复:
断点看,到底收到数据没有
试过了,就是没有数据,可是我同时打开了一个串口调试程序。里面是可以显示我发送到串口的数据的。
magicring 2014-09-04
  • 打赏
  • 举报
回复
引用 2 楼 caozhy 的回复:
估计是你程序没写对,你需要加一点延迟,然后把缓冲区的数据全部取出来。注意串口是串行发送数据的,你需要累加它发来的数据,而不是简单的接收,不然后面的数据会冲掉前面的。
你有调试我的源码吗?可以试一下,我是想在文本框中显示数据,可是却没有值。
magicring 2014-09-04
  • 打赏
  • 举报
回复
你有调试我的源码吗?可以试一下,我是想在文本框中显示数据,可是却没有值。
於黾 2014-09-04
  • 打赏
  • 举报
回复
想让发送的内容直接显示 e.Handled = true;去掉就行了.
於黾 2014-09-04
  • 打赏
  • 举报
回复
所以说,你用的根本不是串口调试助手 CommMonitor中反应出来的是你发送的内容,而不是接收的内容 你串口根本没有接收到任何数据
magicring 2014-09-04
  • 打赏
  • 举报
回复
引用 22 楼 Z65443344 的回复:
你的程序用的是COM几,串口调试助手用的又是COM几,都是在同一台电脑上? 同一台电脑,两个不同的软件,能够同时打开COM1?
我的机器只有一个COM1,我使用的是串口监视精灵CommMonitor. 我程序对串口的操作,都会在CommMonitor中反应出来。
加载更多回复(6)

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧