2-3、4 串口通讯(meArm机械臂)

2-3 串口通讯1

在这里插入图片描述

介绍

之前都是arduino通过串口发送程序运行的一些变量状态,然后通过arduino ide串口监视器了解程序

通讯,arduino发送数据到电脑
也要arduino接收这些数据

在这里插入图片描述

串行通信

http://www.taichi-maker.com/homepage/reference-index/arduino-code-reference/serial/
在这里插入图片描述

可以使用串口监视器进行串口通讯,不仅是arduino向电脑发送数据,使用串口监视器将数据显示出来,还可以通过串口监视器由电脑向arduino发送数据
在这里插入图片描述

Arduino是通过引脚0 RX接收我们发给他的数据的
Arduino是通过引脚1 TX发送他们发送给我的数据
在这里插入图片描述

当进行RX TX工作时,响应的LED也会闪烁

在这里插入图片描述

电脑的USB接口也是有RX \ TX功能的(电脑以前有单独的串口通信接口,后来和USB接口合并了,USB接口还有其他功能)

USB接口使用进行和arduino串口通信的
在这里插入图片描述

Arduino和计算机串口通信
串口通信连接规则:

(1)所有进行串口通信的设备其接地GND是必须要连接在一起的
记住:只要进行串口通信,就把GND连接在一起
(2)arduino的RX与计算机的TX相连
(3)Arduino的TC与计算机的RX相连

USB与arduino连接时,不仅GND连接了,RX及TX也相互连接了

在MeArm中

Arduino和其他模块进行串口通信如下,也要遵循连接方式
在这里插入图片描述

串口数据

Arduino串口通信时,使用的串口数据基本概念

Arduino串口通信使用的信号是电压信号
Arduino数字输入输出,有高低电平状态(+5v,0v)
电平信号高低代表1,0
在这里插入图片描述
在这里插入图片描述

数据是排成一队发送的,所以叫串口通信(arduino无并行通信功能)

在这里插入图片描述

1个字节有8位(必须记住,每次arduino读取的是一个字节的数据,也就是8位数字)

使用TTL标准(高电平可以使用5V,低电平可以使用0v),arduino只支持TTL标准

使用波特率来限定传输速度,波特率9600=每秒传输9600位,在IDE串口监视器也要设置波特率

9600位并非都是数据,有些是控制串口通信的,如告诉arduino后8位是数字信息,比较底层的

记住,每次发数据给arduino是一个字节一个字节发送以及接受的
在这里插入图片描述

下节使用电脑与arduino进行通信了

2-4 串口通讯2

在这里插入图片描述

上节课arduino串口通信的原理知识,这节课实际操作arduino接收计算机发送给他的串口数据
在这里插入图片描述

Arduino通电就执行程序给其的任务
控制电机、调节led亮度等
不是总监视是否有串口数据发送给他的

当有串口数据发送给它的时候,不希望串口数据被丢掉
如何,arduino一方面要做其他事情,一方面又有数据来了
所以工程师在arduino中加入串口接收缓存区域:arduino做其他事情时,当有数据来了,就临时将其放到串口接收缓存区域,不是长时间保存数据的,时间太长缓存会丢掉数据
所以若知道有数据发送给arduino,要时不时的提醒arduino干完某件工作后要看一看缓存数据读一读了,此时可以调用serial.available()函数

在这里插入图片描述

serial.available()函数

serial.available()函数:检查arduino串口接收缓存中有没有数据使用的

假如串口接收缓存是空的,当调用available()库函数时,返回值为0
在这里插入图片描述

假如串口接收缓存是有数据的,当调用available()库函数时,返回值为非零
在这里插入图片描述

返回值到底是多少就需要看有多少个字节的数据等待arduino接收
在这里插入图片描述

假设串口接收缓存有1个字节的数据等待arduino接收,返回值为1
在这里插入图片描述

假设串口接收缓存有3个字节的数据等待arduino接收,返回值为3
在这里插入图片描述
在这里插入图片描述

可以通过serial.available()函数来了解是否有设备给arduino发送串口数据
一旦有数据,在调用此函数时,返回的数值就不再是0了,而是等待arduino接收的字节数量

serial.read()

在这里插入图片描述
在这里插入图片描述

首先使用serial.available()函数判断缓存数据中有多少个字节数量(1个字节数量)
接着serial.read()函数将这些字节数据中的内容读取返回(这里“1”为字符内容)

在这里插入图片描述

注意:每当serial.read成功读取数据后,arduino将已经被读取的数据从缓存中清除
在这里插入图片描述

于是再次运行serial.available()函数是,返回值又是0了,此时完成读取串口数据全部过程
在这里插入图片描述

发送多个数据读取时

在这里插入图片描述

返回值先是读取第1个的返回值,读取
在这里插入图片描述

读取完字符1后,前面的1数据在缓存中被清除

当再次使用available判断数据时,返回的是2的数值(缓存只剩下2个字节数据了)
再使用read函数读取时,返回值是2,同样读取完某个数据会在其缓存移除掉该数据

在这里插入图片描述
在这里插入图片描述

发送3个连续字符如何
在这里插入图片描述

点击发送,监视器显示3个ACII码

在这里插入图片描述

在这里插入图片描述

上方是没有结束符,点击换行符后,同样发送123共三个字符,就多了1个数据“10”
发送123实际上arduino接收到了4个字符,第4个就是换行符
记住下方点击换行符时,发送给arduino的数据会多出一个换行符的
在这里插入图片描述

程序1(int serialData = Serial.read(); )

在这里插入图片描述

void setup() {
  Serial.begin(9600);		//启动串口通讯,传输波特率9600
  Serial.println("Please input serial data.");	//在串口监视器输出提示输入数据
}
 
void loop() {
  // check if data has been sent from the computer:
  if (Serial.available()>0 ) {   //检查串口缓存中是否有数据等待读取
int serialData = Serial.read();     //读取串口缓存中等待的字符,int类型变量接收串口缓存的返回值,然后打印,看数据是否一致
 Serial.println(serialData );
  }
}

编译上传,打开串口监视器
打开后会在串口监视器输出提示
在上方发送数字1看效果如何,arduino会接收1数字,并赋值给serialData 变量,然后显示在串口监视器

在这里插入图片描述
在这里插入图片描述

发现1数字,显示出的是49,原因是上面的程序,下面修改

程序2(char serialData = Serial.read(); )

注意Serial.read()返回的是字符型的变量,需要使用char来接收

void setup() {
  Serial.begin(9600);		//启动串口通讯,传输波特率9600
  Serial.println("Please input serial data.");	//在串口监视器输出提示输入数据
}
 
void loop() {
  // check if data has been sent from the computer:
  if (Serial.available()>0 ) {   //检查串口缓存中是否有数据等待读取
Char serialData = Serial.read();     //读取串口缓存中等待的字符,int类型变量接收串口缓存的返回值,然后打印,看数据是否一致
 Serial.println(serialData );
  }
}

效果演示,此时发送1,窗口显示的就是1了
在这里插入图片描述
在这里插入图片描述

Char字符型的数据

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

ASCII最通用的编码系统
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

当我们给串口接收器发送1的数字时,串口监视器反馈的并不是数字,而是将其当做字符,将字符的ASCII编码的十进制数值反馈给我们了。

Arduino会将字符代表的10进制数值打印,如字符“1”,其对应10进制数值“49”

使用char字符类型接收数据,会将字符“1”,原封不动的返回给我们

工具程序

在这里插入图片描述

Arduino会把字符响应的ASCII代码告诉我们,10进制的、8、16等进制
http://www.taichi-maker.com/homepage/arduino-tutorial-index/mearm-index/mearm-4-serial2/

/*
ASCII 代码查询工具 (1.0)
by 太极创客 (2017-06-01)
www.taichi-maker.com
 
在串口监视器中输入字符并点击发送,串口监视器将
输入字符的ASCII代码进行显示。
*/
 
void setup() {
  Serial.begin(9600);		//启动串口通讯,传输波特率9600
  Serial.println("Please input serial data.");	//在串口监视器输出提示输入数据
}
 
void loop() {
  // check if data has been sent from the computer:
  if (Serial.available()>0 ) {   //检查串口缓存中是否有数据等待读取
    Serial.println("======================");        
    char serialData = Serial.read();     //读取串口缓存中等待的字符
                                         //并赋值给字符变量serialData
    Serial.print("Your serialData: '");
    Serial.print(serialData);            //显示刚刚读取到的字符
    Serial.println("'");
 
    Serial.print("serialData in DEC ");
    Serial.println(serialData, DEC);   //显示刚刚读取到字符的ASCII编码(十进制)
    Serial.print("serialData in BIN ");
    Serial.println(serialData, BIN);   //显示刚刚读取到字符的ASCII编码(二进制)
    Serial.print("serialData in OCT ");
    Serial.println(serialData, OCT);   //显示刚刚读取到字符的ASCII编码(八进制)
    Serial.print("serialData in HEX ");
    Serial.println(serialData, HEX);   //显示刚刚读取到字符的ASCII编码(十六进制)
    Serial.println("======================");
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吾名招财

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值