弘毅 发表于 2014-4-24 19:38:54

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

本帖最后由 董董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表来学习一下串口输出的最基本使用方法。

/*
ASCII 码表

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

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


created 2006
by Nicholas Zambetti
modified 9 Apr 2012
by Tom Igoe

This example code is in the public domain.

<http://www.zambetti.com>

*/
void setup() {

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

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

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

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

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

Serial.print(thisByte);      

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

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

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

// 输出的最后一个字符为 '~' 或者是126
if(thisByte == 126) {   // you could also use if (thisByte == '~') {
    // 输出最后一个字附后就进入一个无尽循环,串口就再也不往出输出字符了
    while(true) {
      continue;
    }
}
// 进入下一个字符
thisByte++;
}

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



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

Friday 发表于 2014-7-25 22:27:50

Serial.print()和Serial.write()啥区别呢?

弘毅 发表于 2014-7-25 22:32:34

Friday 发表于 2014-7-25 22:27 static/image/common/back.gif
Serial.print()和Serial.write()啥区别呢?

print输出ASCII码,write输出二进制。

Friday 发表于 2014-7-25 22:35:10

弘毅 发表于 2014-7-25 22:32 static/image/common/back.gif
print输出ASCII码,write输出二进制。

Thanks....这里教程写的真棒啊。。。

Friday 发表于 2014-8-5 21:06:35

串口输出到底啥意思?就是为了从屏幕看结果?还是可以连到其他的硬件?

弘毅 发表于 2014-8-6 08:02:16

Friday 发表于 2014-8-5 21:06 static/image/common/back.gif
串口输出到底啥意思?就是为了从屏幕看结果?还是可以连到其他的硬件?

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

really_ashamed 发表于 2015-1-7 11:05:57

很好,教程写的一流!

Zebra 发表于 2015-2-12 10:45:12

请问传输速率可以改变么~改成其他的貌似串口输出貌似都会变成乱码=_=

弘毅 发表于 2015-3-6 09:54:57

Zebra 发表于 2015-2-12 10:45 static/image/common/back.gif
请问传输速率可以改变么~改成其他的貌似串口输出貌似都会变成乱码=_=

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

wininw 发表于 2015-3-26 08:24:23

串口接上别的硬件,还能用串口监视器看到别的硬件通讯的结果吗?

弘毅 发表于 2015-3-26 11:56:51

wininw 发表于 2015-3-26 08:24 static/image/common/back.gif
串口接上别的硬件,还能用串口监视器看到别的硬件通讯的结果吗?

如果你要当usb to ttl使用,推荐直接从跳帽左边直接接。

wininw 发表于 2015-3-26 13:25:25

弘毅 发表于 2015-3-26 11:56 static/image/common/back.gif
如果你要当usb to ttl使用,推荐直接从跳帽左边直接接。

arduino uno该怎么办呢?

Cimate 发表于 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的问题.

mlyl 发表于 2017-2-8 12:58:58

:):):):):):):):):)
页: [1]
查看完整版本: OCROBOT入门教程005--串口输出