串口的数据接收问题

时间:2021-11-11 17:41:22
各位前辈,小弟刚开始学习C#,碰到一个问题几天没有解决了,特来求助
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.IO.Ports;
using System.IO;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _0705_1352
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button_open_Click(object sender, EventArgs e)
        {
            serialPort1.PortName = "COM6";
            serialPort1.BaudRate = 115200;
            serialPort1.DataBits = 8;
            serialPort1.StopBits = System.IO.Ports.StopBits.One;
            serialPort1.Parity = System.IO.Ports.Parity.None;

            serialPort1.Open();
        }

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

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void textBox2_TextChanged(object sender, EventArgs e)
        {

        }

        private void button_send_Click(object sender, EventArgs e)
        {
            string str1 = "VE10\rEG200\rFL2000\rWT0.1\r";

            serialPort1.Write(str1);
            string str2 = "FL1000\rWT0.5\rFL-3000\r";

            serialPort1.Write(str2);




        }



      

    }
}
这是一个集成式伺服电机的控制程序
我将命令写进程序里面,不用手动输入,但是想知道从伺服电机他的返回值,不知道该怎么修改?
跪求赐教

12 个解决方案

#1



 serialPort1.DataReceived += new SerialDataReceivedEventHandler(portOnDataReceived);

  void portOnDataReceived(object sender, SerialDataReceivedEventArgs e)
        {
char[] portData = new char[serialPort1.BytesToRead];
            serialPort1.Read(portData, 0, portData.Length);

     //portData 就是返回值
        }

#2


串口控件有DataReceived事件,在这里接收数据

#3


 private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            
        }

#4


引用 1 楼 sj490790083 的回复:
 serialPort1.DataReceived += new SerialDataReceivedEventHandler(portOnDataReceived);

  void portOnDataReceived(object sender, SerialDataReceivedEventArgs e)
        {
char[] portData = new char[serialPort1.BytesToRead];
            serialPort1.Read(portData, 0, portData.Length);

     //portData 就是返回值
        }
 感谢前辈。 我把该执行的命令写进程序里面了,所以不用输入命令,只点击发送按钮就可以让电机运动。把这段代码加到里面去还是不能接收到任何返回值啊,是不是要用到委托之类的?

#5


错误 1 “_0705_1352.Form1”不包含“serialPort1_DataReceived”的定义,并且找不到可接受类型为“_0705_1352.Form1”的第一个参数的扩展方法“serialPort1_DataReceived”(是否缺少 using 指令或程序集引用?) C:\Users\Administrator\Desktop\0705-1352\0705-1352\Form1.Designer.cs 74 102 0705-1352
出现了这样一个错误,是不是与这个有关?

#6


你要用代码就用全套,不要这个人复制几行,那个人复制几行
你订阅的事件名称要和事件的函数名称一致啊.

#7


另外,串口返回的数据跟TCP数据包不同,不是按完整的包一下发过来的.
所以用串口接收事件去接,不是receive一次就能收到完整信息
最好自己开个线程while循环去接,如果一定时间之内(比如1ms)没有新的数据到达,才表示数据发完了
这个线程可以一开始就一直接数据,或者发送命令之后动态开个线程,接到完整数据就让线程退出

#8


正要找这个 。。。

#9


根据自己的实际需求修改一下,数据发送完后调用这个函数就可以了

private string ReceiveDate()
 {
            int k = 0;
            string strReceive = "";
            while (k < 50)
            {
                //接收到信息                
        int bytes = _modemPort.BytesToRead;
                byte[] comBuffer = new byte[bytes];
                serialPort1.Read(comBuffer, 0, bytes);
                if (comBuffer != null && comBuffer.Length > 0)
                {
                    strReceive += Encoding.ASCII.GetString(comBuffer);
                    
                    //这里可以添加判断是否接收到想要的数据

                }
                k++;
                Thread.Sleep(100);
            }

            return strReceive;
 }

#10


感谢楼上各位前辈,我想做到的是将返回值发送到textbox上,显示在串口助手上,以此来判断指令是否发送完整。由于刚开始学习,对线程不是很了解,所以用起来比较麻烦,看别人的源码用到的是invoke来委托,不知道该怎么运用invoke?

#11


你群里搜索下有个串口的调试助手,开源的

#12


引用 10 楼 evilive1104 的回复:
感谢楼上各位前辈,我想做到的是将返回值发送到textbox上,显示在串口助手上,以此来判断指令是否发送完整。由于刚开始学习,对线程不是很了解,所以用起来比较麻烦,看别人的源码用到的是invoke来委托,不知道该怎么运用invoke?

invoke是解决线程中无法访问控件的问题,跟你取数据没有关系
你取数据后给全局bool变量置true,用timer显示,也是一样的.

#1



 serialPort1.DataReceived += new SerialDataReceivedEventHandler(portOnDataReceived);

  void portOnDataReceived(object sender, SerialDataReceivedEventArgs e)
        {
char[] portData = new char[serialPort1.BytesToRead];
            serialPort1.Read(portData, 0, portData.Length);

     //portData 就是返回值
        }

#2


串口控件有DataReceived事件,在这里接收数据

#3


 private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            
        }

#4


引用 1 楼 sj490790083 的回复:
 serialPort1.DataReceived += new SerialDataReceivedEventHandler(portOnDataReceived);

  void portOnDataReceived(object sender, SerialDataReceivedEventArgs e)
        {
char[] portData = new char[serialPort1.BytesToRead];
            serialPort1.Read(portData, 0, portData.Length);

     //portData 就是返回值
        }
 感谢前辈。 我把该执行的命令写进程序里面了,所以不用输入命令,只点击发送按钮就可以让电机运动。把这段代码加到里面去还是不能接收到任何返回值啊,是不是要用到委托之类的?

#5


错误 1 “_0705_1352.Form1”不包含“serialPort1_DataReceived”的定义,并且找不到可接受类型为“_0705_1352.Form1”的第一个参数的扩展方法“serialPort1_DataReceived”(是否缺少 using 指令或程序集引用?) C:\Users\Administrator\Desktop\0705-1352\0705-1352\Form1.Designer.cs 74 102 0705-1352
出现了这样一个错误,是不是与这个有关?

#6


你要用代码就用全套,不要这个人复制几行,那个人复制几行
你订阅的事件名称要和事件的函数名称一致啊.

#7


另外,串口返回的数据跟TCP数据包不同,不是按完整的包一下发过来的.
所以用串口接收事件去接,不是receive一次就能收到完整信息
最好自己开个线程while循环去接,如果一定时间之内(比如1ms)没有新的数据到达,才表示数据发完了
这个线程可以一开始就一直接数据,或者发送命令之后动态开个线程,接到完整数据就让线程退出

#8


正要找这个 。。。

#9


根据自己的实际需求修改一下,数据发送完后调用这个函数就可以了

private string ReceiveDate()
 {
            int k = 0;
            string strReceive = "";
            while (k < 50)
            {
                //接收到信息                
        int bytes = _modemPort.BytesToRead;
                byte[] comBuffer = new byte[bytes];
                serialPort1.Read(comBuffer, 0, bytes);
                if (comBuffer != null && comBuffer.Length > 0)
                {
                    strReceive += Encoding.ASCII.GetString(comBuffer);
                    
                    //这里可以添加判断是否接收到想要的数据

                }
                k++;
                Thread.Sleep(100);
            }

            return strReceive;
 }

#10


感谢楼上各位前辈,我想做到的是将返回值发送到textbox上,显示在串口助手上,以此来判断指令是否发送完整。由于刚开始学习,对线程不是很了解,所以用起来比较麻烦,看别人的源码用到的是invoke来委托,不知道该怎么运用invoke?

#11


你群里搜索下有个串口的调试助手,开源的

#12


引用 10 楼 evilive1104 的回复:
感谢楼上各位前辈,我想做到的是将返回值发送到textbox上,显示在串口助手上,以此来判断指令是否发送完整。由于刚开始学习,对线程不是很了解,所以用起来比较麻烦,看别人的源码用到的是invoke来委托,不知道该怎么运用invoke?

invoke是解决线程中无法访问控件的问题,跟你取数据没有关系
你取数据后给全局bool变量置true,用timer显示,也是一样的.