极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 21500|回复: 13

OCROBOT入门教程005--串口输出

[复制链接]
发表于 2014-4-24 19:38:54 | 显示全部楼层 |阅读模式
本帖最后由 董董soul 于 2016-10-27 10:51 编辑

在前面几课,我们一直都在驱动LED,固然可以把LED作为一些状态输出的指示灯,但是其所能表达的状态很单调,如果我们需要输出具体数据应该怎么办呢?
如果需要输出数据时,我们可以使用串口输出。在OCROBOT控制板上,USB输出数据其实就是串口输出数据。
以MANGO为例,MANGO的USB接口通过一个USB转TTL芯片连接到D0,D1端口。当我们让USB输出或者输入数据时,其实就相当于D0,D1输出或者输入数据。(MANGO下可以断开这种强制的USB与串口连接,后面教程会介绍。)
首先介绍一下使用串口最基本的几个函数。


begin()
将串行数据传输速率设置为位/秒(波特)。与计算机进行通信时,可以使用这些波特率:300,1200,2400,4800,9600,14400,19200,28800,38400,57600或115200。当然,您也可以指定其他波特率 – 例如,引脚0和1和一个元件进行通信,它需要一个特定的波特率。
语法
Serial.begin(speed)
参数
speed: 位/秒 (波特) – long

print()
以人们可读的ASCII文本形式打印数据到串口输出。此命令可以采取多种形式。每个数字的打印输出使用的是ASCII字符。浮点型同样打印输出的是ASCII字符,保留到小数点后两位。Bytes型则打印输出单个字符。字符和字符串原样打印输出。Serial.print()打印输出数据不换行,Serial.println()打印输出数据自动换行处理。例如:

Serial.print(78)输出为“78”
Serial.print(1.23456)输出为“1.23”
Serial.print(“N”)输出为“N”
Serial.print(“Hello world.”)输出为“Hello world.”
也可以自己定义输出为几进制(格式);可以是BIN(二进制,或以2为基数),OCT(八进制,或以8为基数),DEC(十进制,或以10为基数),HEX(十六进制,或以16为基数)。对于浮点型数字,可以指定输出的小数数位。例如

Serial.print(78,BIN)输出为“1001110”
Serial.print(78,OCT)输出为“116”
Serial.print(78,DEC)输出为“78”
Serial.print(78,HEX)输出为“4E”
Serial.println(1.23456,0)输出为“1”
Serial.println(1.23456,2)输出为“1.23”
Serial.println(1.23456,4)输出为“1.2346”
你可以通过基于闪存的字符串来进行打印输出,将数据放入F()中,再放入Serial.print()。例如 Serial.print(F(“Hello world”)) 若要发送一个字节,则使用 Serial.write()。
语法
Serial.print(val)
Serial.print(val,格式)
参数
val:打印输出的值 – 任何数据类型
格式:指定进制(整数数据类型)或小数位数(浮点类型)
返回
字节 print()将返回写入的字节数,但是否使用(或读出)这个数字是可设定的

println()
说明
打印数据到串行端口,输出人们可识别的ASCII码文本并回车 (ASCII 13, 或 ‘\r’) 及换行(ASCII 10, 或 ‘\n’)。此命令采用的形式与Serial.print ()相同 。
语法
Serial.println(val)
Serial.println(val, format)
参数
val: 打印的内容 – 任何数据类型都可以
format: 指定基数(整数数据类型)或小数位数(浮点类型)
返回
字节(byte)
println()将返回写入的字节数,但可以选择是否使用它。

print()和println()的区别只有println输出数据后还加了回车。


我们通过串口输出一份ASCII表来学习一下串口输出的最基本使用方法。

  1. /*
  2. ASCII 码表

  3. 输出一个字节值的所有可能的格式
  4. *其中包含原始二进制值
  5. *还有ASCII编码的十进制、十六进制、八进制和二进制值

  6. 欲了解更多有关ASCII码相关知识,点击http://www.asciitable.com 与 http://en.wikipedia.org/wiki/ASCII


  7. created 2006
  8. by Nicholas Zambetti
  9. modified 9 Apr 2012
  10. by Tom Igoe

  11. This example code is in the public domain.

  12. <http://www.zambetti.com>

  13. */
  14. void setup() {

  15.   Serial.begin(9600);  //初始化串口

  16.   Serial.println("ASCII Table ~ Character Map"); //串口输出"ASCII Table ~ Character Map"
  17. }

  18. // 第一个ASCII字符"!"编号为33
  19. int thisByte = 33;
  20. // 你也可以把ASCII字符写在单引号中
  21. // 例如'!'与33相同,所以你也可以这样写这一行代码
  22. // int thisByte = '!';  

  23. void loop() {
  24.   // 输出价值不变,即字节的原始二进制版本。串行监控解释所有的字节为ASCII码,所以33,第一个数字,将显示为'!'
  25.   Serial.write(thisByte);   

  26.   Serial.print(", dec: ");
  27.   // 输出一个以ASCII十进制编码为基础的值(基数为10)
  28.   // 十进制是Serial.print()与Serial.println()函数的默认输出格式。所以如果你要输出十进制,可以不用进行格式申明。

  29.   Serial.print(thisByte);      

  30.   Serial.print(", hex: ");
  31.   // 输出一个以ASCII十六进制编码为基础的值(基数为16)
  32.   Serial.print(thisByte, HEX);     

  33.   Serial.print(", oct: ");
  34.   // 输出一个以ASCII八进制编码为基础的值(基数为8)
  35.   Serial.print(thisByte, OCT);     

  36.   Serial.print(", bin: ");
  37.   // 输出一个以ASCII二进制编码为基础的值(基数为2)
  38.   // 也同时输出换行符表示该行输出结束
  39.   Serial.println(thisByte, BIN);   

  40.   // 输出的最后一个字符为 '~' 或者是126
  41.   if(thisByte == 126) {     // you could also use if (thisByte == '~') {
  42.     // 输出最后一个字附后就进入一个无尽循环,串口就再也不往出输出字符了
  43.     while(true) {
  44.       continue;
  45.     }
  46.   }
  47.   // 进入下一个字符
  48.   thisByte++;  
  49. }
复制代码


程序下载进去后我们打开串口监视器,就能看到输出的ASCII表了。



课后练习:
学习了输出ASCII表的部分字符后,我们尝试的输出一棵树。。。一个笑脸等,这就看大家创意了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2014-7-25 22:27:50 | 显示全部楼层
Serial.print()和Serial.write()啥区别呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-25 22:32:34 | 显示全部楼层
Friday 发表于 2014-7-25 22:27
Serial.print()和Serial.write()啥区别呢?

print输出ASCII码,write输出二进制。
回复 支持 反对

使用道具 举报

发表于 2014-7-25 22:35:10 | 显示全部楼层
弘毅 发表于 2014-7-25 22:32
print输出ASCII码,write输出二进制。

Thanks....这里教程写的真棒啊。。。
回复 支持 反对

使用道具 举报

发表于 2014-8-5 21:06:35 | 显示全部楼层
串口输出到底啥意思?就是为了从屏幕看结果?还是可以连到其他的硬件?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-6 08:02:16 | 显示全部楼层
Friday 发表于 2014-8-5 21:06
串口输出到底啥意思?就是为了从屏幕看结果?还是可以连到其他的硬件?

既能从屏幕看到结果,也可以连接其他硬件。从屏幕看到结果只是经过了一个串口转usb芯片,才能在屏幕上看到。
回复 支持 反对

使用道具 举报

发表于 2015-1-7 11:05:57 | 显示全部楼层
很好,教程写的一流!
回复 支持 反对

使用道具 举报

发表于 2015-2-12 10:45:12 | 显示全部楼层
请问传输速率可以改变么~改成其他的貌似串口输出貌似都会变成乱码=_=
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-6 09:54:57 | 显示全部楼层
Zebra 发表于 2015-2-12 10:45
请问传输速率可以改变么~改成其他的貌似串口输出貌似都会变成乱码=_=

传输速率可以改变,改变后串口监视器要使用对应的速率。
回复 支持 反对

使用道具 举报

发表于 2015-3-26 08:24:23 | 显示全部楼层
串口接上别的硬件,还能用串口监视器看到别的硬件通讯的结果吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-26 11:56:51 | 显示全部楼层
wininw 发表于 2015-3-26 08:24
串口接上别的硬件,还能用串口监视器看到别的硬件通讯的结果吗?

如果你要当usb to ttl使用,推荐直接从跳帽左边直接接。
回复 支持 反对

使用道具 举报

发表于 2015-3-26 13:25:25 | 显示全部楼层
弘毅 发表于 2015-3-26 11:56
如果你要当usb to ttl使用,推荐直接从跳帽左边直接接。

arduino uno该怎么办呢?
回复 支持 反对

使用道具 举报

发表于 2015-8-6 10:44:52 | 显示全部楼层
在arduino中,String很好用,很灵活,像查找,替换字符串等。但有一个问题,不知大家有没有碰到,就是String是字符串,当碰到0x00时,后面的就不认了。比如,String string="\xff\xfe\xf0\x00\x01\x02\x03" . Serial.println(string). 串口只会发送 \xff\xfe\xf0,因为\x00在字符串中表示结束。不知有没有好的办法,或者第三方库可以解决\x00的问题.
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 09:25 , Processed in 0.049148 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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