极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 21814|回复: 12

打开串口为何会中断运行程序从头开始

[复制链接]
发表于 2016-4-19 13:30:32 | 显示全部楼层 |阅读模式
本帖最后由 frankpian 于 2016-4-19 17:25 编辑

下面是主函数部分,主要是收集一些字符串写到SD卡里,正常上电运行后,程序走完setup()就在loop()里循环了,可是只要打开串口,又会跳到setup()从头运行一遍,这样导致我SD卡生成一个新的文件,我想让串口只作为单向监视功能,只要程序开始就发数据,不管有没有接受,有接受也不要影响程序正常运行。

  1. #include <SoftwareSerial.h>
  2. #include <SPI.h>
  3. #include <SD.h>

  4. SoftwareSerial senSerial(8,9); //软串口RX,TX

  5. //******laserSensor模块,strDistance(),Proof_Test()******
  6. const uint8_t CONT_MEASURE[4]={0x80,0x06,0x03,0x77}; //定义发送连续测量命令
  7. uint8_t count[11]={0}; //接收传感器11位数据

  8. //****** 用于SD卡设置******
  9. const int chipSelect = 10;//设置片选CS,MEGA 53,NANO 10
  10. String logname = ""; //用于存储日志文件名


  11. //******用于序号******
  12. unsigned int number = 0; //用于存储序号

  13. void setup() {
  14.     //******用于PWM******
  15.     pinMode(4,INPUT); //D4设置为输入
  16.    
  17.     //打开串口调试
  18.     Serial.begin(9600);//打开调试串口
  19.     senSerial.begin(9600);//打开传感器串口
  20.     /*
  21.     while(!Serial){
  22.       ;//等待调试串口连接
  23.     }
  24.     */
  25.     //******SD卡初始化******
  26.     Serial.print("Initializing SD card...");
  27.     //判断SD卡是否正常
  28.     if (!SD.begin(chipSelect)){
  29.         Serial.println("Card failed, or not present");
  30.         return;
  31.     }
  32.     Serial.println("card initialized.");
  33.    
  34.     logname = fileName(); //获取文件名
  35. }

  36. void loop() {
  37.   
  38.     //调用模块,序号+PWM+时间+激光高度
  39.     String dataString = "";//用于存储和打印的字符串
  40.     dataString = serialNumber() + receiver5CH() + currentTime() + strDistance();
  41.    
  42.     //打开创建一个文件,因此需要关闭之前打开的另一个
  43.     File dataFile =SD.open(logname,FILE_WRITE);
  44.     //如果文件可用,开始写入
  45.     if(dataFile){
  46.         dataFile.println(dataString);
  47.         dataFile.close();
  48.         //在调试串口打印相同内容
  49.         Serial.println(dataString);
  50.       }
  51.     //如果文件不能打开,提示Erro
  52.     else {
  53.         Serial.println("error opening " + logname);
  54.     }

  55. }
复制代码


回复

使用道具 举报

发表于 2016-4-19 17:51:41 | 显示全部楼层
因为在电路设计上和复位连一块了
回复 支持 反对

使用道具 举报

发表于 2016-4-19 18:14:01 | 显示全部楼层
Arduino芯片的话在实际上就是只要你打开串口就自动之行复位,目的是方便你能够完成的看到程序从头到尾的输出,解决方案就是你在setup里面开头加入一个符合你手速的delay就可以了,比如delay(5000),让程序等你到打开串口在开始工作
回复 支持 反对

使用道具 举报

发表于 2016-4-20 08:27:46 | 显示全部楼层
不能用官方的ide自带的串口功能。你用别的串口软件试试?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-20 16:55:34 | 显示全部楼层
zjz5717 发表于 2016-4-19 18:14
Arduino芯片的话在实际上就是只要你打开串口就自动之行复位,目的是方便你能够完成的看到程序从头到尾的输出 ...

原来如此,可是我根本就不一定延迟五秒就够用,这有什么其他的解决办法吗
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-20 16:56:03 | 显示全部楼层
maxims 发表于 2016-4-20 08:27
不能用官方的ide自带的串口功能。你用别的串口软件试试?

我一直没用过IDE上的那个,太简易了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-20 16:58:12 | 显示全部楼层
zjz5717 发表于 2016-4-19 18:14
Arduino芯片的话在实际上就是只要你打开串口就自动之行复位,目的是方便你能够完成的看到程序从头到尾的输出 ...

如果我使用蓝牙无线串口,拔掉ARDUINO上的RX,只留TX行不行,这样他就不知道我连上了没
回复 支持 反对

使用道具 举报

发表于 2016-4-20 17:35:23 | 显示全部楼层
frankpian 发表于 2016-4-20 16:55
原来如此,可是我根本就不一定延迟五秒就够用,这有什么其他的解决办法吗

这这这,实在不行你可以延时10秒,15秒
回复 支持 反对

使用道具 举报

发表于 2016-4-20 17:36:26 | 显示全部楼层
frankpian 发表于 2016-4-20 16:58
如果我使用蓝牙无线串口,拔掉ARDUINO上的RX,只留TX行不行,这样他就不知道我连上了没

TX是发送端口,Arduino向蓝牙,向PC都是用TX,RX是接收端。。。
回复 支持 反对

使用道具 举报

发表于 2016-4-20 17:36:42 | 显示全部楼层
frankpian 发表于 2016-4-20 16:58
如果我使用蓝牙无线串口,拔掉ARDUINO上的RX,只留TX行不行,这样他就不知道我连上了没

没有明白你想干什么
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-20 17:43:10 | 显示全部楼层
zjz5717 发表于 2016-4-20 17:36
没有明白你想干什么

我只想串口作为监视作用,只收不发
回复 支持 反对

使用道具 举报

发表于 2016-4-20 17:47:57 | 显示全部楼层
frankpian 发表于 2016-4-20 17:43
我只想串口作为监视作用,只收不发

如果只收不发的话,你可以只接TX口,这没有问题
回复 支持 反对

使用道具 举报

发表于 2016-4-24 17:31:19 | 显示全部楼层
我的电机也是 在下载程式时 它就全速转动,或者当打开串口监视器的时候,也一样的全速转动一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-15 04:15 , Processed in 0.037534 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表