如何解决手动设置时Arduino uno串行传输错误在115200
我用手动设置而不是串行库配置了arduino UNO的串行端口。下面是代码
#include <avr/interrupt.h>
#include <avr/io.h>
#include <SoftwareSerial.h>
#define BAUDRATE 115200
#define BAUD_PRESCALLER (((16000000UL / (BAUDRATE * 16UL))) - 1)
//////////////////////////////ch1 signals////////////////////////////////
#define rx1Pin 4 // PD4
#define tx1Pin 3 // PD3
// set up a new serial port
SoftwareSerial mySerial1 = SoftwareSerial(rx1Pin,tx1Pin);
void uart_transmit (unsigned char data)
{
while(!(UCSR0A & (1<<UDRE0)));
UDR0 = data;
}
void mega_init()
{
UCSR0C|=(1<<UCSZ00)|(1<<UCSZ01);// 8bit transmission(UCSZ02 in B register); also select asynchronous mode,1 stop bit
UBRR0H=(uint8_t)(BAUD_PRESCALLER>>8);
UBRR0L=(uint8_t)BAUD_PRESCALLER;
UCSR0B|=(1<<RXEN0)|(1<<TXEN0)|(1 << RXCIE0);// enbale reciever and transmitter
}
void setup() {
// put your setup code here,to run once:
// Open serial communications and wait for port to open:
//Serial.begin(115200);
// define pin modes for tx,rx:
pinMode(rx1Pin,INPUT);
pinMode(tx1Pin,OUTPUT);
pinMode(13,OUTPUT);
//mySerial1.begin(38400);
mySerial1.begin(115200);
mySerial1.println("Hello,Software Seri");
// Serial.println("Hello,Hardware Serial Working");
mega_init();
// Turn on the transmission,reception,and Receive interrupt
sei();// enable global interrupt
//interrupts();
}
void loop() {
// put your main code here,to run repeatedly:
// if (Serial.available())
// mySerial1.write(Serial.read());
digitalWrite(13,HIGH);
delay(2000);
digitalWrite(13,LOW);
delay(2000);
uart_transmit('A');
}
ISR(USART_RX_vect)
{
digitalWrite(13,HIGH);
mySerial1.write(UDR0);// read the received data byte in temp
}
实际上,我需要将在HW UART上接收的数据传输到SW UART。我分别检查了HW UART和SW UART的发送和接收,并且工作正常。数据是在10kHz处采样的1000个字节的流,并在HW UART处接收并立即传输到SW UART。
当我以115200bps的速率将数据从硬件UART传输到软件UART时,会发生数据丢失。丢失可能是由于在HW UART上轮询串行数据造成的。
因此,我决定使用中断在HW UART处接收数据,并在ISR处发送至SW UART。因此,我将寄存器配置为115200bps。但是现在arduino无法通过硬件UART以115200bps的速率发送任何数据,但是相同的代码可以在9600bps的速率下工作。
我已经分别检查了arduino以115200bps的传输率和接收率,但是无法正常工作。
为什么HW UART在115200上具有串行库而不在没有库的手动配置下工作?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。