Arduino Leonardo串口转发-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5134|回复: 0

Arduino Leonardo串口转发

[复制链接]
发表于 2018-8-12 19:54 | 显示全部楼层 |阅读模式
本帖最后由 希岩 于 2020-5-28 13:07 编辑

    Arduino Leonardo上可以使用两个串口,一个是USB虚拟串口,一个是硬件串口1,这两个串口没什么联系。那么,如果我想把Leonardo作为一个像UNO上的16u2一样的功能怎么办?    那是可以用leonardo做数据转发的,通过USB发过来的数据,转发给串口,这样就可以把leonardo做成一个串口了。当然这是杀鸡用牛刀,但如果你身边刚好缺个串口怎么办?那就可以这么做。
   本例程写的有些简单了,用的中断太少,不知道到高速会不会有问题。此外,不知道如何获得虚拟串口的波特率,这样导致一个问题:用串口调试助手设置波特率时,硬件串口的波特率无法跟着改变。如果通过USB获得了波特率信息,那么电脑上设置波特率就会同时改变虚拟串口和串口1的波特率。下面是一个简单的实现过程,用于学习。
图片是测试通过的结果。


[mw_shl_code=arduino,true]/*********************************************
  功能:USB虚拟串口转发
  设计:凌晨七點半
  日期:2018.8.12
  备注:仅用于学习,未经作者许可不可用于商业用途。
**********************************************/
#define  BAUD 9600     //这里可以修改波特率
//---------------------------------------------------
//接收中断函数
ISR(USART1_RX_vect)                    //适合leonardo
{
   Serial.print((char)UDR1);   //通过USB虚拟串口打印出去
}
//-------------------------------------------------
void RegisterInitUart(void)
{
  //bitSet(UCSR1A,U2X0);
  bitSet(UCSR1B,RXCIE1);                    //允许接收完成中断//
  bitSet(UCSR1B,RXEN1);                     //开启接收功能//
  bitSet(UCSR1B,TXEN1);                     //开启发送功能//
  bitSet(UCSR1C,UCSZ11);
  bitSet(UCSR1C,UCSZ10);                    //
  UBRR1=(F_CPU/16/BAUD-1);                  //波特率小于38400
}
// the setup routine runs once when you press reset:
void setup()
{
  RegisterInitUart();
}
// the loop routine runs over and over again forever:
void loop()
{
while (Serial.available())
{
  while( !( UCSR1A & (1<<UDRE1)) ) ;//等待发送缓冲器为空
  UDR1=Serial.read();               //转发
}
}[/mw_shl_code]



2018-08-12_174508.png
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 09:37 , Processed in 0.074239 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表