Arduino-串⼝函数Serial
串⼝是Arduino与其它设备进⾏通信的接⼝,我们需要很好的掌握它的使⽤。Arduino串⼝使⽤相关的函数共有10个(随着版本的升级,新版本加⼊了更多,具体请参见官⽹:)。
Serial.begin(); //开启串⾏通信接⼝并设置通信波特率
Serial.available();//判断串⼝缓冲器是否有数据装⼊
Serial.peek();    //返回下⼀字节(字符)输⼊数据,但不删除它
Serial.flush();    //清空串⼝缓存
Serial.print();    //写⼊字符串数据到串⼝
Serial.println();  //写⼊字符串数据+换⾏到串⼝
Serial.write();    //写⼊⼆进制数据到串⼝
Serial.SerialEvent();//read时触发的事件函数
Serial.println(incomingByte, DEC);//打印接到数据⼗进制表⽰的ascii码。  HEX ⼗六进制表⽰
peek():功能类似于read(),但是我们知道当调⽤⼀次read()后,缓冲区的数据流会被读取并删除read过的数据,也就是available值会减少,但peek()不会出现类似情况,其功能类似于检测缓冲区的头部数据,反复调⽤peek()返回的值是⼀样的。⽤得好的话可以精简很多代码。
write():写⼊⼆进制数据到串⾏端⼝。这个数据是作为⼀个字节或字节序列发送的。如果发送字符串则需要⽤到print⽅法。
最后注意⼀下:当烧程序⼊板卡的时候,在完成前即L、TX、RX灯闪烁前,断开数据线很可能损坏硬件。同时测试前养成按⼀次reset 键复位的习惯,这⾥特别注意,在打开串⼝监视器后,需要reset⼀次,否则⽆法看到效果。
还有⼀个问题:
  ⼀般将字符通过串⼝打印到电脑(⽤USB串⼝)已经够⽤了,但是当你想把把字符发送到另⼀个串⼝的时
候,或是想⽤⼀块你⼿头上已有的开发板发送数据给Arduino,然后让Arduino显⽰,问题顿时变得⿇烦起来!
如何从⼀个单⽚机的串⼝发送数据到Arduino上,然后⽤Arduino显⽰呢?
这就要从Arduino的串⼝收发函数说起了.
(以下实例基于Arduino UNO)
1,接收函数ad()
ad(void)
如果串⾏数据缓冲区有数据,这个函数会读取串⾏数据缓冲区的第⼀个字节,数据读取位置移动到下⼀个数据缓冲区,也就是说如果继续读取的话会读取下⼀个数据缓冲区的第⼀个字节.
如果数据缓冲区没有数据,将返回-1.
2,发送函数Serial.print()
Serial.print(val)
Serial.print(val, format)
Serial.print(val)
⾸先注意: print是⼀个打印函数,主要⽤于在上位机上显⽰,让数据可视化,它会将数据⽤字符的形式(ASCII码)逐个发送到串⼝.    ⼀般不⽤这个函数来进⾏数据传输.
⽐如下⾯这段代码不会在串⼝助⼿上显⽰3个256,⽽会分别显⽰'2','5','6'的ASCII码值,50,53,54(分三次发送,有三个地址不同的数据缓冲区)
void setup() {
// initialize  serial ports:
Serial.begin(9600);
Serial1.begin(9600);
Serial3.begin(9600);
Serial3.print(256);
if (Serial1.available()>0) {
Serial.ad());
Serial.ad());
Serial.ad());
}
}
void loop() {
}
既然print是⼀个打印函数,那么⾃然,参数val的类型是任意的.
Serial.print(val, format)
将val的值转换成format指定的形式发送,可为BIN,OCT,HEX,DEC.
3,发送函数Serial.write
Serial.write(str)
str为字符串的⾸地址,buf为⼀个⽤来存放数据的数组的⾸地址. 这个函数会先发送字符串,然后返回字符串的长度.
void setup(){
Serial.begin(9600);
}
void loop(){
Serial.write(45); // send a byte with the value 45
int bytesSent = Serial.write("hello");
Serial.println(bytesSent);
}
Serial.write(val)
val的数据类型为unsigned char,这个函数每次只发送⼀个字节的数据,所以val的值在0-255之间.
Serial.write(buf, len)arduino字符串转数组
buf为要发送的数组的⾸地址(注意数组的类型为unsigned char),len为数组的长度.
void setup(){
Serial.begin(9600);
Serial3.begin(9600);
Serial1.begin(9600);
}
void loop(){
unsigned char data[2] ={11,0};
Serial3.write(data,2);
if(Serial1.available()>0)
Serial.ad());
Serial.ad());
}
回到开头的问题,如何从⼀个单⽚机的串⼝发送数据到Arduino上,然后⽤Arduino显⽰呢?
我们可以先⽤单⽚机的print函数把数据打印到串⼝,然后⽤adBytes(Serial的加强版,具体看官⽅参考⼿册)把数据从串⼝读取回来(以ASCII码的形式),然后把ASCII码转换成字符,然后发送.
unsigned int send_data =1234;
char rx_data[4];
void setup(){
Serial.begin(9600);
Serial3.begin(9600);
Serial1.begin(9600);
}
void loop()
{
Serial3.print( send_data);
if(Serial1.available()>0)
{
for(char i=0;i<4;i++)
{
Serial.print(char(rx_data));            }
Serial.print("\n");
}
delay(500);
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。