试图从串行端口检索数据但程序卡在 getchar
Trying to retrieve data from a serial port but program is stuck at getchar
我正在使用嵌入式系统将数据从 25 个传感器发送到我计算机上的 putty 终端。效果很好。
我想向嵌入式系统添加从终端读取功能(这样我就可以发送命令)。所以我尝试使用 getchar() 来读取我在 putty 终端上写的任何内容。首先,我只想获取字符并将字符打印回腻子上。它有点工作,但我的传感器数据应该每 500 毫秒打印一次,直到我在腻子中键入一个字符后才会打印。就好像我的代码卡在 getchar() 上并卡在 while 循环中,直到 getchar() 读取了一些东西。
这是我在 int main() 中的永远循环。我不分享其余部分,因为它不是真正需要的并且太笨重(它只是初始化模块)。在这个循环中,我正在读取一个传感器,尝试从 putty 读取数据,写入 putty,然后开始我的下一次扫描:
for(;;)
{
CapSense_ProcessAllWidgets(); // Process all widgets
CapSense_RunTuner(); // To sync with Tuner application
read_sensor(curr_elem); //read curr_elem
(curr_elem < RX4_TX4)?(curr_elem++):(curr_elem = 0, touchpad_readings_flag++);
// Here is the part to read I added which blocks until I type in something.
// If I remove this if and all of what's in it, I print to putty every 500ms
if(touchpad_readings_flag)
{
char received_char = getchar();
if (received_char) //if something was returned, received_char != 0
{
printf("%c", received_char);
}
}
//Here I write to putty. works fine when I remove getchar()
if (print_counter_flag && touchpad_readings_flag)
{
print_counter_flag = 0;
touchpad_readings_flag = 0;
for (int i = 0; i < 25; i++)
{
printf("\n");
printf("%c", 97 + i);
printf("%c", val[i] >> 8);
printf("%c", val[i] & 0x00ff); // For raw counts
printf("\r");
}
}
/* Start next scan */
CapSense_UpdateAllBaselines();
CapSense_ScanAllWidgets();
}
显然,您的 getchar()
调用正在阻塞,除非有要检索的输入数据。
another article on different SE board.
给出了一种改变这种行为的解决方案
另请注意,getchar()
是 getc()
的包装器,作用于 stdin
,如 this site1 所述.
对于 getc()
,您可以找到进一步的讨论。
在 中指出,一些重要的实现甚至会等待换行符,直到将输入传递给您的函数。我认为这取决于您实际使用的嵌入式系统的标准 libraries/kind - 请查看您的工具链供应商的文档。2
1
我没有查找规范来源,这只是我的第一个 google 命中。
2
该问题没有指定嵌入式系统的类型,因此需要一个通用的答案,而不是讨论特定的 target/toolchain 组合,IMO。
我正在使用嵌入式系统将数据从 25 个传感器发送到我计算机上的 putty 终端。效果很好。
我想向嵌入式系统添加从终端读取功能(这样我就可以发送命令)。所以我尝试使用 getchar() 来读取我在 putty 终端上写的任何内容。首先,我只想获取字符并将字符打印回腻子上。它有点工作,但我的传感器数据应该每 500 毫秒打印一次,直到我在腻子中键入一个字符后才会打印。就好像我的代码卡在 getchar() 上并卡在 while 循环中,直到 getchar() 读取了一些东西。
这是我在 int main() 中的永远循环。我不分享其余部分,因为它不是真正需要的并且太笨重(它只是初始化模块)。在这个循环中,我正在读取一个传感器,尝试从 putty 读取数据,写入 putty,然后开始我的下一次扫描:
for(;;)
{
CapSense_ProcessAllWidgets(); // Process all widgets
CapSense_RunTuner(); // To sync with Tuner application
read_sensor(curr_elem); //read curr_elem
(curr_elem < RX4_TX4)?(curr_elem++):(curr_elem = 0, touchpad_readings_flag++);
// Here is the part to read I added which blocks until I type in something.
// If I remove this if and all of what's in it, I print to putty every 500ms
if(touchpad_readings_flag)
{
char received_char = getchar();
if (received_char) //if something was returned, received_char != 0
{
printf("%c", received_char);
}
}
//Here I write to putty. works fine when I remove getchar()
if (print_counter_flag && touchpad_readings_flag)
{
print_counter_flag = 0;
touchpad_readings_flag = 0;
for (int i = 0; i < 25; i++)
{
printf("\n");
printf("%c", 97 + i);
printf("%c", val[i] >> 8);
printf("%c", val[i] & 0x00ff); // For raw counts
printf("\r");
}
}
/* Start next scan */
CapSense_UpdateAllBaselines();
CapSense_ScanAllWidgets();
}
显然,您的 getchar()
调用正在阻塞,除非有要检索的输入数据。
another article on different SE board.
另请注意,getchar()
是 getc()
的包装器,作用于 stdin
,如 this site1 所述.
对于 getc()
,您可以找到进一步的讨论。
在
1 我没有查找规范来源,这只是我的第一个 google 命中。
2 该问题没有指定嵌入式系统的类型,因此需要一个通用的答案,而不是讨论特定的 target/toolchain 组合,IMO。