问题描述
我用手动设置而不是串行库配置了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 (将#修改为@)