您的位置:首页 > 产品设计 > UI/UE

Arduino的上位机通信

2016-11-16 18:24 369 查看
1,接收函数

Serial.read( )

int Serial.read(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:
Serial1.begin(9600);
Serial3.begin(9600);
Serial3.print(256);    //发送函数
if (Serial1.available()>0) {
Serial.println(Serial1.read());
Serial.println(Serial1.read());
Serial.println(Serial1.read()); //接收函数
}
void loop() {
}


既然print是一个打印函数,那么自然,参数val的类型是任意的.

Serial.print(val, format)

val的值转换成format指定的形式发送,可为BIN,OCT,HEX,DEC.

3,发送函数 Serial.write (对比 Serial.print )

Serial.write(str)

str为字符串的首地址,

buf为一个用来存放数据的数组的首地址.

这个函数会先发送字符串,然后返回字符串的长度.

void setup(){
Serial.begin(9600);
}
void loop(){
Serial.write(45);  // send a byte with the value 45 发送数据45
int bytesSent = Serial.write("hello"); //发送数据字符串“hello”
Serial.println(bytesSent);  //发送函数
}


Serial.write(val)

val的数据类型为unsigned char,

这个函数每次只发送一个字节的数据,所以val的值在0-255之间.

Serial.write(buf, len)

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.println(Serial1.read()); //接收数据
Serial.println(Serial1.read());
}


回到开头的问题,如何从一个单片机的串口发送数据到Arduino上,然后用Arduino显示呢? 我们可以先用单片机的print函数把数据打印到串口,然后用Serial1.readBytes(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)
{
Serial1.readBytes(rx_data,4);  //接收数据
for(char i=0;i<4;i++)
{
Serial.print(char(rx_data)); //接收数据
}
Serial.print("\n");
}
delay(500);
}


注意:本文的串口使用的都是板上的串口,当和非Arduino板通信的时候注意使用TTL转RS232电平转接板.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: