找回密码
 立即注册

QQ登录

只需一步,快速开始

点击进入授权页面

只需一步,快速开始

  • QQ空间
  • 回复
  • 收藏

[已解决] arduino串口缓存

参加活动: 0

组织活动: 0

该用户从未签到

本帖最后由 可可西里 于 2017-11-15 00:47 编辑

以下是arduino官网上的一段开源代码。用于控制XYZ三个方向的步进电机。此代码是主程序代码。原程序中没有c!=‘N’和c=='N’两项,
我加这两项的目的是为了一次性输入多条代码,通过N字母做每条代码的分断符号。

// Arduino G-code Interpreter
// v1.0 Carlos guilarte y diego colonnello...
// Modificado para manejar tres ejes en un cnc chimbo... jejeje

#include <HardwareSerial.h>

//our command string
#define COMMAND_SIZE 128
char palabra[COMMAND_SIZE];
byte serial_count;
int no_data = 0;

void setup()
{
  //Do startup stuff here
  Serial.begin(9600);
  Serial.println("start");

  //other initialization.
  init_process_string();
  init_steppers();

}

void loop()
{
  char c;

  //keep it hot!


  //read in characters if we got them.
  if (Serial.available() > 0)
  {
    //delay(1000);
    c = Serial.read();
    no_data = 0;

    //newlines are ends of commands.
    if (c != '\n'&&c!='N')
    {
      palabra[serial_count] = c;
      serial_count++;
    }
  }
  //mark no data.
  else
  {
    no_data++;
    delayMicroseconds(100);
  }

  //if theres a pause or we got a real command, do it
  if (serial_count && (c == '\n' ||c=='N'|| no_data > 100))
  {
    //process our command!
    process_string(palabra, serial_count);

    //clear command.
    init_process_string();
    //while(Serial.read()>=0){}
  }

  //no data?  turn off steppers
  if (no_data > 1000)
    disable_steppers();
}


以下是我想输入的命令

N4 G90
N5 G00X22.303Y-27.781Z5.000
N6 Z2.020
N7 G01 Z-0.1 F2500
N8 X17.948 Y-24.846 Z-0.126 F2500
N9 X8.178 Y-32.487 Z-0.134
N10 X11.592 Y-20.562 Z-0.242
N11 X1.306 Y-13.631 Z-0.351
N12 X13.701 Y-13.193 Z-0.459
N13 X17.115 Y-1.269 Z-0.567
N14 X21.362 Y-12.922 Z-0.675
N15 X33.758 Y-12.484 Z-0.784
N16 X23.987 Y-20.125 Z-0.892
N17 X28.234 Y-31.778 Z-1.000
N18 X23.987 Y-20.125
N19 X33.758 Y-12.484
N20 X21.362 Y-12.922
N21 X17.115 Y-1.269
N22 X13.701 Y-13.193
N23 X1.306 Y-13.631
N24 X11.592 Y-20.562
N25 X8.178 Y-32.487
N26 X17.948 Y-24.846
N27 X28.234 Y-31.778
N28 G00 Z5.000
N29 G28
N30 M05

但通过返回palabra到监视器观察结果,得到的命令是
start
4 G90  
5 G00X22.303Y-27.781Z5.000
6 Z2.020
7 G01 Z-0.1 F2500
8 X17.948 Y-24.846 Z-0.126 F2500


修改波特率为4800后,得到的结果是
start
4 G90  
5 G00X22.303Y-27.781Z5.000
6 Z2.020
7 G01 Z-0.1 F2500
8 X17.948 Y-24.846 Z-0.126 F2500
21 3 X1.306 Y-13.631
Y-32.487
26 X17.948 Y-24.846
29 G28
Huh? M5


请问是什么原因?我使用的板子是Arduino Nano。是不是因为太迷你了,所以很多功能简化了?可以通过什么办法解决呢,我还想一次性输入几百条命令啊。



你就if(資料) if x == "你的開始字元"  後續就是做字元切割  在看你要用什麼當作結束字元摟
你可以參考參考博哥 博哥的文應該對你有幫助 《博哥玩Arduino
superme 发表于 2017-11-14 16:48
你就if(資料) if x == "你的開始字元"  後續就是做字元切割  在看你要用什麼當作結束字元摟  ...

我是以字母"N"作为分割符。结果中的N4到N8是准确的,N9以后就乱了,难道是溢出了?博哥的文章也在看,还没找到答案。
我将缓存区的剩余位数显示了出来,发现最大为64,这个数值应该就是这个板子的缓存容量了,64个字节。
本帖最后由 可可西里 于 2017-11-15 00:47 编辑

这个问题就是缓存区小引起 的,我修改了缓存区大小到了896后,在波特率2400情况下,可以一次输入800条左右了。
嗯嗯嗯解決就好~~
本帖最后由 可可西里 于 2017-11-19 17:41 编辑

我将缓存区提高到了1152,波特率设为1200,可以一次输入1000多条短命令(就是执行完需要的时间较短)。但仍不能满足我的需要,因为一个图片需要的命令有几千行。于是我想到了下面的方法,希望对存在此问题的人有所帮助。
这个方法就是在每一行G命令前插入空的命令,也就是不需执行命令的字符串。这样的话,空命令因为不需执行,很快就会被Serial。read()命令给清除掉,相当于释放了缓存区。当然也可以理解为,让空命令字符串取代了会丢失的真的命令。所有能将真的命令完整的保持下来。
每一行插入的字符数为15个。
下面是我添加了空命令字符串后的命令截图。在未插入空命令字符串前只能一次执行200条,插入后一次可将7000多条一次性输入。

N000000000000000N1 G90
N000000000000000N2 T0 ([锥度平底]JD-20-0.20)
N000000000000000N3 G00X-0.001Y-32.669Z2.000
N000000000000000N4 Z0.200
N000000000000000N5 G01F5000
N000000000000000N6 X0.299Y-32.674F5000
N000000000000000N7 Z-2.500
N000000000000000N8 X32.095Y-33.180
N000000000000000N9 X32.099Y-32.880
N000000000000000N10 X0.003Y-32.369
N000000000000000N11 X0.008Y-32.069
N000000000000000N12 X32.104Y-32.580
N000000000000000N13 X32.109Y-32.280
N000000000000000N14 X0.013Y-31.770
N000000000000000N15 X0.018Y-31.470
N000000000000000N16 X32.114Y-31.980
N000000000000000N17 X32.118Y-31.680
N000000000000000N18 X0.022Y-31.170
N000000000000000N19 X0.027Y-30.870
N000000000000000N20 X0.927Y-30.884
N000000000000000N21 Z0.200
N000000000000000N22 X1.227Y-30.889

当然最好的办法是,当单片机缓存区快满的时候向电脑发出一条命令,让其停止传送数据,直到缓存区数据下降到一定值后再继续传送。我还没找到
实现此想法的方式,希望知道的人能在下方留言。
发新帖
发表评论
高级模式  
您需要登录后才可以回帖 登录 | 立即注册  
关闭

推荐主题 上一条 /2 下一条