Steins;Lab

  • 项目
  • 折腾
  • 笔记
  • 图册
  • 杂谈
  • 文章索引 - 博主自荐博文
  • 关于/留言
Steins;Lab
某团的自留研究所
  1. 首页
  2. 学习笔记
  3. 正文

【学习笔记】Arduino与上位机的串口通讯笔记(一)

2016年9月6日 11404点热度 2人点赞 1条评论

Arduino与上位机的串口通讯相关笔记(一) Arduino下位机相关

ArduinoUnoChinese_front

Table of Contents

  • 0.前言
  • 1.ARDUINO中的串口通信函数
    • 1.1 函数
    • 1.2 需要注意的一些事项
  • 2. 下位机编程
    • 2.1 模式选择
    • 2.2 数值传递

 

0.前言

最近在读书籍:《ARDUINO与LABVIEW开发实战》、《Labview虚拟仪器数据采集与串口通信测控应用实战》。

 

看到了许多用arduino作为下位机的测控实例,感觉颇为有趣。

说到底,ARDUINO与LABVIEW等等只是工具,真正项目使用的元件取决于必须满足的要求、精度、成本和开发时间。在作者提供的测控实例中,arduino作为下位机,体现着性价比极高的特点。尤其是采样速率和精度要求不高时,可以胜任一定的需求。labview作为上位机,简单易用,其虚拟仪器的特点令软件设计可视化,同时提供了系列的前面板设计环境,所见即所得。

 

最近攒集的笔记主要是关于arduino与上位机通信的内容

1.ARDUINO中的串口通信函数

1.1 函数

Serial.begin(speed)
//speed为波特率,通信双方波特率相同。常用300/1200/2400/4800/9600/14400/19200

Serial.available()
//从串口读取有效的字节数,在串行接受缓冲区的数据。

//注意:串口缓冲区为64B,使用Serial.read时,读取1字节,同时从缓冲区删除

Serial.read()
//读取1字节的数据,若无可用数据,返回-1

Serial.write()
//写入二进制数据到串口,如
      Serial.write(val)
      Serial.write(str)
      Serial.write(buf,len)

Serial.print()
Serial.println()
//注意:每个数字输出使用的是ASCII字符,浮点类型同样输出的是ASCII字符,默认保留小数点后2位
//byte输出单个字符
//字符和字符串原样输出
//println输出数据自动换行


//例如

Serial.print(78); //"78"
Serial.print(1.23456);//"123"
Serial.print("N");//"N"
Serial.print("Hello");//"Hello"

Serial.print(78,BIN);//"1001110"
//可选: BIN,OCT,DEC,HEX

Serial.print(1.23456,0) //"1"


Serial.end
//停止通信

1.2 需要注意的一些事项

  • 串口缓冲区为64B,使用Serial.read时,读取1字节,同时从缓冲区删除
  • 注意:每个数字输出使用的是ASCII字符,浮点类型同样输出的是ASCII字符,默认保留小数点后2位
    byte输出单个字符
    字符和字符串原样输出
    println输出数据自动换行
  • 输出附加指令参照最后的例子

 


2. 下位机编程

2.1 模式选择

一般地,一个下位机可能不工作在单一的模式中,需要初始化时指定其工作模式。工作模式通过如下思路选择

volatile int mode_flag =0 ;
volatile long maxnum;
byte comdata[3]={0};
char numdata[4]={0,0,0,0};

#define A0_Command 0x10
#define A1_Command 0x11
#define A2_Command 0x20
#define A3_Command 0x21


void receive_data()
{
    int i;
    for(i=0;i<3;i++)
    {
        comdata[i]= Serial.read();
        delay(2);
      }
    for(i=0;i<4;i++)
    {
        numdata[i]= char(Serial.read());
        delay(2);
      }
  }

void test_do_data(void)
{

    int x;
    if(comdata[0] == 0x55)  // 头帧
    {
        if(comdata[1] == 0xAA) //模式选择
        {  
          switch(comdata[2])
          {
              case A0_Command:
                mode_flag = 1;
                break;
              case A1_Command:
                mode_flag = 2;
                break;
              case A2_Command:
                mode_flag = 3;
                break;
              case A3_Command:
                mode_flag = 4;
                break;
            }

          for(x=0;x<4;x++)  //传入设定数值
          maxnum=(maxnum*10+long(numdata[x]-'0'));

        }
      }

  }

命令监测、执行由receive_data()和test_do_data()负责

首先建立缓冲区数组

byte comdata[3]={0};
char numdata[4]={0,0,0,0};

建立flag

用于缓冲上位机传来的数据

上位机数据具有识别功能。

识别:

设定0x55位有效命令开头,开始读取下一帧

设定0xAA为模式选择开头,进入模式选择

设定各模式十六进制代码,switch选择,用flag标记模式号(1~4,0留给未选择)

最后用maxnum缓存传来的数值

然后再loop中调用函数

 

2.2 数值传递

上位机向下位机发送数值时,按照位传递。这里上位机下位机统一配套,统一传送。如约定传送四位十进制整数“0098”“1368”

下位机对缓冲区数据的处理:

          for(x=0;x<4;x++)
          maxnum=(maxnum*10+long(numdata[x]-'0'));

 


3.实验原型

 

对一个脉冲信号进行稀释,比率由上位机传送。

#define PIN 2
volatile long count =0;
volatile int flag = 0;
volatile int mode_flag =0 ;
volatile long maxnum;
byte comdata[3]={0};
char numdata[4]={0,0,0,0};

#define A0_Command 0x10
#define A1_Command 0x11
#define A2_Command 0x20
#define A3_Command 0x21

void receive_data(void);
void test_do_data(void);


void setup() {

  Serial.begin(9600);
//  void init();
  pinMode(PIN,INPUT);
  pinMode(13,OUTPUT);
  pinMode(8,OUTPUT);
  attachInterrupt(0,blinkA,FALLING);

}



void loop() {

  if(Serial.available()>0)
  {
      receive_data();
      test_do_data();
    }

  delay(100); //自己发出脉冲信号测试
  digitalWrite(8,HIGH);
  digitalWrite(8,LOW); 
}




void receive_data()
{
    int i;
    for(i=0;i<3;i++)
    {
        comdata[i]= Serial.read();
        delay(2);
      }
    for(i=0;i<4;i++)
    {
        numdata[i]= char(Serial.read());
        delay(2);
      }
  }

void test_do_data(void)
{

    int x;
    if(comdata[0] == 0x55)  // 头
    {
        if(comdata[1] == 0xAA) //模式选择
        {  
          switch(comdata[2])
          {
              case A0_Command:
                mode_flag = 1;
                break;
              case A1_Command:
                mode_flag = 2;
                break;
              case A2_Command:
                mode_flag = 3;
                break;
              case A3_Command:
                mode_flag = 4;
                break;
            }

          for(x=0;x<4;x++)
          maxnum=(maxnum*10+long(numdata[x]-'0'));

        }
      }

    

  }
 
void blinkA()
{
  count++;
  if(count>=maxnum)
  {
      if(flag==0)
        digitalWrite(13,HIGH);
      else
        digitalWrite(13,LOW);
      flag=~flag;
      count=0;       
    }
}

 

比较原始 存在一些问题,随着后来的学习进行改正

 

相关

标签: Arduino 上位机 下位机 串口通讯 数据采集
最后更新:2016年9月6日

SPtuan

SPtuan 是一名普通的工程师,最大的愿望是度过平静的时光。 当前从事网络/CDN/对象存储研发。

点赞
< 上一篇
下一篇 >
5 1 vote
文章评分
Subscribe
Login
提醒
guest

guest

1 评论
最新
最旧 得票最多
Inline Feedbacks
View all comments
trackback
博客文章索引 - Steins;Lab
3 年 之前

[…] 2016-09-06 Arduino与上位机的串口通讯笔记 […]

0
回复

SPtuan

SPtuan 是一名普通的工程师,最大的愿望是度过平静的时光。
当前从事网络/CDN/对象存储研发。

  • 0.前言
  • 1.ARDUINO中的串口通信函数
    • 1.1 函数
    • 1.2 需要注意的一些事项
  • 2. 下位机编程
    • 2.1 模式选择
    • 2.2 数值传递
分类
  • Uncategorized
  • 图册
  • 学习笔记
  • 库
  • 折腾
  • 杂谈
  • 瞎**扯
  • 碎碎念
  • 项目跟踪
最近评论
SPtuan 发布于 2 个月前(03月22日) 书签: 关于 disk-io 的经验, 异步/同步 io 系统设计的经验 https://you...
SPtuan 发布于 2 个月前(03月21日) 如果公司不是对外提供这些服务的,这种岗位都是 infra 部门,平均年龄确实会大一些。尤其构建和维护...
HUA 发布于 2 个月前(03月19日) 想请问博主对于国内CDN行业,以及CDN调度、DNS托管类服务相关岗位的看法,以及是否还推荐校招新人...
SPtuan 发布于 3 个月前(02月03日) 2025 注: 长辈对于只身去深圳的担忧,更多地来自于 80s/90s 治安情况。近几年了解了严打...
SPtuan 发布于 4 个月前(01月16日) 哈哈,100就100吧,新年快乐!
热门主题 & 页面
  • 全球互联网拓扑探索 (1) : 互联网是如何工作的
  • PYNQ上手体验:以目标检测应用为例
  • 使用 WSL2 + X11 转发 - 在 Windows10 中打造 GNU/Linux 学习生产环境
  • 动手做!基于nRF24L01P的Arduino无线通信
  • [实验]VPS搭建ss服务中转实现纯ipv6访问网络-校园网免流量
归档
  • 2025 年 5 月
  • 2025 年 3 月
  • 2024 年 12 月
  • 2024 年 9 月
  • 2024 年 8 月
  • 2024 年 5 月
  • 2024 年 3 月
  • 2024 年 2 月
  • 2023 年 12 月
  • 2023 年 11 月
  • 2023 年 9 月
  • 2023 年 8 月
  • 2023 年 4 月
  • 2023 年 1 月
  • 2022 年 12 月
  • 2022 年 10 月
  • 2022 年 9 月
  • 2022 年 7 月
  • 2022 年 6 月
  • 2022 年 2 月
  • 2021 年 12 月
  • 2021 年 11 月
  • 2021 年 2 月
  • 2021 年 1 月
  • 2020 年 9 月
  • 2020 年 4 月
  • 2020 年 3 月
  • 2020 年 1 月
  • 2019 年 8 月
  • 2019 年 7 月
  • 2019 年 5 月
  • 2019 年 4 月
  • 2019 年 3 月
  • 2019 年 2 月
  • 2018 年 12 月
  • 2018 年 10 月
  • 2018 年 9 月
  • 2018 年 8 月
  • 2018 年 5 月
  • 2018 年 2 月
  • 2018 年 1 月
  • 2017 年 11 月
  • 2017 年 9 月
  • 2017 年 7 月
  • 2017 年 6 月
  • 2017 年 5 月
  • 2017 年 4 月
  • 2017 年 3 月
  • 2017 年 2 月
  • 2017 年 1 月
  • 2016 年 12 月
  • 2016 年 11 月
  • 2016 年 10 月
  • 2016 年 9 月
  • 2016 年 8 月
  • 2016 年 7 月
  • 2016 年 6 月
  • 2016 年 5 月
  • 2016 年 4 月
  • 2016 年 3 月
  • 2016 年 2 月
  • 2016 年 1 月
  • 2015 年 12 月
  • 2015 年 11 月
  • 2015 年 9 月

友情链接:

Blessing Studio hahaschool 绘枫和畅 魔法少女Fandy monsterx Clarke的博客 Luminous’ Home Shintaku's Blog
蓝黑的博客 haruhi.club Yida的博客 Bo2SS 涛叔 TangBao 同和君Hocassian

Steins;Lab 团子神社 zdfmc.net

steinslab.io built with ❤. Thanks for all 2015-2025.

Theme Kratos Made By Seaton Jiang

wpDiscuz