目录
一、硬件介绍
1、控制器
2、TTL转USB串口
二、软件程序
1、单片机发送字符串
(1)每个串口对应的类名称介绍
(2)发送功能
(3)代码
(4)测试
2、单片机接收字符串
(1)使用串口1控制IO输出
(2)代码
(3)测试
3、串口中断事件
(1)串口中断介绍
(2)串口0、串口1中断测试
(3)串口中断设置接收标识符、结束标识符
一、硬件介绍
1、控制器
Arduino MEGA开发板。包含4个串口,串口0(即TX0、RX0)出厂默认和USB连接使用。串口1、串口2、串口3用户可以实际使用。
2、TTL转USB串口
Arduino中的串口是TTL电平,需要使用转接线转接以后才可以通信。
(TTL电平:高低电平,0-5V。0V为0,5V是1。
232串口电平:全双工(逻辑1:-15V--5V 逻辑0:+3V--+15V))
USB/TTL转接线使用的时候,需要安装驱动程序。驱动程序下载链接或者打包的工程中包含。PL2303TA+最新驱动.zip_免费高速下载|百度网盘-分享无限制
二、软件程序
1、单片机发送字符串
(1)每个串口对应的类名称介绍
串口0的类是Serial;
串口1的类是Serial1;
串口1的类是Serial2;
串口1的类是Serial3。
(2)发送功能
使用串口0、串口1分别和串口调试助手链接测试,一秒钟给串口调试助手发送一次字符串数据。
(3)代码
const long _1000msTime = 1000; // 1000 milli seconds
unsigned long _1000msLastTime;
const long _100msTime = 100; // 100 milli seconds
unsigned long _100msLastTime;
const long _10msTime = 10; // 10 milli seconds
unsigned long _10msLastTime;void setup()
{//串口开启-波特率9600Serial.begin(9600); //串口0,USB口连电脑Serial1.begin(9600); //串口1Serial2.begin(9600); //串口2Serial3.begin(9600); //串口3}void loop()
{TimeProc();}void TimeProc()
{//1000ms执行一次if ((millis() - _1000msLastTime) >= _1000msTime){_1000msLastTime = millis( ); ////Serial.print("Distance is: "); //Serial.print(currDistance);Serial.println("USB Serial Send.");Serial1.println("Serial1 Send.");}//100ms执行一次if ((millis() - _100msLastTime) >= _100msTime){_100msLastTime = millis( ); //}//10ms执行一次if ((millis() - _10msLastTime) >= _10msTime){_10msLastTime = millis( ); //}}
(4)测试
2、单片机接收字符串
(1)使用串口1控制IO输出
PC端使用串口调试助手给单片机串口1发送字符串,单片机根据串口1接收不同的字符串对IO口进行高低电平控制。
串口调试助手给单片机串口1发送字符串。
①发送'a'、IO输出高电平。单片机串口0,给串口调试助手发送单片机串口1接收到的字符串。
②发送‘b’、IO输出低电平。单片机串口0,给串口调试助手发送单片机串口1接收到的字符串。
(2)代码
const long _1000msTime = 1000; // 1000 milli seconds
unsigned long _1000msLastTime;
const long _100msTime = 100; // 100 milli seconds
unsigned long _100msLastTime;
const long _10msTime = 10; // 10 milli seconds
unsigned long _10msLastTime;const int redLed=22;void setup()
{//设置IO口为输出模式pinMode(redLed,OUTPUT);//IO口初始输出低电平。Led灯正极接IO口,即输出高电平点亮。digitalWrite(redLed,LOW);//串口开启-波特率9600Serial.begin(9600); //串口0,USB口连电脑Serial1.begin(9600); //串口1Serial2.begin(9600); //串口2Serial3.begin(9600); //串口3}void loop()
{TimeProc();if(Serial1.available()>0){char ch=Serial1.read();Serial.print("Serial Recive: ");Serial.print(ch);Serial.println(" ;");if(ch=='a'){digitalWrite(redLed,HIGH);Serial.println("Turn On Success");}if(ch=='b'){digitalWrite(redLed,LOW); Serial.println("Turn Off Success");}}}void TimeProc()
{//1000ms执行一次if ((millis() - _1000msLastTime) >= _1000msTime){_1000msLastTime = millis( ); //串口发送//Serial.println("USB Serial Send.");//Serial1.println("Serial1 Send.");}//100ms执行一次if ((millis() - _100msLastTime) >= _100msTime){_100msLastTime = millis( ); //}//10ms执行一次if ((millis() - _10msLastTime) >= _10msTime){_10msLastTime = millis( ); //}}
(3)测试
IO输出打开
IO输出关闭
3、串口中断事件
(1)串口中断介绍
当串口接收缓冲区有数据时自动触发该事件。串口0中断事件serialEvent()。
Arduino MEGA开发板:
串口1中断事件serialEvent1()。
串口2中断事件serialEvent2()。
串口3中断事件serialEvent3()。
(2)串口0、串口1中断测试
实现功能:
给串口0或者串口1发送字符串,串口0或者串口1接收完成、将接收的字符串再通过串口0发送出去。
接收结束使用标识符‘#’
代码
String inputString = ""; //保存串口接收的字符串
bool stringComplete = false; //串口接收完成标志位void setup()
{Serial.begin(9600);Serial1.begin(9600);inputString.reserve(200);
}void loop()
{if (stringComplete) {Serial.println(inputString); //串口0发送出去 //清空接收字符串inputString = "";stringComplete = false;}
}//串口0中断事件
void serialEvent()
{while (Serial.available()) {char inChar = (char)Serial.read();inputString += inChar;if (inChar == '#') //结束符{stringComplete = true;}}
}//串口1中断事件
void serialEvent1()
{while (Serial1.available()) {char inChar = (char)Serial1.read();inputString += inChar;if (inChar == '#') //结束符{stringComplete = true;}}
}
(3)串口中断设置接收标识符、结束标识符
①发送的字符串第一个字符为'$'、结束字符为'#',才可以正常的发送和接收。
②串口0和串口1接收到的数据都通过串口1再发送出去,并且反馈发送接收的字符数量。
举例说明:
串口调试助手发送字符串:$1,0,0,0,0,0,0,0,0,0#
代码
const long _1000msTime = 1000; // 1000 milli seconds
unsigned long _1000msLastTime;
const long _100msTime = 100; // 100 milli seconds
unsigned long _100msLastTime;
const long _10msTime = 10; // 10 milli seconds
unsigned long _10msLastTime;const int redLed=22;int num1 = 0; // 接收的字符数
int incomingByte = 0; // 接收到的 data byte
String inputString = ""; // 用来储存接收到的内容
boolean startBit = false; // 协议开始标志
bool recvComplete = false; // 接收完成标志void setup()
{//设置IO口为输出模式pinMode(redLed,OUTPUT);//IO口初始输出低电平。Led灯正极接IO口,即输出高电平点亮。digitalWrite(redLed,LOW);//串口开启-波特率9600Serial.begin(9600); //串口0,USB口连电脑Serial1.begin(9600); //串口1Serial2.begin(9600); //串口2Serial3.begin(9600); //串口3}void loop()
{TimeProc();if(recvComplete){recvComplete=false;Serial1.println(inputString);Serial1.print("Char count is:");Serial1.println(num1);num1 = 0;startBit = false;inputString = "";}}void TimeProc()
{//1000ms执行一次if ((millis() - _1000msLastTime) >= _1000msTime){_1000msLastTime = millis( ); ////Serial.println("USB Serial Send.");//Serial1.println("Serial1 Send.");}//100ms执行一次if ((millis() - _100msLastTime) >= _100msTime){_100msLastTime = millis( ); //}//10ms执行一次if ((millis() - _10msLastTime) >= _10msTime){_10msLastTime = millis( ); //}}//上位机发送举例:'$1,0,0,0,0,0,0,0,0,0#'//串口0中断
void serialEvent()
{while (Serial.available()){incomingByte = Serial.read(); //一个字节一个字节地读,下一句是读到的放入字符串数组中组成一个完成的数据包if(incomingByte == '$') //'$'是开始读取的标识符 {num1 = 0;startBit = true;}if(startBit == true){num1++;inputString += (char) incomingByte; // 全双工串口可以不用在下面加延时,半双工则要加的//}if(startBit == true && incomingByte == '#') //'#'是读取结束的标识符 {recvComplete = true;startBit = false;} }}//串口1中断
void serialEvent1()
{while (Serial1.available()){incomingByte = Serial1.read(); //一个字节一个字节地读,下一句是读到的放入字符串数组中组成一个完成的数据包if(incomingByte == '$') //'$'是开始读取的标识符 {num1 = 0;startBit = true;}if(startBit == true){num1++;inputString += (char) incomingByte; // 全双工串口可以不用在下面加延时,半双工则要加的//}if(startBit == true && incomingByte == '#') //'#'是读取结束的标识符 {recvComplete = true;startBit = false;} }}
测试