专注电子技术学习与研究
当前位置:单片机教程网 >> Arduino >> 浏览文章

Arduino和非Arduino板串口通信教程

作者:huqin   来源:本站原创   点击数:  更新时间:2014年05月09日   【字体:

简单的说明在arduino官方网站的reference页面有了,一般将字符通过串口打印到电脑(用USB串口)已经够用了,但是当你想把把字符发送到另一个串口的时候,或是想用一块你手头上已有的开发板发送数据给Arduino,然后让Arduino显示,问题顿时变得麻烦起来!
如何从一个单片机的串口发送数据到Arduino上,然后用Arduino显示呢?
这就要从Arduino的串口收发函数说起了.
(以下实例基于Arduino Due)
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:
  Serial.begin(9600);
  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.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)
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电平转接板.
(所有的代码已验证)
最后,向奈何,桃子,海神致敬,谢谢你们在群上和论坛上为广大同胞答疑解惑(谢谢你们昨天的帮助),


顺便推荐两本书(英文至少半吊水):
1,Oreilly.  Arduino.Cookbook.   2nd.Edition
相当详细的一本书,初学者想要的在上面几乎都能找得到.
2,Build Wireless Sensor Network
用Zigbee+Arduino实现传感器网络,实用,强大,简洁

关闭窗口