本帖最后由 希岩 于 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]
|