开源改变世界

处理在 com 端口上接收到的数据的函数 #38

推推 grbl 3年前 (2023-02-09) 281次浏览
关闭
deHarro 打开了这个问题 2018 年 11 月 7 日 · 2 条评论
关闭

处理在 com 端口上接收到的数据的函数#38

deHarro 打开了这个问题 2018 年 11 月 7 日 · 2 条评论

评论

处理在 com 端口上接收到的数据的函数 #38
德哈罗 评论了 2018 年 11 月 7 日  

嗨斯文,

这不是一个大问题,因为您当前的实施有效,但我想指出这一点。

你最近向我指出了 GRBL 通信的说明,我们过去已经完成了所有这些。
您将与我的操纵杆通信的相关代码部分发布为:

命令行应以 \r\n (CR LF) 结尾才能被识别为一个命令。

        private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {   while ((serialPort.IsOpen) && (serialPort.BytesToRead > 0))
            {   rxString = string.Empty;
                try
                {   rxString = serialPort.ReadTo("\r\n");              //read line from grbl, discard CR LF
                    this.Invoke(new EventHandler(handleRxData));        //tigger rx process 
                    while ((serialPort.IsOpen) && (isDataProcessing)) ;  //wait previous data line processed done
                }
                catch (Exception errort)
                {   serialPort.Close();
                    logError("Error reading line from serial port", errort);
                }
            }
        }

        private void handleRxData(object sender, EventArgs e)
        {
            rtbLog.AppendText(string.Format("< {0} \r\n", rxString));
            OnRaiseCommandEvent(new CommandEventArgs(rxString));
            isDataProcessing = false;
        }

最初发布者@svenhb#29(评论)

我刚刚再次阅读了我们关于与 GRBL 通信的讨论,我在GRBL V1.1 站点上偶然发现了以下说明:

与 Grbl 通信的主要方式是向它发送一串字符,然后是回车符

所以你的实现似乎被过度定义了,你搜索“CR LF”,GRBL 只想要“CR”。

哈拉尔德

处理在 com 端口上接收到的数据的函数 #38
所有者

你说得对,下次我会改的。

处理在 com 端口上接收到的数据的函数 #38 svenhb 添加了 增强 标签 2018 年 11 月 7 日
处理在 com 端口上接收到的数据的函数 #38
所有者

它已经在当前版本中实现。我检查 CR 或 LF:

        private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {   while ((serialPort.IsOpen) && (serialPort.BytesToRead > 0))
            {
                byte[] rxBuff = new byte[serialPort.BytesToRead];
                serialPort.Read(rxBuff, 0, serialPort.BytesToRead);
                byte rxTmpChar = 0;
                try
                {   foreach (byte rxTmpChart in rxBuff)
                    {
                        rxTmpChar = rxTmpChart;
                        if ((rxTmpChar > 0x7F) || (isRealTimeCmd.Contains(rxTmpChar)))  // is real time cmd ?
                        {   rxChar = rxTmpChar;
                            this.Invoke(new EventHandler(handleRxData));
                        }
                        else
                        {   rxTmpString += (char)rxTmpChar;
                            if ((rxTmpChar == '\r') || (rxTmpChar == '\n'))             // end of regular command
                            {   if (lastChar >= ' ')
                                {
                                    rxChar = 0;
                                    rxString = rxTmpString.Trim();
                                    this.Invoke(new EventHandler(handleRxData));
                                }
                                rxTmpString = "";
                            }
                        }
                        lastChar = rxTmpChar;
                    }
                }
                catch (Exception errort)
                {   serialPort.Close();
                    logError("Error reading line from serial port", errort);
                }
            }
        }