- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在尝试读取完整的字符串时遇到了一些问题和奇怪的行为。我正在使用配备 atxmega32a4u 的自制演示板,基本上我想做的是通过串行通信设置一个参数(输出电压设定点),而 MCU 做他的事情(控制降压转换器并通过串行发送回一些数据为电压和电流)。让我们看一下代码:这里我们有主要功能
int main(void)
{
osc_init();
PORTC_OUTSET = PIN7_bm; //Let's make PC7 as TX
PORTC_DIRSET = PIN7_bm; //TX pin as output
PORTC_OUTCLR = PIN6_bm;
PORTC_DIRCLR = PIN6_bm; //PC6 as RX
adc_init();
timer_init();
timer1_init(); //init all the peripheral
Serial_init();
stdout = stdin = &usart_str;
char l[100];
while (1)
{
if(!((USARTC1_STATUS & USART_RXCIF_bm)==0))
{
printf("**MAIN**\n");
uart_getstring(l);
printf("**DIGITATO %s **\n ",l);
}
printf("tensione: %f V corrente: %f A\n",v_bat,cur);
}
}
正如您在外部 while 循环中看到的那样,我只是使用 printf 函数发回数据(它工作得很好,并为我提供了良好的格式化字符串,以便在像 arduino ide 那样的串行监视器中显示)。嵌套循环在发现 USART_RXCIF 标志已设置时开始,这意味着传入缓冲区正在等待读取。然后它调用我们这里的 uart_getstring() 函数:
void uart_getstring(char* line)
{
int z=0;
while( !(USARTC1_STATUS & USART_RXCIF_bm) ); //Wait until data has been received.
char data='a';
while((data!='\r')){
while( !(USARTC1_STATUS & USART_RXCIF_bm) );
data = USARTC1_DATA; //Temporarly store received data
printf("**GOT** %d carattere %c \n",z,data);
line[z] = data;
z++;
}
line[z]='\0';
}
请注意,所有控制内容都是在 ISR 函数中完成的,串行是在主循环中完成的,没有 usart 中断。但是我也尝试禁用所有其他进程并单独运行主要功能但遇到了同样的问题
所以我用 arduino ide 的串行监视器尝试了这个,它允许我向开发板发送命令并接收回复。发生的事情很棘手,如果我只发送 1 或 2 个字符的字符串,它就可以正常工作!但是,如果我发送一个更长的字符串,它就会失败,它只会将字符串发回给我,因为它只有 2 个字符。让我们看一些例子:
>> a
<<
**MAIN**
**GOT** 0 carattere a
**GOT** 1 carattere
**DIGITATO a **
>> aa
<<
**MAIN**
**GOT** 0 carattere a
**GOT** 1 carattere a
**GOT** 2 carattere
**DIGITATO aa **
and then if i send something longer it fails
>> fail
<<
**MAIN**
**GOT** 0 carattere f
**GOT** 1 carattere a
**GOT** 2 carattere
**DIGITATO fa **
我也通过 python 脚本尝试过,也只是使用 screen 命令,但结果是一样的。任何帮助,将不胜感激。非常感谢
最佳答案
共享接收缓冲区不是您的问题。出现这个问题,是因为
的执行时间printf("**GOT** %d carattere %c \n",z,data);
阻塞代码的时间太长,而字符串的其余部分正在由终端发送。 XMEGA 接收缓冲区由一个两级 FIFO 组成。
让我们看一下您尝试发送“失败”的情况。
while((data!='\r')){
// This blocks until the first char 'f' is received, which is OK.
while( !(USARTC1_STATUS & USART_RXCIF_bm) );
// At this point, 'f' is located in the DATA buffer.
// The reception of the next char 'a' immediately starts next and is handled
// by the UART receiver hardware.
data = USARTC1_DATA; //Temporarly store received data
// You just cleared the DATA buffer by reading it, so there is room for 'a'
// after it has been received completely.
// printf() blocks the code for a very long time
printf("**GOT** %d carattere %c \n",z,data);
// While you sent data using printf(), the terminal program sent the remaining
// characters 'i' and 'l'. However, because DATA was already holding 'a' and
// it wasn't cleared in between, the other chars got lost.
line[z] = data;
z++;
}
我希望这能说明问题。
关于c - AVR Xmega USART 读取完整字符串时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52518638/
我有 3 个按钮,每次按下或释放时都会生成中断,我遇到的问题是,我需要区分真正发生的情况(真正发生或按下按钮),这是我的代码: .................. ISR(PORTA_INT0_v
我正在尝试在 xmega 中制作一个简单的开/关开关。例如,如果我按一次,它应该显示 good 如果我再按一次,它应该显示 bad 等等.. 我知道如何在 Arduino 中进行按钮去抖,但我真的不知
使用下面的测试代码,我尝试使用 中的 simulator 通过 xmega128a3u 的 USART 发送数据Atmel Studio. 观察 I/O 查看数据寄存器从未设置,即使我正在设置它。是我
我正在使用 Xmega384C3,我想做的就是将信号发送到输出端口并在输入端口读取它。我将 PORTC 设置为输出端口,并将 PORTA 设置为输入端口。每个端口上的相应引脚短接在一起(PortA 引
我在尝试读取完整的字符串时遇到了一些问题和奇怪的行为。我正在使用配备 atxmega32a4u 的自制演示板,基本上我想做的是通过串行通信设置一个参数(输出电压设定点),而 MCU 做他的事情(控制降
我是在 Atmel studio 环境中开发嵌入式系统的新手,我使用 Atxmega128a1 和 32MHz 系统时钟。我试图在每次定时器中断溢出(0.05s)时通过RS232模块向PC发送一些字符
我正在尝试从 ATxMega128a1 读取输入,然后将其显示在我的 super 终端上。 8 位输入(4 个低位、4 个高位、LSB 和 MSB)。在端口引脚 6 上安装了一个按钮。 我已经编写了代
在avr Xmega设备中,只有两个IO口中断 vector INT0和INT1。 我有三个开关,应该生成三个中断。我已经使用 INT0 为第一个开关编写了中断代码。现在,我可以使用 INT1 编写第
我在以 AVR 为目标的 C 中遇到毫秒延迟循环的问题。我在从 Ubuntu 存储库获得的 Linux 上使用 avr-gcc 4.7.0,我也有尝试了新编译的 4.7.2。目标硬件是 XMEGA12
因此,我在设置 SPI 并使其与 LSM330 设备一起工作以读取加速度计数据时遇到了困难。我只是设置 SPI 系统,并尝试使用它来读取 WHO_AM_I_A 寄存器以确认它正在工作,并且我返回的只是
使用 Atmel Studio 6.2.1563,为 ATXMEGA64A3U 创建了一个 GCC C++ 可执行版本。设置定时器 TCC1 每 1 毫秒产生一次溢出中断。但是编译器似乎忽略了 ISR
我是一名优秀的程序员,十分优秀!