查看: 4044|回复: 8

Arduino串口的使用——与计算机交流

[复制链接]
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

    发表于 2018-4-3 15:02 | 显示全部楼层 |阅读模式
    本文节选自《Arduino程序设计基础》



    前面的示例中使用到了Serial.begin()、Serial.print() 等语句,这些语句便是在操作串口。Arduino与计算机通信最常用的方式就是串口通信,这在之前的学习中已经接触多次。

    我们使用USB线连接Arduino Uno与计算机时,Arduino Uno会在计算机上虚拟出一个串口设备,此时两者之间便建立了串口连接。通过此连接,Arduino Uno便可与计算机互传数据。

    使用串口与计算机通信,需要先使用Serial.begin() 初始化Arduino的串口通信功能。

    Serial.begin(speed);

    参数speed是指串口通信波特率,这是设定串口通信速率的参数。串口通信的双方必须使用同样的波特率,方能正常进行通信。

    波特率是一个衡量通信速度的参数。它表示每秒钟传送的bit的个数。例如9600波特表示每秒发送9600bit的数据。通信双方需要使用一致的的波特率才能正常通信。Arduino串口通信通常会使用以下波特率:

    300、600、1200、2400、4800、9600、14400、19200、28800、38400、57600、115200。

    波特率越大,说明串口通信的速率越快。

    串口输出

    串口初始化完成后,我们便可以使用Serial.print() 或Serial.println() 向计算机发送信息了。

    Serial.print(val);

    参数val是你要输出的数据,各种类型的数据均可。

    Serial.println(val);
    

    Serial.println(val) 语句也是使用串口输出数据,不同的是println() 函数会在输出完指定数据后,再输出一组回车换行符。

    下面的示例程序中,演示了使用串口输出数据到计算机:

    int counter=0; // 计数器
    
    void setup() {
    // 初始化串口
      Serial.begin(9600);
    }
    
    void loop() {
    // 每loop循环一次,计数器变量加1
    counter = counter+1;
    // 输出变量
    Serial.print(counter);
    // 输出字符
    Serial.print( ':' );
    // 输出字符串;
    Serial.println("Hellow World");
    delay(1000);
    }

    上传该程序到Arduino Uno,然后可以通过Arduino IDE右上角的 图标打开串口监视器。你会看到如图2-48的信息。

    QQ截图20190126204743.jpg

    图 2‑48 串口输出信息

    串口监视器是Arduino IDE自带的一个小工具,可以查看到串口传来的信息,也可以向连接的设备发送信息。需要注意的是,在串口监视器右下角,有一个波特率设置下拉框,波特率设置必须和烧入程序中设置的一致,才能正常收发数据。

    通过Serial.print() 语句将传感器获得的数据输出到计算机的方法,在之前的章节中已进行过演示。

    串口输入

    除了输出,串口同样可以接收由计算机输出的数据。接收串口数据需要使用Serial.read()函数。

    Serial.read();
    

    调用该语句,每次都会返回一个字节的数据,这个返回值便是当前串口读取到的数据。

    上传以下程序到Arduino:

    void setup() {
      // 初始化串口
      Serial.begin(9600);
    }
    
    void loop() {
      // 读取输入的信息
      char ch=Serial.read();
      // 输出信息
      Serial.print(ch);
      delay(1000); 
    }

    上传成功后,运行串口监视器,在发送按键左侧的文本框中输入要发送的信息,如"arduino",你会看到Arduino在输出了你输入的信息同时,还输出了很多乱码(如图2-49所示)。

    QQ截图20190126205518.jpg

    图 2‑49 串口输入信息

    这些乱码是因为串口缓冲区中没有可读数据造成的。当缓冲区中没有可读数据时,read()函数会返回int型值-1,而int型-1对应的char型数据便是该乱码。

    在使用串口时,Arduino Uno会在SRAM中开辟一段大小为256 bytes的空间,串口接收到的数据都会被暂时存放进这个空间中,这个存储空间,我们称之为缓冲区。当你调用Serial.read()语句时,Arduino便会从缓冲区取出一个字节的数据。

    通常使用串口读取数据时,需要搭配Serial.available() 语句使用。

    Serial.available();
    

    Serial.available() 的返回值便是当前缓冲区中接收到的数据字节数。

    Serial.available() 可以搭配if 或者while使用,先检测缓冲区中是否有可读数据,如果有数据,再读取,没有数据便跳过读取或等待读取。如:

    if( Serial.available() > 0 )
    

    while( Serial.available() > 0 )
    

    示例程序代码如下:

    void setup() {
      // 初始化串口
      Serial.begin(9600);
    }
    
    void loop() {
    // 如果缓冲区中有数据,则读取并输出
    if(Serial.available()>0)
      {
        char ch=Serial.read();
        Serial.print(ch);
      }
    }
    

    上传完成后,打开串口监视器,键入并发送任意信息。你会看到Arduino输出了你发送过去的信息,并且不会再出现乱码了(如图2-50所示)。

    QQ截图20190126205822.jpg

    图 2‑50 结合available()的输入效果

    需要注意的是,在串口监视器右下角有两个选项,一个是设置结束符,一个是设置波特率。如果你设置了结束符,则在你最后发送完数据后,串口监视器会自动发送一组你设定的结束符,如回车符和换行符。

    可能已经注意到了,当串口通信时,Arduino控制器上的标有RX、TX的两LED灯会闪烁提示,接收数据时,RX灯会点亮,发送数据时,TX灯会点亮。

    此外,在涉及串口通信的Arduino Uno例程程序中,还会经常看到如下特殊用法:

    while (!Serial) { }
    

    这是在等待串口监视器开启,开启串口监视器后,!Serial将为假,即会运行该while循环后的语句。

    利用串口通信功能,我们可以使用计算机来控制Arduino执行特定的操作。

    如果以上内容对你有帮助,你可以通过打赏支持作者
  • TA的每日心情
    开心
    2019-2-25 11:11
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2019-2-22 08:57 | 显示全部楼层
    能用串口传图片到arduino吗

    点评

    可以,只是arduino也处理不了大的图片,没意义  详情 回复 发表于 2019-2-22 10:32
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

     楼主| 发表于 2019-2-22 10:32 | 显示全部楼层
    s021211 发表于 2019-2-22 08:57
    能用串口传图片到arduino吗

    可以,只是arduino也处理不了大的图片,没意义
    如果以上内容对你有帮助,你可以通过打赏支持作者
  • TA的每日心情
    开心
    2019-2-25 11:11
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2019-2-22 11:08 | 显示全部楼层
    奈何col 发表于 2019-2-22 10:32
    可以,只是arduino也处理不了大的图片,没意义

    传小的也行,大佬能大概教一教吗。主要我们毕业设计要求用arduino加密一个图像,我找了好多发现基本没有这方面的案例。。

    该用户从未签到

    发表于 2019-3-6 22:09 | 显示全部楼层
    这里的串口是用的UART通信吗
  • TA的每日心情
    奋斗
    2019-4-23 07:37
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2019-3-11 10:11 | 显示全部楼层
    谢谢,刚刚看完。

    该用户从未签到

    发表于 2019-3-15 19:10 | 显示全部楼层
    楼主你好,如果用Arduino uno的板子接TTL串口-can转换器来控制直流电机,这个程序会有什么改变呢?

    该用户从未签到

    发表于 2019-4-21 19:57 | 显示全部楼层
    你们知道哪里有这个串口软件吗?

    点评

    这个是arduino IDE自带的  详情 回复 发表于 2019-4-21 20:05
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

     楼主| 发表于 2019-4-21 20:05 | 显示全部楼层
    空灵之龙兄 发表于 2019-4-21 19:57
    你们知道哪里有这个串口软件吗?

    这个是arduino IDE自带的
    如果以上内容对你有帮助,你可以通过打赏支持作者
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    学习记录2,Blinker读取温湿度
    学习记录2,Blinker读取温
    开关现在是使用得很6了,准备进行下一步,读取数据。 找了下官方的例程,发现用的是w
    学生智能打卡系统(接入blinker)
    学生智能打卡系统(接入bl
    【项目名称】学生智能打卡系统(接入blinker) 一.感谢各位大佬 首先感谢社区的管理员
    关于红外控制空调的模块选型
    关于红外控制空调的模块选
    想问问这中模块能支持arduino吗
    LCD1602只亮 不显示
    LCD1602只亮 不显示
    #include // initialize the library by associating any needed LCD interface pin
    18脚的8x8LED点阵如何使用??
    18脚的8x8LED点阵如何使用
    本帖最后由 Creeper666 于 2018-8-14 12:24 编辑 这个点阵模块上面一排有12个脚,
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表