目录
一、硬件介绍
1、控制器
2、TTL转USB串口
二、软件程序
1、单片机发送字符串
(1)每个串口对应的类名称介绍
(2)发送功能
(3)代码
(4)测试
2、单片机接收字符串
(1)使用串口1控制IO输出
(2)代码
(3)测试
3、串口中断事件
(1)串口中断介绍
(2)串口0、串口1中断测试
(3)串口中断设置接收标识符、结束标识符
Arduino MEGA开发板。包含4个串口,串口0(即TX0、RX0)出厂默认和USB连接使用。串口1、串口2、串口3用户可以实际使用。
Arduino中的串口是TTL电平,需要使用转接线转接以后才可以通信。
(TTL电平:高低电平,0-5V。0V为0,5V是1。
232串口电平:全双工(逻辑1:-15V--5V 逻辑0:+3V--+15V))
USB/TTL转接线使用的时候,需要安装驱动程序。驱动程序下载链接或者打包的工程中包含。PL2303TA+最新驱动.zip_免费高速下载|百度网盘-分享无限制
串口0的类是Serial;
串口1的类是Serial1;
串口1的类是Serial2;
串口1的类是Serial3。
使用串口0、串口1分别和串口调试助手链接测试,一秒钟给串口调试助手发送一次字符串数据。
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()
{
//串口开启-波特率9600
Serial.begin(9600); //串口0,USB口连电脑
Serial1.begin(9600); //串口1
Serial2.begin(9600); //串口2
Serial3.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( );
//
}
}
PC端使用串口调试助手给单片机串口1发送字符串,单片机根据串口1接收不同的字符串对IO口进行高低电平控制。
串口调试助手给单片机串口1发送字符串。
①发送'a'、IO输出高电平。单片机串口0,给串口调试助手发送单片机串口1接收到的字符串。
②发送‘b’、IO输出低电平。单片机串口0,给串口调试助手发送单片机串口1接收到的字符串。
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);
//串口开启-波特率9600
Serial.begin(9600); //串口0,USB口连电脑
Serial1.begin(9600); //串口1
Serial2.begin(9600); //串口2
Serial3.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( );
//
}
}
IO输出打开
IO输出关闭
当串口接收缓冲区有数据时自动触发该事件。串口0中断事件serialEvent()。
Arduino MEGA开发板:
串口1中断事件serialEvent1()。
串口2中断事件serialEvent2()。
串口3中断事件serialEvent3()。
实现功能:
给串口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;
}
}
}
①发送的字符串第一个字符为'$'、结束字符为'#',才可以正常的发送和接收。
②串口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);
//串口开启-波特率9600
Serial.begin(9600); //串口0,USB口连电脑
Serial1.begin(9600); //串口1
Serial2.begin(9600); //串口2
Serial3.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;
}
}
}
测试