Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 串行数据接收多个数据_C#_Serial Port_Stepper - Fatal编程技术网

C# 串行数据接收多个数据

C# 串行数据接收多个数据,c#,serial-port,stepper,C#,Serial Port,Stepper,我有一个C#应用程序,它试图从步进控制器读取两个电机位置,但似乎感到困惑——或者至少我感到困惑。如果我只要求一个电机位置,它工作得很好 为了让控制器发送数据,我必须向它发送一个命令@00PX代表X位置,@00PY代表Y位置。控制器返回位置的28位数字-后跟一个数字 我需要在电机移动时实时获取这些信息,并区分文本框中哪些数据是X,哪些数据是Y 我使用定时器滴答事件发送@00PX命令,然后每50毫秒发送一次@00PY命令。接收到的数据事件(最多读取一个CR字符)似乎变得混乱,并将数据随机放置在任一文

我有一个C#应用程序,它试图从步进控制器读取两个电机位置,但似乎感到困惑——或者至少我感到困惑。如果我只要求一个电机位置,它工作得很好

为了让控制器发送数据,我必须向它发送一个命令@00PX代表X位置,@00PY代表Y位置。控制器返回位置的28位数字-后跟一个数字

我需要在电机移动时实时获取这些信息,并区分文本框中哪些数据是X,哪些数据是Y

我使用定时器滴答事件发送@00PX命令,然后每50毫秒发送一次@00PY命令。接收到的数据事件(最多读取一个CR字符)似乎变得混乱,并将数据随机放置在任一文本框中。我还尝试在数据调用之前为Xpos和YPO应用标志,然后在读取数据之后重置,但它似乎并不一致

我可能完全错了,但最终还是想得到编码器的值,这样就可以得到更清晰的数据。我可以利用任何建议来完成这项工作

private void SerialPortController_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {

        SerialPort sp = (SerialPort)sender;
        ControllerData = sp.ReadTo("\r");  //reads up to the <CR> and then outputs data

        {
            labelStatus.Invoke(new MethodInvoker(delegate { labelStatus.Text = ControllerData; ; })); //testing to see what is all output from controller
            Int32 numOnly = 0;

            bool result = int.TryParse(ControllerData, out numOnly); //numOnly should be number only and bool set to true

            if (result == true) //checks to ensure that indata is only numbers - if true, display in text box
            {
                if (XPos == true)
                {

                    if (radioButtonMoveDetector.Checked == true)
                    {
                        textBoxTotalDetectorSteps.Invoke(new MethodInvoker(delegate { textBoxTotalDetectorSteps.Text = ControllerData; ; })); //only place numbers in Text box not control characters
                    }
                    labelXPos.Invoke(new MethodInvoker(delegate { labelXPos.Text = ControllerData; ; })); //Show X position
                    XPos = false;
                    YPos = true;
                    serialPortController.Write("@00PY\r");

                }
                else if (YPos == true)
                {
                    if (radioButtonMoveSource.Checked == true)
                    {
                        textBoxTotalSourceSteps.Invoke(new MethodInvoker(delegate { textBoxTotalSourceSteps.Text = ControllerData; ; })); //only place numbers in Text box not control characters
                    }
                    labelYPos.Invoke(new MethodInvoker(delegate { labelYPos.Text = ControllerData; ; })); //Show Y position
                    YPos = false;

private void timerMotor_Tick(object sender, EventArgs e)
    {
        if (serialPortController.IsOpen)  //Check to ensure serial port is open 
        {
            //timerMotor.Stop();
            XPos = true;
            serialPortController.Write("@00PX\r");//Sends command to retrieve motor X step position - a 28 bit number followed with a CR

            //YPos = true;
            serialPortController.Write("@00PY\r");
private void SerialPortController\u DataReceived(对象发送方,SerialDataReceivedEventArgs e)
{
SerialPort sp=(SerialPort)发送方;
ControllerData=sp.ReadTo(“\r”);//读取到,然后输出数据
{
Invoke(newmethodinvoker(委托{labelStatus.Text=ControllerData;;}));//测试控制器的所有输出
Int32 nummonly=0;
bool result=int.TryParse(ControllerData,out numOnly);//numOnly应仅为数字且bool设置为true
if(result==true)//检查以确保indata仅为数字-如果为true,则显示在文本框中
{
如果(XPos==true)
{
如果(radioButtonMoveDetector.Checked==true)
{
textBoxTotalDetectorSteps.Invoke(新方法调用程序(委托{textBoxTotalDetectorSteps.Text=ControllerData;;}));//只在文本框中放置数字,不放置控制字符
}
调用(新方法调用程序(委托{labelXPos.Text=ControllerData;;}));//显示X位置
XPos=false;
YPos=真;
serialPortController.Write(“@00PY\r”);
}
else if(YPos==true)
{
if(radioButtonMoveSource.Checked==true)
{
textBoxTotalSourceSteps.Invoke(新的MethodInvoker(委托{textBoxTotalSourceSteps.Text=ControllerData;;}));//只在文本框中放置数字而不是控制字符
}
调用(新方法调用程序(委托{labelYPos.Text=ControllerData;;}));//显示Y位置
YPos=假;
私有void timerMotor_Tick(对象发送方,事件参数e)
{
if(serialPortController.IsOpen)//检查以确保串行端口已打开
{
//timerMotor.Stop();
XPos=true;
serialPortController.Write(“@00PX\r”);//发送命令以检索电机X步进位置-后跟CR的28位数字
//YPos=真;
serialPortController.Write(“@00PY\r”);

我删除了DataReceived事件,并在一个单独的模块中按顺序在发送和接收事件中编程,该模块从计时器开始调用。计时器在发送接收模块开始时停止,然后在结束时启动。感谢Stephen的确认,并将我引导到正确的方向。

您不用等待或者来自硬件的响应。如果你无法从回复内容中检测到它所指的操作,那么你必须发送命令X,处理响应,然后发送命令Y,依此类推。现在你很可能在发送了Y之后收到对X的响应!我同意Stephen。我认为上述只是一个瞎说。我要去专业gram在一次发送中,读取特定的响应,发送下一个命令,读取所有4个值的响应等,然后重复。今晚将尝试编程。